SpringCloud——Nacos
1、核心功能:
-
服务注册与发现:
服务实例可动态注入到Nacos中,消费者通过服务名发现可用实例。
// 启用EnableDiscoveryClient注解启用Nacos
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);}
}
-
动态配置管理:
支持配置的集中存储、版本控制及即时更新,无需重启服务。
-
服务健康监测:
通过心跳机制和主动探测(如HTTP/TCP)监控实例健康状态,自动剔除异常实例。
-
服务治理:
支持动态路由、权重分配、灰度发布等流量管理功能。
2、如何实现服务健康检查?
旧版本:
- 基于HTTP短连接
- 客户端默认每5秒发送带有对应模块信息的心跳包,服务端每5秒检查一次心跳
- 超过15秒标记为不健康实例,超过30秒从注册表中剔除该实例
- 有心跳但未注册的实例会自动注册
- 支持自定义主动探测策略,返回码为200视为健康
新版本:
- 基于gRPC长连接
- gRPC长连接内置心跳机制,连接断开即剔除实例
- 服务端每3秒检查一次连接活跃度
- 若连接20s无数据交互,服务端主动探测客户端,失败则剔除
3、Nacos服务的注册流程:
手动注册:
- 客户端初始化:应用启动时通过NamingFactory初始化NamingService实例
- 注册实例:定义Intance,并初始化服务名、IP、端口、元数据等信息,调用NamingService实例的registerIntance()方法进行注册
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;public class ManualRegistration {public static void main(String[] args) throws NacosException {// 1. 初始化客户端NamingService naming = NacosFactory.createNamingService("localhost:8848");// 2. 注册实例Instance instance = new Instance();instance.setIp("192.168.1.100");instance.setPort(8080);instance.setServiceName("order-service");naming.registerInstance("order-service", instance);System.out.println("手动注册成功!");// 3. 下线示例(可选)// naming.deregisterInstance("order-service", "192.168.1.100", 8080);}
}
自动注册:
- 依赖引入:Spring Boot 项目通过
spring-cloud-starter-alibaba-nacos-discovery
自动注册服务。 - 配置服务信息:在
application.yml
中指定 Nacos 地址和服务名。 - 监听事件注册:Spring 容器启动时,
NacosAutoServiceRegistration
监听WebServerInitializedEvent
事件,自动调用NacosServiceRegistry
完成注册
// 将微服务模块注册到Nacos中,名称一般为启动类名称
// Nacos会自动获取当前服务的IP地址,并通过server.port获取端口,默认8080
// 对于非web应用,可自己在discovery下方定义IP和端口
spring:application:name: user-service # 这个名称会作为服务标识注册到 Nacoscloud:nacos:discovery:server-addr: localhost:8848 # 对应nacos组件的服务地址ephemeral: true # 默认为true,即临时实例# IP:# port:
注册的实例种类:
特性 | 临时实例 | 非临时实例 |
---|---|---|
生命周期 | 依赖客户端心跳,超时自动删除(默认心跳间隔5秒,15秒标记不健康,30秒剔除) | 不依赖心跳,需手动注销,即使进程终止仍保留在注册表中 |
存储方式 | 仅内存缓存,不持久化 | 持久化到磁盘,重启Nacos后仍存在 |
健康检查 | 客户端主动上报心跳(Client模式) | 服务端主动探测(TCP/HTTP/MySQL协议,Server模式) |
默认配置 | ephemeral=true (Spring Cloud默认临时实例) | 需显式配置ephemeral=false |
适用场景 | 动态扩缩容(如Kubernetes Pod) | 基础设施服务(如MySQL、Redis)或需长期监控的实例 |