Spring Cloud Alibaba系列(二)nacos作为服务配置中心
Spring Cloud Alibaba系列(二)nacos作为服务配置中心
Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。
首先我们来看一下,微服务架构下关于配置文件的一些问题:
配置文件相对分散,在一个微服务架构中,配置文件会随着微服务的增多变得越来越多,而且分散在各个微服务中,不好统一管理和配置。
配置文件无法区分环境,微服务项目可能会有多个环境,例如:开发环境、预发布环境、生成环境。每个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。
配置文件无法实时更新,我们修改好了配置文件之后,必须重新启动微服务才能使配置文件生效,这对一个正在运行的项目来说是非常不友好的。
基于上面这些问题,我们就需要引入配置中心来解决。
创建一个config服务
新建一个config服务,在pom文件中添加必要依赖
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository -->
<dependencies> <!--Spring cloud Hoxton.SR3--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR3</version> <type>pom</type> <scope>import</scope> </dependency> <!--Spring cloud alibaba 2.1.0.RELEASE--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies>
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
在配置文件指定config地址等信息
注意:不能使用原来的application.yml作为配置文件,而是新建一个bootstrap.yml作为配置文件
配置文件加载的优先级(由高到低)
bootstrap.properties ->bootstrap.yml -> application.properties -> application.yml
server:
port: 9002
spring:
profiles:
active: dev
application:
name: nacos-config-server
cloud:
nacos: config: server-addr: 127.0.0.1:8848 # 配置中心 file-extension: yaml # 这里指定的文件格式需要和nacos上新建的配置文件后缀相同,否则读不到
在nacos客户端配置管理新建一个配置
Data ID:默认为 ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} 或 ${spring.application.name}.${spring.cloud.nacos.config.file-extension}
Group:对应配置文件中的${spring.cloud.nacos.config.group},默认为DEFAULT_GROUP
配置格式:对应配置文件中的${spring.cloud.nacos.config.file-extension},
配置内容:根据你的配置格式按对应的格式填写即可。
在config服务中获取配置信息
@SpringBootApplication
public class NacosConfigServerApplication {
public static void main(String[] args) { SpringApplication.run(NacosConfigServerApplication.class, args); } @RestController class TestController { @Value("${config.info}") private String config; @GetMapping("/test") public String hello() { return config; } }
}
我们通过@Value注解可以获取到配置中心的值。
@RefreshScope动态刷新配置
在TestController上加个@RefreshScope注解,然后我们去nacos客户端手动修改config.info的信息,然后重新调用这个/test接口,会发现响应的是修改后的内容。
配置自定义的命名空间
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在没有明确指定命名空间配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。
首先我们在nacos客户端新建一个命名空间,
然后我们在配置文件中新增下面这个属性,具体的值填写我们新增命名空间的ID,这样启动config服务后,就会自动去这个命名空间下寻找对应的配置文件了。
spring:
cloud:
nacos: config: namespace:
多环境配置的三种方式
最开始的时候我们也说过微服务项目会有多个环境,我们如何实现和管理这些环境呢?
1.通过Data ID 和profiles实现
我们可以在配置文件中指定spring.profiles.active = **,然后在nocas客户端新建对应的${spring.cloud.nacos.config.prefix}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}配置来区分不同的环境。
2.通过Group实现
我们可以为不同的环境新建不同的分组,然后的配置文件中指定spring.cloud.nacos.config.group=组名,这样也可以实现不同环境的区分。
3.通过Namespace实现
这种方式是官方建议的方式,在nacos客户端中新建不同的分组,然后再配置文件中指定namespace就可以区分不同的环境了。
自定义扩展的Data ID
大多数时候我们可能更加倾向于将不同的配置分开写到不同的配置文件中,比如我想把文件类和日志类的配置拆分开写到两个配置中,nacos也是支持这种写法的。
我们在nacos中新建两个Data ID 分别是log.yaml 和 file.yaml 的文件。
我们在配置文件中分别加入以下内容:log:level: 2,file:url: "http://123.com"。
如何配置呢
spring:
cloud:
nacos: config: extension-configs[0]: data-id: log.yaml group: DEFAULT_GROUP # 默认为DEFAULT_GROUP refresh: true # 是否动态刷新,默认为false extension-configs[1]: data-id: file.yaml group: DEFAULT_GROUP refresh: true
为了更加清晰的在多个应用间配置共享的 Data Id,官方推荐使用如下配置:
spring:
cloud:
nacos: config: shared-configs[0]: data-id: log.yaml group: DEFAULT_GROUP # 默认为DEFAULT_GROUP refresh: true # 是否动态刷新,默认为false shared-configs[1]: data-id: file.yaml group: DEFAULT_GROUP refresh: true
深入思考,既然我们有两个配置文件,假如两个配置文件中出现一样的key值,这样我们程序中会加载哪个配置呢,其实nacos在设计的时候也考虑到了优先级问题,下面我们一起来看看。
我们将file.yaml中的配置改成log:level: 22。这时候我们加载写个接口取一下配置。看看它取到的是哪个文件的内容。
RestController @RefreshScope class TestController { @Value("${log.level}") private String log; @GetMapping("/test") public String hello() { return "log.lelve="+log; } }
结果取到的是file.yaml中的配置,这是因为多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,优先级越高。
注意:spring.cloud.nacos.config.extension-configs[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。
扩展:不同方式配置加载优先级
Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。
A: 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置
B: 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置
C: 通过内部相关规则(spring.cloud.nacos.config.prefix、spring.cloud.nacos.config.file-extension、spring.cloud.nacos.config.group)自动生成相关的 Data Id 配置
当三种方式共同使用时,他们的一个优先级关系是:A < B < C
代码示例
github:https://github.com/binzh303/spring-cloud-alibaba-learning
gitee:https://gitee.com/zhixie/spring-cloud-alibaba-learning
原文地址https://www.cnblogs.com/zhixie/p/12854737.html
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
字母哥自曝感染新冠并加盟勇士?本人回应来了!
即将开播:5月14日,Jenkins在K8S下的三种部署流程和实战演示 正值全球疫情期间,很多重大赛事都不得不宣布推迟或取消,NBA也自然不例外。在NBA停赛期间,球员们也得以静下来“休养生息”。但近日由于雄鹿队的当红球员字母哥(扬尼斯·安特托昆博)的推特发表的一系列不当言论引发了大家的关注。 图片来源于网络 字母哥作为炙手可热的当红球员,其一举一动都受到了大家的广泛关注,而勇士更是不断加大筹码在极力争取字母哥。 就在近日,字母哥的推特账号突然发布动态表示将加入勇士,并对雄鹿、米德尔顿、库里、詹姆斯,甚至已逝球星科比进行了辱骂和诋毁。除此之外还扬言自己已经感染新冠病毒,不想继续打球。 不当言论一经发布,就引起了大家的关注,有些网友对字母哥的言论进行谴责,还有些对此持怀疑态度,毕竟作为公众人物来讲,稍有理智也不会发布如此不当的言论。 字母哥澄清:推特账号被黑客盗用 事件发生后,字母哥的社交账号内容进行了及时删除,随后字母哥的弟弟科斯塔斯以及雄鹿官方纷纷发表申明,称字母哥账号被盗。字母哥本人也在第一时间进行了回复: “嘿大家好!我回来了,也想为今天早些时候社交媒体上的一些事情做些澄清!我被...
- 下一篇
2020 有哪些不容错过的前端技术趋势?
导读:2019 年的大前端热闹非凡,Serverless,Flutter,Vue3.0,桌面应用开发,小程序,WebAssembly 的火爆发展还是超乎我们预期,2020 的大前端又有哪些不容错过的技术趋势呢? 四位技术人不四、杜欢、海波和堂主对 2020 年前端发展趋势进行了展望,同时也阐述 2020 年前端从业者可能将要面临的挑战。 不四 蚂蚁金服高级前端技术专家,语雀产品技术负责人 杜欢 阿里云战略 & 合作部 高级前端技术专家、阿里巴巴经济体前端 Serverless 研发升级项目负责人 海波 网易云音乐前端负责人 堂主 政采云前端负责人 Q1:在 2019 年大前端领域,您印象最深刻或者最重要的一件事情是什么? 不四:随着大前端领域开始进入深水区,越来越多的资源开始往两端倾斜,Low Code 领域解决大量营销活动和中
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS关闭SELinux安全模块
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音