脚本宝典收集整理的这篇文章主要介绍了微服务架构 | 2.2 Alibaba Nacos 的统一配置管理,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
参考资料: 《Spring Microservices in Action》 《Spring Cloud Alibaba 微服务原理与实战》 《B站 尚硅谷 SpringCloud 框架开发教程 周阳》 《Nacos 官网》
Nacos 致力于解决微服务中的统一配置、服务注册与发现等问题。它提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理;
${prefix}-${spring.profiles.active}.${file-extension}
;${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
;
spring.application.name
的值,也可以通过配置项 spring.cloud.nacos.config.prefix
来配置;profile
。当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
;spring.cloud.nacos.config.file-extension
来配置。目前只支持 properties 和 yaml 类型;类似 Java 里面的 package 名和类名,最外层的 Namespace 是可以用于区分部署环境的,Group 和 Data ID 逻辑上区分两个目标对象;
默认情况下,Namespace=public
,Group=DEFAULT_GROUP
,Cluster=DEFAULT
;
官方的建议是,通过 Namespace 来区分不同的环境,而 Group 可以专注在业务层面的数据分组;
对配置的操作 | SDK | Open API | 说明 |
---|---|---|---|
发布配置 | public boolean publishConfig(String dataId, String group, String content) throws NacosException | POST: /nacos/v1/cs/configs | 将配置保存到 Nacos Config Server 中 |
删除配置 | public boolean removeConfig(String dataId, String group)throws NacosException | DELETE: /nacos/v1/cs/configs | 删除配置中心的指定配置 |
获取配置 | public string getConfig(String dataId, String group, long timeoutMs) throws NacosException | GET: /nacos/v1/cs/configs | 从 Nacos Config Server 中读取配置 |
监听配置 | public void addListener(String dataId, String group, Listener listener) | POST: /nacos/v1/cs/configs/listener | 订阅感兴趣的配置,当配置发生变化时可以收到一个事件 |
比较项 | Pull 机制 | Push 机制 |
---|---|---|
说明 | 客户端从服务端主动拉取数据 | 服务端主动把数据推送到客户端 |
缺点 | 不能保证数据实时性;在服务端配置长时间不更新的情况下,客户端的定时任务会做一些无效的 Pull | 如果客户端的数量比较多,服务端需要耗费大量的内存资源来保存每个连接;需要心跳机制来维持每个连接状态 |
以 Data ID 方案为例,更多方案详情请见本篇第三点《3. Nacos 加载配置的三种方案》;
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
# nacos配置
server:
port: 18082
spring:
application:
name: nacos-config-client #必须,构成 Nacos 配置管理 Data ID 字段的一部分
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos 服务注册中心地址
config:
server-addr: localhost:8848 #Nacos 作为配置中心地址
file-extension: yaml #指定 yaml 格式的配置
# prefix: hhh #Data ID 的前缀,如果不指定,就是 nacos-config-client-dev.yaml。指定后,是 hhh-dev.yaml
# refresh: true #是否动态刷新
# group: DEFAULT_GROUP #指定组
# namespace: PUBLIC #指定命名空间 ID
spring:
profiles:
active: dev # 表示开发环境
@RestController
@RefreshScope //使当前类下的配置支持 Nacos 的动态刷新功能
public class ConfigClientController{
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
http://localhost:18082/config/info
获取配置信息;.yml
和 Nacos 服务器配置的 Data ID
匹配不上,将导致 ConfigClientController 类里的 ${config.info}
找不到,最终报 ConfigClientController 无法装配的错误,如下:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.configClientController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'config.info' in value "${config.info}"
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:380) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1411) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$1(AbstractBeanFactory.java:356) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.cloud.context.scope.GenericScope$BeanLifecycleWrapper.getBean(GenericScope.java:389) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.cloud.context.scope.GenericScope.get(GenericScope.java:186) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:353) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105) ~[spring-context-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.cloud.context.scope.refresh.RefreshScope.eagerlyInitialize(RefreshScope.java:134) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.cloud.context.scope.refresh.RefreshScope.start(RefreshScope.java:125) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.cloud.context.scope.refresh.RefreshScope.onApplicationEvent(RefreshScope.java:119) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.cloud.context.scope.refresh.RefreshScope.onApplicationEvent(RefreshScope.java:73) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.1.8.RELEASE.jar:5.1.8.RELEASE]
......
-Dspring.profiles.active=${profile}
spring.profile.active
中的配置,重启服务,可以看到配置已经切换成其他环境了:spring:
profiles:
active: prod
spring.profile.active
和 spring.cloud.nacos.config.group
中的配置,重启服务,可以看到配置已经切换成其他环境了:spring:
profiles:
active: info #修改
server:
port: 18082
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml
group: PROD_GROUP #新增
spring.profile.active
和 spring.cloud.nacos.config.group
中的配置,重启服务,可以看到配置已经切换成其他环境了:spring:
profiles:
active: dev #修改
server:
port: 18082
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml
group: DEFAULT_GROUP #新增
namespace: 48b2da7d-0b26-4c15-907b-9a379db8f7de #新增,命名空间的 ID,在新建命名空间时会给出
以上是脚本宝典为你收集整理的微服务架构 | 2.2 Alibaba Nacos 的统一配置管理全部内容,希望文章能够帮你解决微服务架构 | 2.2 Alibaba Nacos 的统一配置管理所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。