1. 概述
Nacos 阿里巴巴推出来的开源项目,是更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
Nacos 致力于发现、配置和管理微服务,并提供简单易用的特性集,能够快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 更敏捷和容易地构建、交付和管理微服务平台,构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施
2. 注册中心
同样作为注册中心,相对于微服务来说,使用Nacos和使用Eureka并没有太大区别。主要差异在于:依赖不同以及服务地址不同。
2.1. 入门案例
2.1.1. 服务端配置
在父工程导入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.6.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
2.1.2. 客户端配置
- 导入依赖,注释掉eureka依赖
- 修改配置,注释掉eureka地址
spring: datasource: url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver cloud: nacos: server-addr: localhost:8848 # nacos服务地址 discovery: cluster-name: HZ # 配置集群名称,也就是机房位置 application: name: userService # eureka的服务名称 #eureka: # client: # service-url: # eureka的地址信息 # defaultZone: http://127.0.0.1:10086/eureka
<!-- nacos客户端依赖包 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
2.1.3. 重新启动
2.1.4. 集群
Nacos服务分级存储模型
- 一级是服务,例如userservice
- 二级是集群,例如杭州或上海
- 三级是实例,例如杭州机房的某台部署了userservice的服务器
NacosRule负载均衡策略
- 优先选择同集群服务实例列表
- 本地集群找不到提供者,才去其它集群寻找,并且会报警告
- 确定了可用实例列表后,再采用随机负载均衡挑选实例
配置负载均衡规则
userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
2.1.5. 权重配置
实际部署中会出现这样的场景:
性能好的服务器配置更高的权重
权重设置为0.01-0.02,可放少量用户访问服务器进行测试
权重设置为0,服务器不会被访问,可用于服务器升级场景
2.2. 两者区别
区别:
- Nacos对临时实例采用心跳模式(主动心跳上报),对永久实例采取询问模式;Eureka只有心跳模式。
- Nacos临时实例不健康会被删除,永久实例永不会被删除。
- Nacos对消费者会拉取和主动推送消息,保证服务列表的及时更新;Eureka只会拉取。
- Nacos集群默认采用AP模式。当集群存在永久实例则切换为CP模式;Eureka只有AP模式。
3. 配置中心
3.1. 统一配置管理
Nacos除了可以做注册中心,同样可以做配置管理来使用。
当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。
Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
3.2. 入门案例
3.2.1. 在nacos添加配置
3.2.2. 本地拉取配置
微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
但如果尚未读取application.yml,又如何得知nacos地址呢?
因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:
- 添加依赖
<!--nacos配置管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
- 添加bootstrap.yaml
spring: application: name: userservice # 服务名称 profiles: active: dev #开发环境,这里是dev cloud: nacos: server-addr: localhost:8848 # Nacos地址 config: file-extension: yaml # 文件后缀名
- 读取nacos配置
@Value("${pattern.dateformat}") private String dateformat;
3.3. 热更新配置
修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。
通常将一些关键参数,或需要运行时调整的参数放到nacos配置中心,其余配置放本地
要实现配置热更新,可以使用两种方式:
3.3.1. 方式一
在@Value注入的变量所在类上添加注解@RefreshScope:
3.3.2. 方式二
使用@ConfigurationProperties注解代替@Value注解。(推荐)
在user-service服务中,添加一个类,读取patterrn.dateformat属性:
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @Data @ConfigurationProperties(prefix = "pattern") public class PatternProperties { private String dateformat; } =============================================================== @Autowired private PatternProperties patternProperties; @GetMapping("now") public String now(){ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(patternProperties.getDateformat()); return LocalDateTime.now().format(formatter); }
3.4. 多环境共享配置
设计开发环境分为多种,如本地环境,dev开发环境,test测试环境,pre灰度环境(预发布),prod生产环境等。不同配置会被不同环境所读取。同一配置可能被多个环境共享。
3.4.1. 添加一个环境共享配置
3.4.2. 运行两个UserApplication,使用不同的profile
指定userService1运行环境为dev,userService2运行环境为test,
执行效果:
userService1能读到userService-dev.yaml和userService.yaml的配置
userService2仅能读到userService.yaml的配置
结论:
微服务会从nacos读取的配置文件:
[服务名]-[spring.profile.active].yaml,环境配置
[服务名].yaml,默认配置,多环境共享
3.5. 配置优先级
[服务名]-[环境].yaml >[服务名].yaml > 本地配置
体现了配置中心的优先级