nacos配置中心
为什么要有配置中心,当我们服务上线发布以后,需要更改配置,只需要从配置中心获取配置数据,就可以用了。不需要重新编译打包发布上线,如果是一台机器还好,如果是10台机器,非常麻烦,故此需要配置中心,统一集中管理。
# 官方文档
https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md
# 如何接入?
# 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2
3
4
每一个服务都有可能使用配置中心,所以导入到common模块下
# 配置nacos config元数据
在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据
spring.application.name=nacos-config-example
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
2
没有bootstrap.properties,则自己新建一个
# 打开动态刷新功能
完成上述两步后,应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment 的 PropertySources 中。这里我们使用 @Value 注解来将对应的配置注入到 SampleController 的 userName 和 age 字段,并添加 @RefreshScope 打开动态刷新功能
@RefreshScope
class SampleController {
@Value("${user.name}")
String userName;
@Value("${user.age}")
int age;
}
2
3
4
5
6
7
8
9
# 验证
# com.elite.mall.coupon.controller.CouponController
@RefreshScope
@RestController
@RequestMapping("coupon/coupons")
public class CouponController {
@Autowired
private CouponService couponService;
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private Integer age;
@GetMapping("/test")
public CommonResult test(){
return CommonResult.ok().put("name", name).put("age", age);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
访问这个接口,返回
{"msg":"success","code":200,"name":"zhangsan","age":18}
浏览器去nacos里的配置列表,点击+号,data ID:elitemall-coupon.properties
,配置
coupon.user.name=test223
coupon.user.age=66
2
点击发布。
再去访问接口
{"msg":"success","code":200,"name":"test223","age":66}
很明显,这里我们已经实现了动态配置了,以后有类似的情况,所有的机器都可以从配置中心获取配置,不需要重新编码打包发布,重启服务器。
# 配置中心进阶
首先我们了解几个核心概念:
- 命名空间
- 配置集
- 配置集ID
- 配置分组
了解清楚了这么几个概念,就可以对配置中心应用自如
# 核心概念
# 命名空间
命名空间,来做配置隔离。
默认的命名空间是public,所有新增的配置都是在public下。
例子:利用命名空间来做环境隔离。
开发有一堆配置,测试有一堆配置。
我们就可以在nacos下新建3种命名空间,dev,test,prod,每种命名空间新建时有一个uuid。
在微服务的bootstrap.properties指定命名空间,就可以用了:
spring.cloud.nacos.config.namespace=#命名空间的uuid
重启微服务。
例子:基于每个微服务互相隔离
场景:比如现在服务众多,每个微服务有众多配置文件,但是只有3种命名空间,这样非常混乱,我们可以基于每个微服务创建一个自己的命名空间,这样每个微服务只加载自己命名空间下的配置。
比如,在nacos为coupon/member微服务等各自创建一个命名空间,同时修改bootstrap.properties使用指定的命名空间。
一个个命名空间创建太麻烦,可以用选中public下的配置,直接克隆到coupon/member命名空间下,就可以了。
# 配置集
一组相关或不相关配置项的集合。
说白了,在微服务模块下的application.yml中存在很多配置,我们把这些配置称为配置集。
# 配置集ID
配置集id类似文件名。就是nacos新建时的Data Id。
比如xxx.properties
# 配置分组
默认所有的配置集都属于:DEFAULT_GROUP
所有的组别,都是可以基于业务来定制,比如双11,比如618,比如双12
在nacos创建配置时,可以自定义组名
现在可以看到同一个命名空间下的,有两个同名的配置,但是他们的分组不一样,只需要去微服务的bootstrap.properties指定使用什么分组
# 更改配置分组
spring.cloud.nacos.config.group=1111
2
重启微服务就可以了,有测试接口试试,就可以得到该分组下的数据。
在基于微服务隔离命名空间时,可以在该微服务的命名空间下,创建dev/test/prod分组
# 同时加载多个配置集
如果我们需要加载多个配置文件,可以用ext-config来配置
spring.cloud.nacos.config.ext-config[0].data-id=app.properties
spring.cloud.nacos.config.ext-config[0].group=multi-data-ids
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=user.properties
spring.cloud.nacos.config.ext-config[1].group=multi-data-ids
spring.cloud.nacos.config.ext-config[1].refresh=true
2
3
4
5
6
7
通常,当使用某些配置时,会优先使用配置中心的配置,否则就使用配置文件的配置
场景
随着业务不断的壮大,微服务可能有许多配置,配置越来越多,如果放在微服务模块下的yml或者properties会又多又乱,不便于统一管理。都是来拆分出配置文件,比如跟数据源有关的我们放在datasource.properties,和mybatis有关的配置放在mybatis.properties。
把微服务模块下yml拆分3个yml,放在nacos配置中心
在微服务模块的bootstrap.properties下写入就可以了
# 总结
微服务任何配置信息,任何配置文件,都可以放在配置中心中
如何同时加载多个配置集?
- 在bootstrap.properties指定命名空间,指定使用分组
- 在controller中,使用@Value,@ConfigurationProperties
配置中心的配置会被优先使用。
在平时开发中,还是建议在本地的yml配置文件填写,比较方便,当项目上线时,才把所有配置放到配置中心。