Nacos:如何统一配置(下)
我们项目部署期间,如果修改配置,则需要重新打包部署到服务器上,这一过程十分繁琐,有什么简便的方法能够实现在服务不停机的情况下,动态修改配置呢?这里就要使用 Nacos 来统一管理我们的配置了。
一、传统使用配置模式
之前我们的开发模式为,我们将需要的配置防止在 application.properies 中,然后需要使用时通过@Value(“$(配置名)”)的方式来进行引入配置,如同下面一样 👇
application.properties 配置
coupon.user.name=test1
coupon.user.age=1234
使用配置
@RefreshScope //开启Nacos配置自动刷新
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
@Value("${coupon.user.name}")
private String userName;
@Value("${coupon.user.age}")
private int age;
@RequestMapping("/getvalue")
public R getValue(){
return R.ok().put("name", userName).put("age", age);
}
}
缺点:上述的缺点在于我们如果想在服务运行期间修改 application.properties,网页访问 getvalue,是不会发生修改的,因为注入是在项目启动访问时注入了,之后无法再修改,只能通过下线该服务->修改 application.properties->打包重新上线使用
二、Nacos 统一配置
如果我们该服务有很多集群,不可能每台服务都要通过以上的步骤,所以我们使用 Nacos 来同一存取我们的配置
优点:
- 在项目运行期间可以动态修改配置
- 当有服务集群时,可以实现修改一处,所有同集群的服务配置都发生修改
使用方式
1.引入依赖
<!--Nacos实现微服务配置统一管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2. 创建一个 bootstrap.properties
告诉该微服务 Nacos 配置中心地址以及该服务模块名称,这样该微服务模块才能去 Nacos 以模块名.properties 读取配置
bootstrap.properties
# 配置中心地址以及该微服务名称
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=doermail-coupon
3.在 Nacos 自带的前端控制台新建一个应用名.properties 文件,写入配置
4.项目需要引入配置的类上(不是应用启动类)添加@RefreshScope 注解表示动态获取配置以及 Value 注解
@RefreshScope //开启Nacos配置自动刷新
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
@Value("${coupon.user.name}")
private String userName;
@Value("${coupon.user.age}")
private int age;
@RequestMapping("/getvalue")
public R getValue(){
return R.ok().put("name", userName).put("age", age);
}
}
5.项目启动时可以看到会从 Nacos 以应用名.properties 访问配置文件,访问 getvalue
- 运行期间修改配置,动态生效
当本地有 application.properties 时,又使用了 Nacos 来统一管理配置时,这时候是 Nacos 配置优先级高于本地 application.properties,优先使用 Nacos 配置
三、细节
1.命名空间
命名空间主要是为了用作配置隔离,在不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置,NameSpace 主要的常用场景就是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源隔离。
- 在 Nacos 创建命名空间
- 在 bootstrap.properties 中添加需引用哪个命名空间的配置信息
spring.cloud.nacos.config.namespace=c2d59cfd-4549-493b-b741-1cc29e9101ec
- 上线刷新
2.配置集
一组相关或者不相关的配置项的集合称为配置集,一个配置集可能包含了数据源、线程池、日志级别等各种各样的配置项
3.配置集 ID
类似于配置文件名 application.properties,这里就是指应用名.properties
4.配置分组
默认所有的配置集都属于:DEFAULT_GROUP ,通常是根据活动来划分,例如双十一采取某个配置
可以看到该微服务有两个配置文件,属于同一个命名空间,但是不同分组,默认微服务是使用默认分组的配置文件
在 bootstrap.properties 中添加如下信息,就可以使用指定分组的配置了
spring.cloud.nacos.config.namespace=9d4cb79e-bd03-467f-9e2f-2a7bcfe2fe55
spring.cloud.nacos.config.group=11-11
开发规范:每个微服务拥有自己的命名空间,使用配置分组区分环境:test、dev、prod
**
四、同时加载多个配置
1)微服务任何配置信息,任何配置文件都可以放在配置中心中
2)只需要在 bootstrap.properties 说明加载配置中心哪些配置文件即可(指定好 group)
3)@Value、@ConfigurationProperties 都可以进行配置代码中的注入
4)配置中心有的优先 使用
一般随着业务不断壮大,数据源、mybatis、拦截器配置不可能都放在微服务下面的 application.yml 中,这里对不同的配置进行拆分,放置在 Nacos 中进行统一管理。
- 数据源:将 application.yml 中数据源在 Nacos 中抽取出来,新建 datasouce.yml
- mybatis 配置:将 application.yml 中 mybatis 在 Nacos 中抽取出来,新建 mybatis.yml
- 其他配置:例如注册中心地址、应用名
经过上面已经将应用的数据源配置、端口号之类的搬迁到了 Nacos 中,那么接下来本地如何引用这些配置呢?还是在bootstrap.properties中进行配置
通过 ext-config 属性指定,可以看到是一个 List,然后每个配置下面设置好 dataId,group 属性,以及是否采用动态配置 refresh
本地的 application.yml 可以完全删除,直接实现 Nacos 统一配置管理
# 配置中心地址以及该微服务名称
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=9d4cb79e-bd03-467f-9e2f-2a7bcfe2fe55
spring.cloud.nacos.config.group=dev
spring.application.name=doermail-coupon
# 数据源Nacos
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true
# mybatis
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true
# 端口号、服务注册发现地址
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。