nacos配置中心的使用
首先是springcloud的版本
- Spring Boot 2.2.3.RELEASE
- Spring Cloud Hoxton.SR3
- Spring Cloud Alibaba 2.2.0.RELEASE
公共模块:gulimall-common 配置阿里巴巴的
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>gulimall</artifactId> <groupId>com.atguigu.gulimall</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>gulimall-common</artifactId> <description>每一个微服务公共的依赖,bean,工具类等</description> <dependencies> <!-- mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.12</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <!-- 导入mysql驱动 --> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.17</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <!-- 服务注册/发现--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- 配置中心来做配置管理--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
整个的业务模块要依赖上面的功能模块
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.atguigu.gulimall</groupId> <artifactId>gulimall-coupon</artifactId> <version>0.0.1-SNAPSHOT</version> <name>gulimall-coupon</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>com.atguigu.gulimall</groupId> <artifactId>gulimall-common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
gulimall-coupon的pom依赖上面的格式,gulimall-coupon的代码结构如下
我们先下载nacos使用本地代码启动
要使用nacos的配置中心,除了上面引入nacos的依赖,springboot版本 阿里巴巴版本一致之外,需要新建一个bootstrap.properties文件
配置nacos的配置
spring.application.name=gulimall-coupon spring.cloud.nacos.config.server-addr=localhost:8848
我们还可以用nacos作为配置中心。配置中心的意思是不在application.properties 等文件中配置了,而是放到nacos配置中心公用,这样无需每台机器都改。
如何使用 Nacos 作为配置中心统一管理配置
引入配置中心依赖
在 resources 目录下创建一个 bootstrap.properties文件并配置
需要给配置中心默认添加一个 数据集 (Data Id) 默认规则: 应用名.properties
给 应用名.properties 添加任何配置
动态获取配置, 给控制层类加上 @RefreshScope 注解, (动态获取并刷新配置)
属性加上 @Value("${配置项的名}")注解, (获取到配置)
默认情况下配置中心需要需要给配置中心默认添加一个 数据集 (Data Id) 默认规则: 应用名.properties,比如上面的应用名称为gulimall_coupon
应用启动的时候默认会从pulilic的命名空间的gulimall_coupon.properties读取配置,配置的格式默认是properties,数据集就默认配置文件的名称
我们可以通过代码来测试在本地新建application.properties,内容格式如下
coupon.user.name=weiyuan coupon.user.age=24
在control中进行访问
@RefreshScope @RestController @RequestMapping("coupon/coupon") public class CouponController { @Autowired private CouponService couponService; @Value("${coupon.user.name}") private String name; @Value("${coupon.user.age}") private Integer age; @RequestMapping("/test") public R test(){ return R.ok().put("name",name).put("age",age); }
这个时候本地访问http://localhost:7000/coupon/coupon/test返回的是本地application.properties中配置的值
接下来,我们再配置中心中进行管理
在public的命名空间下,新一个数据集如下所示
在应用程序中要使用动态获取配置, 给控制层类加上 @RefreshScope 注解, (动态获取并刷新配置)
我们重启启动应用来进行访问
启动日志中可以看到
[fixed-localhost_8848] [subscribe] gulimall-coupon.properties+DEFAULT_GROUP 2022-07-03 09:29:29.222 INFO 40912 --- [ main] c.a.nacos.client.config.impl.CacheData : [fixed-localhost_8848] [add-listener] ok, tenant=, dataId=gulimall-coupon.properties, group=DEFAULT_GROUP, cnt=1 2022-07-03 09:29:29.224 INFO 40912 --- [ main] c.a.n.client.config.impl.ClientWorker : [fixed-localhost_8848] [subscribe] gulimall-coupon+DEFAULT_GROUP 2022-07-03 09:29:29.224 INFO 40912 --- [ main] c.a.nacos.client.config.impl.CacheData : [fixed-localhost_8848] [add-listener] ok, tenant=, dataId=gulimall-coupon, group=DEFAULT_GROUP, cnt=1
访问
接下来我们来使用配置中心的一些高阶使用方法
命名空间 :
用作配置隔离 . (一般每个微服务一个命名空间)
不同的命名空间下, 可以存在相同的 Group 或 Data ID 的配置. Namespace 的常用场景之一是不同环境的配置区分隔离, 例如 开发测试环境和生产环境的资源 (如配置、服务)隔离等.
默认: public(保留空间); 默认新增的所有配置都在 public 空间
可以在 开发、测试、生产 利用命名空间来做环境隔离
每一个微服务之间互相隔离配置, 每一个微服务都创建自己的命名空间, 只加载自己命名空间下的所有配置
命名空间就是为了进行配置隔离的
创建命名空间,创建一个dev的命名空间
在 dev 命名空间下创建gulimall-coupon.properties 配置文件
修改本地微服务的 bootstrap.properties 配置,在本地指定访问的namespace为dev
fixed-localhost_8848-dev] [subscribe] gulimall-coupon.properties+DEFAULT_GROUP+dev 2022-07-03 09:44:54.317 INFO 53276 --- [ main] c.a.nacos.client.config.impl.CacheData : [fixed-localhost_8848-dev] [add-listener] ok, tenant=dev, dataId=gulimall-coupon.properties, group=DEFAULT_GROUP, cnt=1 2022-07-03 09:44:54.318 INFO 53276 --- [ main] c.a.n.client.config.impl.ClientWorker : [fixed-localhost_8848-dev] [subscribe] gulimall-coupon+DEFAULT_GROUP+dev 2022-07-03 09:44:54.319 INFO 53276 --- [ main] c.a.nacos.client.config.impl.CacheData : [fixed-localhost_8848-dev] [add-listener] ok, tenant=dev, dataId=gulimall-coupon, group=DEFAULT_GROUP, cnt=1
这个时候访问为:
fixed-localhost_8848-dev] [subscribe] gulimall-coupon.properties+DEFAULT_GROUP+dev
2022-07-03 09:44:54.317 INFO 53276 --- [ main] c.a.nacos.client.config.impl.CacheData : [fixed-localhost_8848-dev] [add-listener] ok, tenant=dev, dataId=gulimall-coupon.properties, group=DEFAULT_GROUP, cnt=1
2022-07-03 09:44:54.318 INFO 53276 --- [ main] c.a.n.client.config.impl.ClientWorker : [fixed-localhost_8848-dev] [subscribe] gulimall-coupon+DEFAULT_GROUP+dev
2022-07-03 09:44:54.319 INFO 53276 --- [ main] c.a.nacos.client.config.impl.CacheData : [fixed-localhost_8848-dev] [add-listener] ok, tenant=dev, dataId=gulimall-coupon, group=DEFAULT_GROUP, cnt=1
通过namespace的访问,我们能够来使用配置访问的隔离。
也可以为每个微服务配置一个命名空间,微服务互相隔离,比如现在有5个微服务、如gulimall-coupon、gulimall-member,我们可以为每个微服务单独创建对于的命名空间
配置集 :
一组相关或不相关的配置项的集合.
在系统中, 一个配置文件通常就是一个配置集, 包含了系统各个方面的配置. 例如, 一个配置集可以包含了数据源、线程池、日志级别等配置项
配置集ID :
类似于配置文件名,即Data ID
Data Id 通常用于组织 划分系统的配置集. 一个系统或者应用可以包含多个配置集, 每个配置集都可以被一个有意义的名称标识. Data ID 通常采用类 Java 包 (如 com.hgw.tc.refund.log.level) 的命名规则保证全局唯一性. 此命名非强制 .
配置分组 :
默认所有的配置集都属于 DEFAULT_GROUP . 自己可以创建分组, 比如双十一、618、双十二
新建配置指定分组
如
在gulimall-coupon这个命名空间下面,存在两个都是gulimall-coupon.properties的配置集,两个不同的分组
在应用成功可以可可以指定分组
spring.application.name=gulimall-coupon spring.cloud.nacos.config.server-addr=localhost:8848 spring.cloud.nacos.config.namespace=gulimall-coupon spring.cloud.nacos.config.group=1111
最佳实践最终方案 : 每个微服务创建自己的命名空间, 然后使用配置分组区分环境 (dev/test/pord)
如下所示通过分组来区分环境
微服务很很多一个配文件中有很多内容,包涵数据库的配置、redis的配置等,我们可以对配置文件进行拆分。
第一步、将配置文件分为三部分, 配置分组为 dev
datasource.yml : 用来存放数据库配置
mybatis.yml
: 用来存放mybatis的配置
other.yml
: 存放其他配置
spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 application: name: gulimall-coupon server: port: 7000
第二步、修改本地 bootstrap.properties
, 并注释掉原 application.yml
配置文件中所有内容
spring.application.name=gulimall-coupon spring.cloud.nacos.config.server-addr=localhost:8848 spring.cloud.nacos.config.namespace=gulimall-coupon spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml spring.cloud.nacos.config.extension-configs[0].group=dev spring.cloud.nacos.config.extension-configs[0].refresh=true spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yml spring.cloud.nacos.config.extension-configs[1].group=dev spring.cloud.nacos.config.extension-configs[1].refresh=true spring.cloud.nacos.config.extension-configs[2].data-id=other.yml spring.cloud.nacos.config.extension-configs[2].group=dev spring.cloud.nacos.config.extension-configs[2].refresh=true
] c.a.c.n.registry.NacosServiceRegistry : nacos registry, DEFAULT_GROUP gulimall-coupon 192.168.152.1:7000 register finished 2022-07-03 12:41:52.534 INFO 54300 --- [ main] c.a.g.coupon.GulimallCouponApplication : Started GulimallCouponApplication in 27.869 seconds (JVM running for 32.784) 2022-07-03 12:41:52.545 INFO 54300 --- [ main] c.a.n.client.config.impl.ClientWorker : [fixed-localhost_8848-gulimall-coupon] [subscribe] mybatis.yml+dev+gulimall-coupon 2022-07-03 12:41:52.546 INFO 54300 --- [ main] c.a.nacos.client.config.impl.CacheData : [fixed-localhost_8848-gulimall-coupon] [add-listener] ok, tenant=gulimall-coupon, dataId=mybatis.yml, group=dev, cnt=1 2022-07-03 12:41:52.550 INFO 54300 --- [ main] c.a.n.client.config.impl.ClientWorker : [fixed-localhost_8848-gulimall-coupon] [subscribe] other.yml+dev+gulimall-coupon 2022-07-03 12:41:52.550 INFO 54300 --- [ main] c.a.nacos.client.config.impl.CacheData : [fixed-localhost_8848-gulimall-coupon] [add-listener] ok, tenant=gulimall-coupon, dataId=other.yml, group=dev, cnt=1 2022-07-03 12:41:52.554 INFO 54300 --- [ main] c.a.n.client.config.impl.ClientWorker : [fixed-localhost_8848-gulimall-coupon] [subscribe] datasource.yml+dev+gulimall-coupon 2022-07-03 12:41:52.555 INFO 54300 --- [ main] c.a.nacos.client.config.impl.CacheData : [fixed-localhost_8848-gulimall-coupon] [add-listener] ok, tenant=gulimall-coupon, dataId=datasource.yml, group=dev, cnt=1 2022-07-03 12:41:52.560 INFO 54300 --- [ main] c.a.n.client.config.impl.ClientWorker : [fixed-localhost_8848-gulimall-coupon] [subscribe] gulimall-coupon.properties+DEFAULT_GROUP+gulimall-coupon 2022-07-03 12:41:52.560 INFO 54300 --- [ main] c.a.nacos.client.config.impl.CacheData : [fixed-localhost_8848-gulimall-coupon] [add-listener] ok, tenant=gulimall-coupon, dataId=gulimall-coupon.properties, group=DEFAULT_GROUP, cnt=1 2022-07-03 12:41:52.562 INFO 54300 --- [ main] c.a.n.client.config.impl.ClientWorker : [fixed-localhost_8848-gulimall-coupon] [subscribe] gulimall-coupon+DEFAULT_GROUP+gulimall-coupon 2022-07-03 12:41:52.563 INFO 54300 --- [ main] c.a.nacos.client.config.impl.CacheData : [fixed-localhost_8848-gulimall-coupon] [add-listener] ok, tenant=gulimall-coupon, dataId=gulimall-coupon, group=DEFAULT_GROUP, cnt=1
posted on 2022-07-03 12:44 luzhouxiaoshuai 阅读(1227) 评论(0) 编辑 收藏 举报