玩转微服务之Nacos

本文主要介绍 Nacos,它是阿里巴巴开源的管理微服务的平台,在国内很多公司都在使用 Nacos 作为微服务的注册中心和全局配置中心,而且它在国内的中文文档比较丰富,比较是国产开源的,而且背后有阿里撑腰,目前软件还是一直在更新当中,于是我就开始学习 Nacos,全局配置管理和配置共享这两个功能还是很实用的。废话不多说,开始今天的教程。

0x0. 介绍

Nacos 主要作用有 2 个

  1. 实现服务注册与发现
  2. 作为配置中心

0x1. 安装 Nacos

本文使用的是 Docker 部署 Nacos。

Docker Hub nacos-server: https://hub.docker.com/r/nacos/nacos-server

Nacos 单节点版运行命令如下:

1
docker run --name forum-nacos -e MODE=standalone -p 8848:8848 --restart=always -d nacos/nacos-server

参数解释

  • –name 容器的名称
  • –name 容器的名称
  • -e 传入参数
  • -p 映射端口
  • –restart=always 随着 Docker 启动而启动
  • -d 后台运行

运行好之后,访问http://Nacos服务器的IP:8848/nacos就可以访问 Nacos 控制台。

0x2. Nacos 实现服务注册与发现

1. 服务提供者(生产者)

  1. 新建一个名称为: nacos-discovery-consumer的 Spring Boot 工程。

  2. 引入依赖

1
2
3
4
5
6
7
8
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 在主类上添加@EnableDiscoveryClient注解
1
2
3
4
5
6
7
@SpringBootApplication
@EnableDiscoveryClient
public class NacosDiscoveryProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDiscoveryProviderApplication.class, args);
}
}
  1. 配置服务名称和 Nacos 地址
1
2
3
4
5
6
server.port=8081
spring.application.name=nacos-discovery-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# nacos认证信息
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
  1. 启动应用,打开 Nacos 控制台->服务管理->服务列表

2. 服务消费者(消费者)

  1. 新建一个名称为: nacos-discovery-consumer的 Spring Boot 工程。

  2. 引入依赖

1
2
3
4
5
6
7
8
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 在主类上添加@EnableDiscoveryClient注解

  2. 配置服务名称和 Nacos 地址

1
2
3
4
5
6
7
server.port=9023
server.servlet.context-path=/provider
spring.application.name=service-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# nacos认证信息
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos

3. 消费者调用生产者接口

  1. provider工程中添加一个测试接口
1
2
3
4
5
6
7
@RestController
public class TestController {
@GetMapping(value = "/echo/{str}")
public String echo(@PathVariable String str) {
return "Hello Nacos Discovery " + str;
}
}
  1. consumer工程中调用接口
1
2
3
4
5
6
7
8
9
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@GetMapping(value = "/echo/{str}")
public String echo(@PathVariable String str) {
return restTemplate.getForObject("http://service-provider/provider/echo/" + str, String.class);
}
}
  1. 请求消费者的接口,消费者会调用生产者的接口

0x3. Nacos 作为配置中心

进入 Nacos 的控制页面,在配置列表功能页面中,点击右上角的 + 按钮,进入新建配置页面,如下图填写内容:

新建 Spring Boot 项目并引入依赖

1
2
3
4
5

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

resources新建bootstrap.properties(文件名称必须是 bootstrap,文件类型可以是.properties 或者.yaml),文件内容如下:

1
2
3
server.port=8081
spring.application.name=forum-service
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

配置解析:

  1. Data IDforum-service: 对应客户端的配置 spring.cloud.nacos.config.prefix,默认值为` ${spring.application.name}``,即:服务名
  2. 配置格式选 properties:对应客户端的配置 spring.cloud.nacos.config.file-extension,默认值为 properties
  3. Group 的值 DEFAULT_GROUP:对应客户端的配置 spring.cloud.nacos.config.group,默认值为 DEFAULT_GROUP

1. 配置的加载规则

在采用默认值的应用要加载的配置规则就是:Data ID=${spring.application.name}.properties,Group=DEFAULT_GROUP

如果我们想通过自定义配置,实现加载 Data ID=example.yaml,Group=DEV 的配置内容,则按照如下配置即可:

1
2
3
spring.cloud.nacos.config.prefix=example
spring.cloud.nacos.config.file-extension=yaml
spring.cloud.nacos.config.group=DEV

2. 多环境管理

  1. 使用Data IDprofiles实现

默认情况下Data ID的名称格式是这样的:${spring.application.name}.properties ,其实还包含了环境逻辑,我们在启动应用时,可以通过spring.profiles.active 来指定具体的环境名称,此时客户端就会把要获取配置的Data ID 设置为:${spring.application.name}-${spring.profiles.active}.properties

  1. 使用Group实现

Group在 Nacos 中是用来对Data ID做集合管理的重要概念。所以,如果我们把一个环境的配置视为一个集合,那么也就可以实现不同环境的配置管理。

  1. 使用Namespace实现

Namespace的常用场景之一是不同环境的配置的区分隔离,例如:开发测试环境和生产环境的资源(如配置、服务)隔离等。

可通过以下方式指定项目的Namespace

1
spring.cloud.nacos.config.namespace=c3583494-5c1e-42be-b946-fb3b726dfebe

总结:

对于指定环境的配置(spring.profiles.active=devspring.cloud.nacos.config.group=DEVspring.cloud.nacos.config.namespace=c3583494-5c1e-42be-b946-fb3b726dfebe),都不要配置在应用的 bootstrap.properties 中。而是在发布脚本的启动命令中,用-Dspring.profiles.active=dev 的方式来动态指定,会更加灵活!

3. Nacos 配置的多文件加载与共享配置

  1. 加载多个配置

1
2
3
4
5
6
spring.cloud.nacos.config.shared-configs[0].data-id=forum-service
spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].refresh=true
spring.cloud.nacos.config.shared-configs[1].data-id=forum-mybatis-plus
spring.cloud.nacos.config.shared-configs[1].group=DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[1].refresh=true

spring.cloud.nacos.config.shared-configs配置是一个数组 List 类型。每个配置中包含三个参数:data-idgrouprefreshrefresh 参数控制这个配置文件中的内容时候支持自动刷新,默认情况下,只有默认加载的配置才会自动刷新,对于这些扩展的配置加载内容需要配置该设置时候才会实现自动刷新。

  1. 配置加载的优先级
  • A: 通过 spring.cloud.nacos.config.shared-dataids 定义的共享配置
  • B: 通过 spring.cloud.nacos.config.ext-config[n]定义的加载配置
  • C: 通过内部规则(spring.cloud.nacos.config.prefixspring.cloud.nacos.config.file-extensionspring.cloud.nacos.config.group 这几个参数)拼接出来的配置

优先级关系是:A < B < C

0x4. 参考

  1. Nacos