目录
在D:\java\nacos\bin处调出cmd窗口(根据电脑中nacos位置决定)
1. 在cloud-demo父工程中添加spring-cloud-alibaba的管理依赖:
2. 注释掉order-service和user-service中原有的eureka依赖。
1. 修改order-service中的application.yml,设置集群为HZ:
2. 在order-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务:
1. 在Nacos控制台可以设置实例的权重值,选中实例后面的编辑按钮
2. 设置权重值0~1之间,测试可以发现10087被访问的频率大大降低
2. 将order-service添加到新的命名空间中,与user-service实现环境隔离
一、Nacos的启动
-
在D:\java\nacos\bin处调出cmd窗口(根据电脑中nacos位置决定)
-
输入Windows命令:
startup.cmd -m standalone
-
回车启动
启动成功,如下图所示
注意:默认Nacos的登录账号和密码均为nacos
二、Nacos注册中心
服务注册到Nacos
1. 在cloud-demo父工程中添加spring-cloud-alibaba的管理依赖:
<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>
2. 注释掉order-service和user-service中原有的eureka依赖。
3. 添加nacos的客户端依赖:
<!--eureka客户端依赖--> <!--<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>--> <!--nacos客户端依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
4. 添加yml配置,配置nacos的服务地址
spring: cloud: nacos: server-addr: localhost:8848 # nacos服务地址
5. 总结
-
Nacos服务搭建
① 下载安装包
② 解压
③ 在bin目录下运行指令
-
Nacos服务注册或发现
① 引入nacos.discovery一脸
② 配置nacos地址spring.cloud.nacos.server-addr
服务集群属性
1. 修改application.yml,添加如下内容:
spring: datasource: url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false username: root password: abc123 driver-class-name: com.mysql.cj.jdbc.Driver application: name: userservice cloud: nacos: server-addr: localhost:8848 # nacos服务地址 discovery: cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州
2. 在Nacos可以看到集群变化:
3. 总结
-
Nacos服务分级存储模型
① 一级是服务,例如userservice
② 二级是集群,例如杭州或上海
③ 三级是实例,例如杭州机房的某台部署了userservice的服务器
-
如何设置实例的集群属性
修改application.yml文件,添加spring.cloud.nacos.discovery.cluster-name属性即可
根据集群负载均衡
1. 修改order-service中的application.yml,设置集群为HZ:
spring: cloud: nacos: server-addr: localhost:8848 # nacos服务端地址 discovery: cluster-name: HZ # 配置集群名称
2. 在order-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务:
优先在同集群中随机访问
user-service: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
3. 注意将user-service的权重都设置为1
4. 总结
① 优先选择同集群服务实例列表
② 本地集群找不到提供者,才去其他集群寻找,并且会报警告
③ 确定了可用实例列表后,在采用随机负载均衡挑选实例
根据权重负载均衡
1. 在Nacos控制台可以设置实例的权重值,选中实例后面的编辑按钮
2. 设置权重值0~1之间,测试可以发现10087被访问的频率大大降低
3. 实例的权重控制
① Nacos控制台可以设置实例的权重值,0~1之间
② 同集群内的多个实例,权重越高被访问的频率越高
③ 权重设置为0,则完全不会被访问(可用于版本升级)
环境隔离
1. 创建命名空间namespace
第一步:
第二步:
创建成功
命名空间ID自动通过UUID方式生成唯一ID
2. 将order-service添加到新的命名空间中,与user-service实现环境隔离
spring: datasource: url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false username: root password: abc123 driver-class-name: com.mysql.cj.jdbc.Driver application: name: orderservice cloud: nacos: server-addr: localhost:8848 discovery: cluster-name: HZ namespace: ee0e6185-2298-4287-9f32-0b42aab86149 # 命名空间ID
3. Nacos环境隔离
① namespace用来做环境隔离
② 每个namespace都有唯一的ID
③ 不同的namespace下的服务不可见
临时实例和非临时实例
服务注册到Nacos时,可以选择注册为临时或非临时实例,通过下面的配置来设置:
spring: application: name: orderservice cloud: nacos: server-addr: localhost:8848 discovery: cluster-name: HZ namespace: ee0e6185-2298-4287-9f32-0b42aab86149 # 命名空间ID ephemeral: false # 设置是否为临时实例
默认,ephemeral的值为true,即默认为临时实例
Nacos与Eureka的异同
1. Nacos与Eureka的共同点
① 都支持服务注册和服务拉取
② 都支持服务提供者心跳方式做健康检测
2. Nacos与Eureka的区别
① Nacos支持服务端主动检测提供者状态;临时实例采用心跳模式,非临时实例采用主动检测模式
② 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
③ Nacos支持服务列表变更的消息推送模式,服务列表更新更加及时
④ Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
统一配置管理
1. Nacos的操作
在Nacos中添加配置信息:
在弹出表单中填写配置信息:
2. 配置读取
配置获取的步骤如下:
① 引入Nacos的配置管理客户端依赖
<!--nacos配置管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
② 在userservice中的resource目录添加一个bootstrap.yml文件,这个文件时引导文件,优先级高于application.yml,即项目启动时先去读取bootstrap.yml文件
spring: application: name: userservice # 服务名称 profiles: active: dev # 开发环境 cloud: nacos: server-addr: localhost:8848 # Nacos地址 config: file-extension: yaml # 文件后缀名
③ 在user-service中将pattern.dateformat这个属性注入到UserController中做测试
@Slf4j @RestController @RequestMapping("/user") public class UserController { /** * 注入nacos中的配置属性 */ @Value("${pattern.dateformat}") private String dateformat; /** * 测试能否读取到Nacos的配置 * * @return 当前时间 */ @GetMapping("/now") public String now() { if (dateformat == null) { return "未能读取到Nacos的配置"; } String now = LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat)); log.info("当前时间为:{}", now); return now; } }
3. 将配置交给Nacos管理的步骤
① 在Nacos中添加配置文件
② 在微服务中引入nacos的config依赖
③ 在微服务中添加bootstrap.yml,配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启 动时去nacos读取那个文件
配置自动刷新
1. 配置方法
Nacos中的配置文件变更后,微服务无需重启就可以感知。不过需要通过下面两种配置实现:
-
方式一:在@Value注入的变量所在类上添加注解@RefreshScope
@Slf4j @RestController @RequestMapping("/user") @RefreshScope public class UserController { @Autowired private UserService userService; /** * 测试能否读取到Nacos的配置 */ @Value("${pattern.dateformat}") private String dateformat; }
-
方式二:使用@ConfigurationProperties注解
@Component @Data @ConfigurationProperties(prefix = "pattern") public class PatternProperties { private String dateformat; }
2. 总结:
Nacos配置更改后,微服务可以实现热更新,方法:
① 通过@Value注解注入,需要结合@RefreshScope来刷新
② 通过@ConfigurationProperties注入,无需@RefreshScope,自动刷新
注意事项:
-
不是所有的配置都适合放到配置中心,维护起来比较麻烦
-
建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置
多环境配置共享
1. 多环境配置
微服务启动时会从nacos读取多个配置文件:
-
[spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
-
[spring.application.name].yaml,例如userservice.yaml
无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境配置可以写入这个文件
2. 多种配置的优先级
服务名-profile.yaml > 服务名.yaml > 本地配置