微服务架构下每个服务通常需要独立的数据库实例或者共享数据库的不同 schema,快速搭建稳定的MySQL环境并完成服务注册配置,能够大幅降低项目初始化的时间成本,同时保证环境的一致性。

基于Docker快速搭建MySQL环境
使用Docker部署MySQL可以避免不同机器上环境依赖不一致的问题,同时能够快速启动和销毁实例,适合微服务场景下的快速环境搭建。
拉取MySQL镜像并启动实例
首先拉取官方MySQL镜像,这里选择稳定的8.0版本:
# 拉取MySQL 8.0镜像 docker pull mysql:8.0 # 启动MySQL容器,设置root密码、端口映射和数据持久化 docker run -d --name microservice-mysql -p 3306:3306 -v /data/mysql/data:/var/lib/mysql -v /data/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root123456 mysql:8.0
上述命令中,-p参数将容器内3306端口映射到宿主机3306端口,-v参数实现数据和配置文件的持久化,避免容器删除后数据丢失,-e参数设置root用户的密码。
初始化数据库和账号
进入容器内部创建微服务使用的数据库和专属账号:
# 进入MySQL容器 docker exec -it microservice-mysql bash # 登录MySQL mysql -u root -p # 输入之前设置的密码root123456 # 创建微服务使用的数据库 CREATE DATABASE microservice_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 创建专属用户并授权 CREATE USER 'micro_user'@'%' IDENTIFIED BY 'micro123456'; GRANT ALL PRIVILEGES ON microservice_db.* TO 'micro_user'@'%'; FLUSH PRIVILEGES;
MySQL服务注册到注册中心
微服务架构中通常会使用服务注册中心(如Nacos、Eureka)来管理所有服务的地址,将MySQL的服务信息注册到注册中心,能够让微服务自动发现数据库地址,避免硬编码配置。
基于Nacos实现MySQL服务注册
这里以Nacos为例,通过自定义服务注册逻辑将MySQL实例信息注册到Nacos,首先添加相关依赖:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.2.3</version>
</dependency>
编写注册代码,将MySQL的地址、端口等信息作为服务实例注册到Nacos:
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import java.util.HashMap;
import java.util.Map;
public class MysqlServiceRegister {
public static void main(String[] args) throws NacosException {
// 连接Nacos服务,地址替换为实际的Nacos地址
NamingService namingService = NamingFactory.createNamingService("127.0.0.1:8848");
// 创建MySQL服务实例
Instance instance = new Instance();
instance.setIp("127.0.0.1");
instance.setPort(3306);
instance.setServiceName("mysql-service");
// 设置元数据,存储数据库名、用户名等信息
Map<String, String> metadata = new HashMap<>();
metadata.put("database", "microservice_db");
metadata.put("username", "micro_user");
metadata.put("password", "micro123456");
instance.setMetadata(metadata);
// 注册服务
namingService.registerInstance("mysql-service", instance);
System.out.println("MySQL服务注册成功");
}
}
微服务获取MySQL配置
微服务启动时从Nacos获取MySQL服务信息,动态构建数据源配置,以Spring Boot项目为例:
import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;
import java.util.List;
@Configuration
public class DataSourceConfig {
@NacosInjected
private NamingService namingService;
@Bean
public DataSource dataSource() throws Exception {
// 从Nacos获取mysql-service的实例列表
List<Instance> instances = namingService.getAllInstances("mysql-service");
if (instances.isEmpty()) {
throw new RuntimeException("未找到可用的MySQL服务实例");
}
Instance mysqlInstance = instances.get(0);
String ip = mysqlInstance.getIp();
int port = mysqlInstance.getPort();
String database = mysqlInstance.getMetadata().get("database");
String username = mysqlInstance.getMetadata().get("username");
String password = mysqlInstance.getMetadata().get("password");
// 构建数据源
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(String.format("jdbc:mysql://%s:%d/%s?useUnicode=true&characterEncoding=utf8&useSSL=false", ip, port, database));
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
return dataSource;
}
}
常见问题排查
- MySQL容器启动后无法连接:检查端口映射是否正确,防火墙是否开放3306端口,密码是否输入正确
- 服务注册失败:检查Nacos地址是否正确,网络是否可达,服务名是否符合规范
- 微服务获取配置为空:检查服务的元数据是否正确设置,Nacos中服务实例是否处于健康状态
通过上述步骤,就可以在微服务架构中快速完成MySQL环境搭建,同时实现服务注册配置,后续如果需要扩容MySQL实例,只需要启动新的容器并注册到注册中心,微服务就能自动发现新的实例,适配架构的扩展需求。