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编辑  收藏  举报

导航