Nacos简介
Nacos相关信息,我们这边就不过多介绍,可以直接点击官网查阅相关内容。本次我们主要针对我们自己的开发场景做实践分享。
如何进行配置隔离
我们可以根据官方文档提到的命名空间、分组结合Nacos的权限管理功能来进行不同团队,不同项目,不同环境的配置隔离及管理。
(1)首先,我们内部拥有平台线,产品线及项目线3条开发线,有开发人员角色和测试人员角色,有开发环境dev,测试环境test,预发布环境stage,生产环境prod。
我们先来解决第(1)个内部研发管理的问题,希望通过一个配置中心,管理所有开发条线及所有项目的环境配置。
可以按照dev、test、stage、prod作为namespace来区分,然后将group按照平台组,产品组,项目A组,项目B组方式进行区分
虽然上图的方式可以使用,但是我们发现当项目多的时候,不好按区域或团队去管理,因为Group不支持层级管理,所以最终我们最终定下了以业务线条/团队为命名空间区分的配置方式(其中Project可以按区域作为命名空间),如下图所示:
(2)其次,我们发布出去的产品,需要提供给客户2套环境使用,用户测试环境uat,生产环境prod
客户环境生产和测试一般是隔离的,搭建的配置中心一般都是以单一环境为主,赋能不同产品或项目的上线使用,所以客户环境的出厂配置一般比较简单,如下图所示:
如何共享配置
Nacos提供了共享配置的属性,如下图所示:
spring:
application:
name: demo
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 192.168.1.100:8848
namespace: 22b12b94-df82-46eb-bc47-b6ea4e7437eb
file-extension: yaml
group: DEMO_GROUP
shared-configs:
- data-id: shared-redis-${spring.profiles.active}.yaml
refresh: true
group: DEMO_GROUP
- data-id: shared-rabbitmq-${spring.profiles.active}.yaml
refresh: true
group: DEMO_GROUP
我们可以看到上面的shared-configs配置项,可以加载我们共享的配置,一般我们会按照数据库、消息队列、redis等按块独立出来配置作为共享配置,方便运维人员进行维护。
代码示例
依赖引入
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.1</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.1</version>
</dependency>
添加启动加载配置bootstrap.yml
spring:
application:
name: demo
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 192.168.1.100:8848
namespace: 22b12b94-df82-46eb-bc47-b6ea4e7437eb
file-extension: yaml
group: DEMO_GROUP
shared-configs:
- data-id: shared-redis-${spring.profiles.active}.yaml
refresh: true
group: DEMO_GROUP
- data-id: shared-rabbitmq-${spring.profiles.active}.yaml
refresh: true
group: DEMO_GROUP
我们使用bootstrap方式来加载启动配置项,注意你的bootstrap.yml加载不成功,那你的依赖需要显示引入spring-cloud-starter-bootstrap。
读取配置文件规则(data-id)
该服务的配置文件data-id我们按照默认规则${spring.application.name}-${spring.profiles.active}.${file-extension},按照上面的配置,我们就可以自动加载到我们的demo-dev.yaml配置,如下图所示:
访问配置效果如下:
动态刷新
首先在bootstrap.yml里的refresh-enabled属性设置成true。如下图所示:
然后通过RefreshScope注解特性,来动态加载配置,如下代码所示:
@RefreshScope
@RestController
@RequestMapping("{version}/test")
public class TestController {
@Value("${spring.rabbitmq.conn1.password}")
private String rabbitmqPassword;
@Value("${demo.name}")
private String demoName;
@RequestMapping(value = "/rabbitmqPassword", method = RequestMethod.GET)
public String getRabbitmqPassword() {
return rabbitmqPassword;
}
@RequestMapping(value = "/demoName", method = RequestMethod.GET)
public String getDemoName() {
return demoName;
}
}
上面的代码只是简单示例一下如何动态刷新单个配置项,实际场景我们会根据Spring的ApplicationListener监听ApplicationReadyEvent,进而对类似数据库,redis等一些配置项进行监听并刷新配置。