Spring Cloud 连接 MySQL 实战教程
Spring Cloud 连接 MySQL 实战教程
本文手把手带你搭建一个基于 Spring Boot 3.x + Spring Cloud 2022.x 的微服务工程,并连接 MySQL 8.x 数据库完成一次完整的增删改查。文末附常见坑点与排错思路,照着做即可跑通。
一、前言
在微服务架构里,几乎每个业务服务都要访问数据库。Spring Cloud 本身并不直接提供数据库访问能力,它依赖 Spring Boot 的自动装配 + 数据访问框架(JPA / MyBatis 等) 来完成与 MySQL 的对接。所以「Spring Cloud 连接 MySQL」本质上就是:
Spring Cloud (服务注册/配置中心/网关)
│
└── Spring Boot 子服务
│
├── spring-boot-starter-data-jpa (或 mybatis)
├── mysql-connector-j (驱动)
└── druid-spring-boot-starter (连接池, 可选)
本文以一个 user-service 子服务为例,使用 JPA + Druid 连接池 演示。
二、环境准备
| 组件 | 版本 |
|---|---|
| JDK | 17 |
| Spring Boot | 3.2.x |
| Spring Cloud | 2023.0.x (Leyton) |
| MySQL | 8.0+ |
| Maven | 3.8+ |
先在 MySQL 里建库建表:
CREATE DATABASE `cloud_demo` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `cloud_demo`;
CREATE TABLE `t_user` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` VARCHAR(64) NOT NULL COMMENT '用户名',
`age` INT DEFAULT NULL COMMENT '年龄',
`email` VARCHAR(128) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
INSERT INTO `t_user`(`name`,`age`,`email`) VALUES ('张三', 28, 'zhangsan@demo.com');
三、创建父工程
新建 Maven 父工程 cloud-demo,统一管理版本:
<!-- pom.xml -->
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>cloud-demo</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<properties>
<java.version>17</java.version>
<spring-boot.version>3.2.5</spring-boot.version>
<spring-cloud.version>2023.0.1</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<modules>
<module>user-service</module>
</modules>
</project>
四、创建 user-service 子模块
4.1 引入依赖
<!-- user-service/pom.xml -->
<dependencies>
<!-- Spring Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MySQL 驱动 (Spring Boot 3 已迁移到 mysql-connector-j) -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Druid 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.20</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
版本提示:Spring Boot 3.x 须使用
druid-spring-boot-3-starter,老版本的druid-spring-boot-starter不兼容。
4.2 配置 application.yml
server:
port: 8081
spring:
application:
name: user-service
datasource:
# 注意 Spring Boot 3 中 Druid 的配置前缀是 spring.datasource.druid
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/cloud_demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: your_password
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
stat-view-servlet:
enabled: true
login-username: admin
login-password: admin
jpa:
hibernate:
ddl-auto: none # 生产环境不要用 update
show-sql: true
properties:
hibernate:
format_sql: true
dialect: org.hibernate.dialect.MySQLDialect
安全提醒:
password不要硬编码进代码仓库,生产环境请用 Nacos 配置中心 或环境变量${DB_PASSWORD}注入。
五、编写业务代码
目录结构:
user-service/
└── src/main/java/com/demo/user/
├── UserServiceApplication.java
├── entity/User.java
├── repository/UserRepository.java
├── service/UserService.java
└── controller/UserController.java
5.1 启动类
package com.demo.user;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
5.2 实体类
package com.demo.user.entity;
import jakarta.persistence.*;
import lombok.Data;
@Data
@Entity
@Table(name = "t_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
private String email;
}
Spring Boot 3 把
javax.persistence迁移到了jakarta.persistence,别再用老的包名。
5.3 Repository
package com.demo.user.repository;
import com.demo.user.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByNameLike(String name);
}
5.4 Service
package com.demo.user.service;
import com.demo.user.entity.User;
import com.demo.user.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
public List<User> listAll() {
return userRepository.findAll();
}
public User getById(Long id) {
return userRepository.findById(id).orElse(null);
}
public User save(User user) {
return userRepository.save(user);
}
public void deleteById(Long id) {
userRepository.deleteById(id);
}
}
5.5 Controller
package com.demo.user.controller;
import com.demo.user.entity.User;
import com.demo.user.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping
public List<User> list() {
return userService.listAll();
}
@GetMapping("/{id}")
public User get(@PathVariable Long id) {
return userService.getById(id);
}
@PostMapping
public User create(@RequestBody User user) {
return userService.save(user);
}
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) {
userService.deleteById(id);
}
}
六、启动与验证
- 启动
UserServiceApplication,控制台看到如下日志即连接成功:
HikariPool-1 - Start completed. # 用 Hikari 时
{dataSource-1} inited # 用 Druid 时
- 用 curl 验证:
# 查询全部
curl http://localhost:8081/users
# 新增
curl -X POST http://localhost:8081/users \
-H "Content-Type: application/json" \
-d '{"name":"李四","age":30,"email":"lisi@demo.com"}'
# 查询单个
curl http://localhost:8081/users/1
# 删除
curl -X DELETE http://localhost:8081/users/1
- Druid 监控面板:浏览器访问
http://localhost:8081/druid/,账号密码即 yml 中配置的admin/admin。
七、接入 Spring Cloud(可选进阶)
上面已经能在 Spring Boot 体系下连 MySQL 了。要真正成为 Spring Cloud 微服务,再加两步:
7.1 引入 Nacos 服务发现
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2023.0.1.0</version>
</dependency>
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
7.2 把数据库配置搬到 Nacos 配置中心
引入 spring-cloud-starter-alibaba-nacos-config,在 Nacos 控制台新建 user-service-dev.yaml Data ID,把 spring.datasource 整段挪过去,本地只留 spring.cloud.nacos 引导配置。这样改库密码无需重新发版。
八、常见坑点速查
| 现象 | 原因 | 解决 |
|---|---|---|
Communications link failure |
MySQL 没启动 / 端口不通 / URL 写错 | 确认 telnet localhost 3306 通;检查 url 时区参数 |
Access denied for user 'root' |
用户名密码错 / 没授远程权限 | GRANT ALL ON cloud_demo.* TO 'root'@'%'; |
Public Key Retrieval is not allowed |
MySQL 8 默认认证插件 caching_sha2_password | url 加 allowPublicKeyRetrieval=true |
ClassNotFoundException: com.mysql.cj.jdbc.Driver |
用了老驱动 mysql-connector-java |
Spring Boot 3 改用 com.mysql:mysql-connector-j |
Druid 启动报 spring.datasource.druid 找不到 |
用了不兼容 Boot3 的 druid starter | 换成 druid-spring-boot-3-starter |
ddl-auto=update 把生产表结构改坏 |
JPA 自动建表 | 生产环境一律 none,用 Flyway/Liquibase 管理迁移 |
| 连接池耗尽、接口卡死 | max-active 太小 / 存在连接泄漏 | 看 Druid 监控的 活跃连接数;排查未关闭的事务/慢 SQL |
九、总结
- Spring Cloud 连 MySQL 的核心在 Spring Boot 的 datasource 自动装配,Cloud 只是服务治理外壳。
- 技术栈推荐:Spring Boot 3 + JPA(或 MyBatis-Plus)+ Druid + mysql-connector-j。
- 配置外置到 Nacos 配置中心,敏感信息走环境变量,是微服务的基本修养。
- 生产环境
ddl-auto=none,表结构变更交给 Flyway/Liquibase。 - 善用 Druid 监控面板定位慢 SQL 与连接泄漏。
照着本文走一遍,你就有了一个能连 MySQL、可被 Nacos 注册发现、可对外提供 REST 接口的标准微服务雏形。下一步可以接入 OpenFeign 做服务间调用,或用 Spring Cloud Gateway 统一入口。祝玩得开心 🎉
- 点赞
- 收藏
- 关注作者
评论(0)