简单的介绍了SpringCloud中的Nacos。

Nacos注册中心

启动

startup.cmd -m standalone

注册与发现

由于SpringCloud Commons定义了统一的接口规范

所以只需要改变引入的依赖和地址即可

  1. 在cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖:
<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>
  1. 注释掉order-service和user-service中原有的eureka依赖。
  2. 添加nacos的客户端依赖
<!-- nacos客户端依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<arifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 修改user-service&order-service中的application.yml文件,注释eureka地址,添加nacos地址
spring:
cloud:
discovery:
nacos:
server-addr: localhost:8848 # nacos服务端地址
  1. 启动并测试

  2. 总结

    1. Nacos服务搭建
      • 下载安装包
      • 解压
      • 在bin目录下运行指令: startup.cmd -m standalone
    2. Nacos服务注册或发现
      • 引入nacos.discovery依赖
      • 配置nacos地址spring.cloud.discovery.nacos.server-addr

Nacos服务分级存储模型

xxxxxxxxxx6 1ribbon:2 eager-load:3 enabled: true # 开启饥饿加载4 clients: userservice # 指定对userservice这个服务饥饿加载5 - userservice16 - userservice2yaml

spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
discovery:
cluster-name: HZ #配置集群名称,也就是机房位置,例如:HZ,杭州

总结

  1. Nacos服务分级存储模型

    • 一级是服务,例如userservice
    • 二级是集群,例如杭州或上海
    • 三级是实例,例如杭州机房的某台部署了userservice的服务器
  2. 如何设置实例的集群属性
    • 修改application.yml文件,添加spring.cloud.nacos.discovery.cluster-name属性即可

那么如何设置orderservice也进行集群属性配置使得远程调用可以优先调用本地的集群?

  • 1.修改order-service中的application.yml,设置集群
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
discovery:
cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州
  • 2.在order-service中设置负载均衡的IRule为NacosRule,这个规则会优先寻找与自己同集群的服务
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
  • 3.注意将user-service的权重都设置为1

Nacos负载均衡的策略:先访问本地的集群,在本地的集群内随机负载均衡

那么如何进行根据权重负载均衡呢?

Nacos提供了权重配置来控制访问的频次

在Nacos页面进行权重配置即可

权重为0即为停止访问,可以用来停机进行版本升级,再小量的提升权重,放入小部分用户进行测试,若无问题则调整群众,进行一个平滑的升级

Nacos的环境隔离-namespace

SpringCloud05-01Nacos环境隔离

修改命名空间:修改order-service的application.yml,添加namespace:

spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
discovery:
cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 #命名空间,填ID

Nacos环境隔离

  • namespace用来做环境隔离
  • 每个namespace都有唯一id
  • 不同namespace下的服务不可见

Nacos注册中心细节

SpringCloud05-02Nacos细节

非临时实例:yml中的discovery:ephemeral: false

1.Nacos与eureka的共同点

  • 都支持服务注册和服务拉取
  • 都支持服务提供者心跳方式做健康检测

2.Nacos与Eureka的区别

  • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
  • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
  • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
  • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

Nacos配置管理

统一配置管理

需求:

  • 配置更改热更新

如何管理:Nacos表单填写配置名称

  • Data ID: 配置文件的id:[服务名称]-[profile].[后缀名]
  • Group:分组:默认即可
  • 格式:建议yaml

有个问题:Nacos的地址存于application.yml ,如何先读取到naocs地址呢?

有个bootstrap.yml优先级高于本地的配置文件,写在其中即可

SpringCloud05-03Nacos配置读取

配置步骤如下

  • 1.引入Nacos的配置管理客户端依赖:
<!-- nacos配置管理依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  • 2.在userservice中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml:
spring:
application:
name : userservice #服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 #Nacos地址
config:
file-extension: yaml #文件后缀名

中间的三项配置即为Data ID

==将配置交给Nacos管理的步骤==

  • 1.在Nacos中添加配置文件
  • 在微服务中引入nacos的config依赖
  • 在微服务中添加bootstrap.yml,配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个文件

==如何进行热更新==

SpringCloud05-04Nacos热更新01

SpringCloud05-04Nacos热更新02

Nacos配置更改后,微服务可以实现热更新,方式:

通过@Value注解注入,结合@RefreshScope来刷新

通过@ConfigurationProperties注入

自动刷新注意事项:

  • 不是所有的配置都适合放到配置中心,维护起来比较麻烦
  • 建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置

共享配置

  • 微服务会从nacos读取的配置文件:
    • [服务名]-[spring.profile.active].yaml,环境配置
    • [服务名].yaml,默认配置,多环境共享
  • 优先级:
    • [服务名]-[环境].yaml >[服务名].yaml >本地配置

Nacos集群

image-20231216174727586

集群搭建步骤:

  • 搭建MySQL集群并初始化数据库表
  • 下载解压nacos
  • 修改集群配置(节点信息)、数据库配置
  • 分别启动多个nacos节点
  • nginx反向代理