Nacos注册中心
nacos是阿里的注册中心
- 引入父工程依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
- 注释原来eureka的依赖
- 添加nacos客户端依赖
<!-- nacos客户端依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
Nacos服务分级存储模型
服务调用尽可能选择本地集群的服务,跨集群调用延迟较高,本地集群不可访问时,再去访问其他集群
userserver:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
- 一级:服务,比如:userserver
- 二级:集群,比如:杭州上海
- 三级:实例,比如:杭州集群里部署了userserver的服务器
cloud:
nacos:
server-addr: localhost:8848 #nacos服务地址
discovery:
cluster-name: HZ
加权负载均衡
实例的权重控制
- Nacos控制台可以设置实例的权重值,0~1之间
- 同集群内的多个实例,权重越高被访问的频率越高
- 权重设置为0则完全不会被访问
环境隔离
namespace
相同的环境下才能互相访问,不同环境下就会隔离开,即:每个namespace都有唯一id,不同namespace下的服务不可见
如果不指定namespace,默认在public组里
cloud:
nacos:
discovery:
namespace: df1422b6-b616-4119-834e-b0082825fe02
nacos原理
跟eureka类似,都有心跳检测机制,但是是有区别
- eureka:提供者每隔30s心跳检测一次
- nacos:提供者分为两种:临时实例,非临时实例
- 临时实例采用心跳检测,每隔5s主动发送一次,nacos15s没有收到检测会标记不健康,30s没收到会直接剔除该服务
- 非临时实例由nacos主动询问是否在线,如果有问题,不会剔除,而是标记不健康,等待上线
nacos消费者拉取到服务信息会缓存,如果有消息变更,nacos会主动推送到消费者
总结
Nacos | Eureka | |
服务注册 | 支持 | 支持 |
服务拉取 | 支持,且能缓存 | 支持 |
心跳检测 | 支持,临时实例5s间隔 | 支持,30s间隔 |
主动检测 | nacos会主动向非临时实例检测状态 | 不支持 |
服务推送 | 服务变更时主动推送 | 不支持 |
集群模式 | 默认采用AP方式,当集群中采用非临时实例时,采用CP模式 | 采用AP方式 |
Nacos配置管理
配置统一管理
- 添加nacos配置管理
其中的配置内容不是全部的yaml,而是有热更新需求的内容
- 添加依赖
<!-- nacos配置管理客户端依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 添加bootstrap.yaml文件
在nacos的管理中心的配置需要:
- 文件名:userserver-dev.yaml
- 文件格式:yaml
- 文件内容:xxx
所以bootstrap.yaml中也需要这些
spring:
application:
name: userserver #服务名称
profiles:
active: dev #环境
cloud:
nacos:
server-addr: localhost:8848 #nacos服务地址
config:
file-extension: yaml #文件后缀名
所以现在springboot在加载的时候,会先从bootstrap.yaml中获取文件内容,再通过application.yaml获取内容
配置热更新
有两种实现方式:
- 在需要注入的类上加上:
@RefreshScope
@RefreshScope
public class UserController {
@Autowired
private UserService userService;
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
System.out.println(dateformat);
return userService.queryById(id);
}
}
- 搞一个配置类,用springboot自动装配的特性,自己去yaml中找:pattern:dateformat
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
}
public class UserController {
@Autowired
private PatternProperties patternProperties;
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
System.out.println(patternProperties.getDateformat());
return userService.queryById(id);
}
多环境配置共享
如果不带dev说明没有环境限制,说明是多环境共享的。
多种配置的优先级:
nacos > 本地
环境配置 > 多环境配置
总结:
userserver-dev.yaml > userserver.yaml > idea:application.yaml
服务启动的时候会从nacos中读取两个文件:[服务名]-[环境].yaml 和 [服务名].yaml 例如:usersever-dev.yaml 和 userserver.yaml
如果不带dev说明没有环境限制,说明是多环境共享的。
多种配置的优先级:
nacos > 本地
环境配置 > 多环境配置
总结:
userserver-dev.yaml > userserver.yaml > idea:application.yaml
服务启动的时候会从nacos中读取两个文件:[服务名]-[环境].yaml 和 [服务名].yaml 例如:usersever-dev.yaml 和 userserver.yaml