Home Nacos 注册中心
Post
Cancel

Nacos 注册中心

需先安装软件,官网:https://nacos.io/zh-cn/

conf/application.properties 文件中可以更改端口,默认为 8848

注册服务

父工程中添加管理依赖

1
2
3
4
5
6
7
<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>

注释掉 Eureka 的依赖,并添加 Nacos 客户端的依赖

1
2
3
4
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

修改 application.yml,添加 Nacos 地址,注释 Eureka 地址

1
2
3
4
spring:
  cloud:
    nacos:
      server-addr: localhost:8848

启动 Nacos

1
2
startup.cmd -m standalone
# 参数为单机启动

访问 http://localhost:8848/nacos/ 登录账号密码都为 nacos

分级存储模型

服务分为多个集群,每个集群有多个实例,集群可以按地区分配,提供访问速度

相对的,Eureka 只有 服务-实例,无集群

服务调用尽可能选择本地集群的服务,跨集群调用延迟较高。本地集群不可访问时,再去访问其它集群

可以通过 application.yml 设置集群

1
2
3
4
5
6
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: Shanghai # 集群名称

然后设置 Ribbon 的策略为 Nacos 的

1
2
3
4
5
# 给某个微服务配置负载均衡规则,这里是userService服务
userService:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
#    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.Nac # 负载均衡规则

然后可以在 Nacos 设置实例的权重 (0-1),权重越大,访问频率越高

环境隔离

Nacos 中服务存储和数据存储的最外层都是一个名为 namespace 的东西,用来做最外层隔离

可以在 Nacos 中新建一个命名空间,如 dev,然后修改 application.yml

1
2
3
4
5
6
7
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: Shanghai # 集群名称
        namespace: UUID # 此处为命名空间的UUID

不同 namespace 下的服务互相不可见,无法访问

临时实例与非临时实例

对于临时实例,Nacos 的处理方法和 Eukera 一致

对于非临时实例,Nacos 会主动询问是否存活,服务不可用不会删除,在服务不可用时,Nacos 会主动通知 消费者

设置非临时实例

1
2
3
4
5
spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

Nacos 配置管理

当微服务部署的实例变多,逐个更改配置非常麻烦,可以使用 Nacos 将配置集中管理,并且可以热更新

简单使用

在 Nacos 控制台的配置管理,新建配置,其中 Data ID 为配置文件的 id,格式为 [服务名称]-[profile].[后缀名],例如 userService-dev.yaml

然后在配置内容书写配置即可,例如

1
2
pattern: 
  dateformat: yyyy-MM-dd HH:mm:ss

引入 Nacos 的配置管理客户端依赖

1
2
3
4
5
<!--nacos配置管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

配置获取的步骤

项目启动 -> bootstrap.yml -> Nacos 配置文件 -> 本地 application.yml -> 创建 Spring 容器 -> 加载 bean

添加 bootstrap.yml

1
2
3
4
5
6
7
8
9
10
spring:
  application:
    name: userService # 服务名称
  profiles:
    active: dev #开发环境,这里是dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名

测试

1
2
3
4
5
6
7
8
9
10
11
12
@RestController
@RequestMapping("/user")
public class UserController{
    
    @Value("${pattern.dateformat}")
    private String dateformat;
    
    @GetMapping("/now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat))
    }
}

访问页面查看效果

热更新

可以通过两种方式实现

方式一:在 @Value 注入的变量所在类上添加注解 @RefreshScope

1
2
3
4
5
6
7
8
9
10
11
12
13
@RefreshScope // 配置自动刷新
@RestController
@RequestMapping("/user")
public class UserController{
    
    @Value("${pattern.dateformat}")
    private String dateformat;
    
    @GetMapping("/now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat))
    }
}

方式二:使用 @ConfigurationProperties

新建配置类

1
2
3
4
5
6
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}

Controller 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// @RefreshScope // 配置自动刷新
@RestController
@RequestMapping("/user")
public class UserController{
    
    // @Value("${pattern.dateformat}")
    // private String dateformat;
    
    @Autowired
    private PatternProperties properties;
    
    @GetMapping("/now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()))
    }
}

配置共享

微服务启动时,会从 Nacos 读取多个配置文件

  • [spring.application.name]-[spring.profiles.active].yaml,例如:userService-dev.yaml

  • [spring.application.name].yaml,例如:userService.yaml

而 第二个 [spring.application.name].yaml 不包含环境,可以被多个环境共享

配置优先级:[spring.application.name]-[spring.profiles.active].yaml > [spring.application.name].yaml > 本地配置

This post is licensed under CC BY 4.0 by the author.

Ribbon 负载均衡

Feign 远程调用