Nacos 安装与部署:https://blog.csdn.net/Cey_Tao/article/details/127611559

一、服务发现

Nacos 的服务发现有三个主要区域,从大到小分别是:命名空间(namespace),分组(group),集群(cluster)

默认分别为 public 命名空间,DEFAULT_GROUP 分组,DEFAULT 集群

不同集群之间的服务可以相互访问,但不同分组或命名空间的服务不可发现

服务发现在 spring.cloud.nacos.discovery 中配置,示例如下:

spring:
  application:
    name: user-service	# 服务名称
  cloud:
    nacos:
      server-addr: @nacos.server-addr@	# nacos 注册中心地址
      discovery:
        namespace: namespace-dev # namespace 的 ip
        group: g1	# 分组名称
        cluster-name: ShenZhen	 # 集群名称

group 和 cluster-name 可以直接配置,namespace 需要先在 nacos 控制台新建命名空间,并得到命名空间的 id

命名空间 id 可以自己填写,也可自动生成

如下图:

在这里插入图片描述

二、负载均衡策略

Nacos 依赖中也包含了 Ribbon 相关依赖,可以通过 Ribbon 来设置负载均衡策略

默认策略为轮询访问

示例如下,对 user-service 服务的访问设置负载均衡策略:

user-service:	# 服务名称,为改服务设置负载均衡策略
  ribbon:
    #    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule	# 随机访问策略
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule	# nacos 优先选择策略

若设置为 NacosRule 策略,nacos 会根据服务发现的相关信息选择最优的服务:

  1. 优先选择同一集群内的服务
  2. 同一集群内根据权重随机选择

权重越大被选择的可能性越大

服务的权重可以在 Nacos 服务详情中设置,如下图:

在这里插入图片描述

三、Naocs 管理配置

新建配置

配置文件是根据命名空间隔离的

在 Nacos 配置列表中选择命名空间,可以添加配置

在这里插入图片描述

下面示例为 user-service 添加一个默认配置,配置内容为服务的日志等级

Nacos 是根据服务名称查找对应的 Data ID,所以 Data ID 应该以服务名称为前缀

在这里插入图片描述

如果需要多环境配置,Data ID 中应加上环境名称后缀,如下:

在这里插入图片描述

拉取配置

添加 nacos 服务发现和服务配置的依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

拉取 nacos 配置的相关属性要配置在 bootstrap 配置文件中

必要的属性有服务名称,nacos 地址,配置格式

在项目 resources 目录下新建 bootstrap.yml,配置示例如下:

spring:
  application:
    name: user-service # 服务名称,要与 Data ID 前缀对应
  profiles:
    active: dev	# 启用环境
  cloud:
    nacos:
      server-addr: @nacos.server-addr@  # nacos 注册中心地址
      discovery:
        namespace: 6c1d9771-2afb-4a48-9ced-4bc21b2781c8 # 服务发现的命名空间 id
      config:
        file-extension: yaml  # 配置格式
        namespace: 6c1d9771-2afb-4a48-9ced-4bc21b2781c8 # 服务配置的命名空间 id
#        group: DEFAULT_GROUP # 默认为 DEFAULT_GROUP

注意服务发现的 namespace 与配置的 namespace 是分开配置的,默认都是在 public 空间

bootstrap 配置中 @@ 可能无法被 Maven 属性替代,在 pom.xml 中添加以下配置即可:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

不同配置的优先级

不同配置的优先级从高到低顺序如下:

nacos 环境配置 > nacos 默认配置 > 命令行参数 > bootstrap 配置 > application 配置

不同优先级之间,不同部分互补,相同冲突部分采用优先级高的配置

但也有例外,据我测试,服务名称(spring.application.name)与服务端口(server.port)是命令行参数的优先级最高

另外,服务端口虽然能通过拉取 nacos 配置设置,但在服务启动后端口号无法变更,所以服务端口不会受热更新影响

配置热更新

在 nacos 配置列表可以编辑已有的配置

如果配置正在被服务使用,配置更改后会立即更新作用到服务,这就是热更新

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐