700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Spring Cloud Alibaba —— Nacos Config 配置中心

Spring Cloud Alibaba —— Nacos Config 配置中心

时间:2023-08-11 16:29:16

相关推荐

Spring Cloud Alibaba —— Nacos Config 配置中心

导航

引言一、什么是配置中心二、常见的配置中心组件三、Nacos Config 入门四、Nacos Config 动态配置4.1 硬编码方式(默认支持动态生效)4.2 属性注入五、配置共享5.1 相同微服务不同环境间共享5.2 不同微服务配置共享六、Nacos Config 的几个概念总结

引言

本文介绍 Nacos 作为注册中心的使用方法,相关文章《Spring Cloud Alibaba——Nacos实现服务治理》。

一、什么是配置中心

在微服务架构中,关于配置信息,存在一些问题。

配置文件相对分散,不好维护。配置文件不好区分开发、测试、生产环境。配置文件无法实时更新。

针对这些问题,引入了配置中心组件,其主要思路是:

集中配置数据,统一管理,提供一套标准接口。由各个服务主动拉取配置中心中的配置信息。动态更新。

二、常见的配置中心组件

Apollo

由携程开源的分布式配置中心。特点很多,如配置实时生效,支持灰度发布功能,并能对所有配置进行版本管理、操作审计等功能,提供开放平台API,文档详尽。Disconf

由百度开源的分布式配置中心,底层基于Zookeeper实现配置变更后的实时通知和生效。Spring Cloud Config

Spring Cloud 自带的配置中心组件。可以和 Spring 无缝衔接,使用方便,并且它 配置存储支持Git 。但缺少可视化的操作界面,配置也无法实时生效,需要重启和刷新。Nacos

Spring Cloud Alibaba 技术栈中的一个组件,Nacos 除了可以做服务注册中心,也兼顾了服务配置中心。

三、Nacos Config 入门

以 Nacos Server 作为 配置中心,各个微服务作为客户端,将微服务中的配置文件统一存放在 Nacos 上,然后各个微服务从 Nacos 上拉取配置。

以 shop-product 微服务为例,简单演示下效果。

1、引入 nacos-config 依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>

2、将配置转移到 Nacos

登录 Nacos 控制台,点击新建配置,将本地配置粘贴到 Nacos 编辑器中,格式选择 yaml。

Data Id 规则

应用名-环境.格式

例如

spring.application.name=service-product

spring.profiles.active=dev

spring.cloud.nacos.config.file-extension=yaml

那么 data Id 就是service-product-dev.yaml

3、引入 bootstrap.yml 文件

bootstrap.yml 作为新的引导文件,用于拉取 Nacos 上的远程配置信息。

spring boot 配置文件优先级

bootstrap.properties > bootstrap.yml > application.properties > application.yml

spring:application:name: service-productprofiles:active: devcloud:nacos:config:server-addr: localhost:8848file-extension: yaml # 配置格式(默认是 properties)

4、测试

启动项目,可以正常访问。

四、Nacos Config 动态配置

4.1 硬编码方式(默认支持动态生效)

硬编码方式通过 Environment 对象提供的 getProperty(key) 来获取配置信息,本身就是支持动态更新的。

@Autowiredprivate ConfigurableApplicationContext applicationContext;@GetMapping("/appName")public String getConfig() {String appName = applicationContext.getEnvironment().getProperty("config.appName");return appName;}

启动程序,请求 appName 接口,获取不到任何数据:

打开 Nacos Config,配置 config.appName 信息,并发布:

直接重新访问,不需要重启,即可取得数据:

4.2 属性注入

使用 @Value("${key}") 的形式完成配置的注入:

@Value("${config.appName}")private String appName;@GetMapping("/appName")public String getConfig() {return appName;}

这种方式可以解决硬编码的高耦合问题,代码也更优雅,是Spring 推荐的使用方式,但是这种方式默认是不支持动态刷新配置的,需要加入额外的一个类注解——@RefreshScope:

@RefreshScope@RestController@RequestMapping("/config")public class ConfigController {@Value("${config.appName}")private String appName;@GetMapping("/appName")public String getConfig() {return appName;}}

五、配置共享

配置共享旨在解决重复配置项的问题。Nacos 支持配置共享,即可以将大家都有的重复配置项提取到共享配置中。

5.1 相同微服务不同环境间共享

相同微服务的不同环境的公共配置,只需要在配置的 Data Id 上去掉诸如 -dev 等环境标识即可。

例如,dev 环境的配置是 service-product-dev.yaml ,test 环境的配置是 service-product-test.yaml,那么公共配置就可以是 service-product.yaml。

把公共的配置信息全部移动到 service-product.yaml 中,service-product-dev.yaml 或 service-product-test.yaml 只保留环境特定的配置项即可。

5.2 不同微服务配置共享

可以单独提取一个公共配置,例如,dataId --> all-service.yaml ,然后在各个微服务的 bootstrap.yaml 中加入如下配置:

spring:cloud:nacos:config:# ...其他配置...shared-dataids: all-service.yaml # 公共配置refreshable-dataids: all-service.yaml # 动态刷新的配置文件

测试,以下几个问题:

通过shared-dataids引入的公共配置是否可以在不同的微服务之间生效?通过shared-dataids引入的公共配置是否可以做到相同微服务不同环境的切换?通过refreshable-dataids 表示的 dataId,是否可以在不使用 @RefreshScope 注解的情况下,直接刷新指定配置文件(不仅是公共也可能是私有配置)的配置项?shared-dataids 和 refreshable-dataids 都是复数形式,如何配置多个 dataId?

在 Nacos Config Server 上指定三个配置文件:all-service.yaml、service-product-dev.yaml 和 service-product-test.yaml。它们的配置信息如下:

all-service.yaml

server:port: 8081tomcat:max-threads: 5spring:application:name: service-productdatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=trueusername: rootpassword: 123456cloud:nacos:discovery:server-addr: localhost:8848jpa:properties:hibernate:hbm2ddl:auto: update#InnoDB方言dialect: org.hibernate.dialect.MySQL5InnoDBDialect

service-product-dev.yaml

config:appName: productenv: dev

service-product-test.yaml

config:appName: productenv: test

本地 bootstrap.yaml 配置:

spring:application:name: service-productprofiles:active: devcloud:nacos:config:server-addr: localhost:8848file-extension: yaml # 配置格式(默认是 properties)shared-dataids: all-service.yaml # 公共配置refreshable-dataids: all-service.yaml # 动态刷新的配置文件

测试代码:

@RestController@RequestMapping("/config")public class ConfigController {@Value("${config.appName}")private String appName;@Value("${config.env}")private String env;@GetMapping("/env")public String getConfig() {return env;}}

启动成功,说明可以获取公共配置,且访问测试接口,可以拿到配置信息:

修改本地 bootstrap.yaml 配置信息:active=test,重新启动,也可以拿到对应的test环境的配置信息:

对于自动刷新问题

对于 refreshable-dataids 配置,只针对公共配置有效。自动刷新的生效规则如下:

环境配置

必须使用 @RefreshScope 的方式动态生效,且不需要增加其他额外配置

公共配置

不仅要使用 @RefreshScope,还要增加 refreshable-dataids 令其支持自动刷新

如果想引入多个共享配置,可以使用逗号分隔:

spring:cloud:nacos:config:shared-dataids: 'all-service.yaml,common.yaml' # 公共配置refreshable-dataids: 'all-service.yaml,common.yaml' # 动态刷新的配置文件

六、Nacos Config 的几个概念

1、命名空间(Namespace)

命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间。

可以在 Nacos 上新建命名空间:

若希望引用不同命名空间的配置,可以在 bootstrap.yaml 中加入 namespace: 命名空间ID :

spring:cloud:nacos:config:namespace: 835f29bd-4cf8-4bd7-9ace-462a69643bd4

2、配置分组(Group)

配置分组可以将不同的服务归类到同一个分组。一般以项目为单位,这个项目下的所有微服务的配置放到同一个组。

3、配置集(Data ID)

在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集。

总结

如何使用Nacos 配置中心,只需要在项目本地引入 bootstrap.yaml 文件,并配置如下信息,就可以拉取 Nacos Config Server 上的远程配置:

spring:application:name: service-productprofiles:active: testcloud:nacos:config:server-addr: localhost:8848 # Nacos 地址file-extension: yaml # 配置格式(默认是 properties)

关于共享配置,(经过实际测试)有以下几点重要规则:

1、同一微服务,公共配置项,可直接以${spring.application.name}.yaml来命名 DataId,视为共享配置。

1、在本地的 bootstrap.yaml 中使用 shared-dataids 和 refreshable-dataids 来指定共享配置

2、多共享配置的格式(注意引号):shared-dataids: ‘all-service.yaml,common.yaml’

3、refreshable-dataids 用于设置共享配置是否支持动态刷新,至于要不要动态刷新还需要使用 @RefreshScope 。也就是说,如果希望共享配置动态刷新,不仅要指定 refreshable-dataids,还需要配置 @RefreshScope。

4、环境配置的动态刷新只受 @RefreshScope 影响,不需要额外指定 refreshable-dataids。

5、配置重复问题。多个共享配置都包含重复的配置项,则以 bootstrap.yaml 中 shared-dataids 配置项靠后的共享配置为准。如两个共享配置 all.yaml 和 common.yaml,都包含 appName 配置项,如果 shared-dataids=‘all.yaml,common.yaml’,则以 common.yaml 中的配置信息为准。

共享配置和环境配置的配置项重复,以环境配置的配置项为准。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。