微服务Nacos服务注册中心
从今天开始微服务的搭建就正式开始了。当前推荐使用Nacos作为服务注册中心,替代已进入维护模式的Eureka。
Nacos简介
Nacos是阿里开源的服务注册与发现中心,同时支持配置中心功能,提供了更强大的特性和更好的性能。相比Eureka,Nacos具有以下优势:
- 支持CP和AP模式切换
- 内置配置中心功能
- 更丰富的监控和管理功能
- 更高的性能和扩展性
- 支持多种服务发现协议(REST、gRPC、DNS)
部署Nacos服务端
1. 下载Nacos二进制包
Nacos服务端需要通过官方提供的二进制包部署,不建议作为Spring Boot应用程序直接构建。
下载地址:https://github.com/alibaba/nacos/releases
选择版本:推荐使用最新稳定版本,例如:nacos-server-2.2.3.zip (Windows) 或 nacos-server-2.2.3.tar.gz (Linux)
2. 解压并启动Nacos服务
Windows环境
# 解压下载的zip文件
# 进入nacos/bin目录
cmd startup.cmd -m standaloneLinux/Mac环境
# 解压下载的tar.gz文件
tar -xzf nacos-server-2.2.3.tar.gz
# 进入nacos/bin目录
cd nacos/bin
# 启动Nacos(单机模式)
sh startup.sh -m standalone3. 验证Nacos服务
启动成功后,访问Nacos控制台:http://localhost:8848/nacos
默认用户名/密码:nacos/nacos
4. Nacos服务配置(可选)
Nacos支持通过配置文件进行个性化设置,配置文件位于nacos/conf/application.properties:
修改端口示例:
server.port=8848使用MySQL持久化示例:
# 数据源配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root注意:使用MySQL持久化时,需要先创建nacos数据库,并执行nacos/conf/nacos-mysql.sql初始化脚本。
搭建Nacos集群
1. 集群架构
Nacos集群推荐使用至少3个节点,采用主从复制模式,通过Raft协议保证数据一致性。生产环境建议使用5个节点以获得更好的容错能力。
2. 准备工作
环境要求:
- JDK 1.8+ 或 OpenJDK 11+
- Maven 3.2+(仅源码编译需要)
- MySQL 5.7+(推荐使用,用于持久化配置和服务元数据)
下载Nacos:
为每个节点下载相同版本的Nacos二进制包
解压到不同目录,例如:
/opt/nacos/nacos-node1 /opt/nacos/nacos-node2 /opt/nacos/nacos-node3
3. 配置集群
3.1 修改集群配置文件
在每个Nacos节点的conf目录下,修改cluster.conf文件,添加所有集群节点的信息:
# ip:port
192.168.1.101:8848
192.168.1.102:8848
192.168.1.103:8848注意:确保每个节点都使用相同的cluster.conf配置。
3.2 配置MySQL持久化
在每个节点的conf/application.properties文件中,配置MySQL数据源:
# 启用MySQL数据源
spring.datasource.platform=mysql
# 数据库数量
db.num=1
# 数据库连接信息
db.url.0=jdbc:mysql://192.168.1.100:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root3.3 修改节点端口(可选)
如果在同一台机器上部署多个Nacos节点,需要修改每个节点的端口:
在conf/application.properties文件中修改:
# 节点1
server.port=8848
# 节点2
server.port=8849
# 节点3
server.port=88504. 初始化数据库
- 在MySQL中创建名为
nacos的数据库 - 执行
conf/nacos-mysql.sql脚本初始化数据库表结构
5. 启动集群节点
分别在每个节点的bin目录下执行启动命令:
Linux/Mac环境
# 节点1
cd /opt/nacos/nacos-node1/bin
sh startup.sh
# 节点2
cd /opt/nacos/nacos-node2/bin
sh startup.sh
# 节点3
cd /opt/nacos/nacos-node3/bin
sh startup.shWindows环境
# 节点1
cd D:\nacos\nacos-node1\bin
cmd startup.cmd
# 节点2
cd D:\nacos\nacos-node2\bin
cmd startup.cmd
# 节点3
cd D:\nacos\nacos-node3\bin
cmd startup.cmd6. 验证集群状态
- 访问任意节点的控制台:http://192.168.1.101:8848/nacos
- 登录后,在左侧菜单选择"集群管理" -> "节点列表",可以看到所有节点的状态
- 健康的节点会显示为"UP"状态
7. 集群注意事项
- 网络要求:确保集群节点之间网络互通,特别是需要开放端口用于Raft选举和数据同步
- 时间同步:所有节点的系统时间必须保持同步,建议使用NTP服务
- 持久化:生产环境必须配置MySQL持久化,避免数据丢失
- 负载均衡:建议在Nacos集群前面部署负载均衡器(如Nginx),提供统一的访问入口
- 备份策略:定期备份MySQL数据库,确保数据安全
创建Nacos客户端
1. 客户端POM配置
<!-- 添加Nacos客户端依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>2. 客户端配置
server:
port: 8080
spring:
application:
name: service-provider
cloud:
nacos:
discovery:
server-addr: peer1:8848,peer2:8849,peer3:8850
group: DEFAULT_GROUP
namespace: public3. 客户端启动类
@EnableDiscoveryClient
@SpringBootApplication
public class ServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderApplication.class, args);
}
}验证Nacos服务
访问Nacos控制台:在浏览器中输入
http://peer1:8848/nacos,默认用户名/密码:nacos/nacos查看服务列表:进入控制台后,点击左侧菜单的"服务管理" -> "服务列表",可以看到已注册的服务
查看集群节点:点击左侧菜单的"集群管理" -> "节点列表",可以看到集群中的所有节点
验证服务发现:启动客户端服务后,在Nacos控制台的服务列表中可以看到该服务已成功注册
Nacos与Eureka的主要区别
| 特性 | Nacos | Eureka |
|---|---|---|
| 部署方式 | 单节点/集群 | 单节点/集群 |
| 一致性协议 | Raft | AP(最终一致性) |
| 配置中心 | 支持 | 不支持 |
| 动态配置 | 支持 | 不支持 |
| 服务健康检查 | TCP/HTTP/MYSQL/自定义 | 客户端心跳 |
| 性能 | 更高 | 一般 |
| 扩展性 | 更好 | 一般 |
| 社区活跃度 | 活跃 | 维护模式 |
注意事项
- Nacos默认使用8848端口,确保该端口未被占用
- 集群部署时至少需要3个节点以保证高可用
- 生产环境建议使用MySQL作为持久化存储
- 可以通过namespace和group对服务进行逻辑隔离
- Nacos支持配置中心功能,可以在同一个实例中同时使用服务注册和配置管理功能