3.SpringCloud:Nacos配置中心

Nacos既提供注册中心,也提供配置中心。下面分别以两个例子来说明配置中心的使用。

目录

案例一:配置中心使用

人工在Nacos配置内容

客户端使用

案例二:配置拆分与复用

背景

配置拆分复用说明

对pom.xml增加依赖

删除application.properties,增加bootstrap.properties

启动

调用验证

附1:Nacos config客户端临时暂存目录

附2:Nacos config隔离层次概念

附3:显示写入Nacos config配置中心及监听代码示例


案例一:配置中心使用

人工在Nacos配置内容

在Nacos中人工定义如下

Data ID:    firstapp-dev.properties

Group  :    DEFAULT_GROUP

配置格式:    Properties

配置内容:   weather=sun
           temperature=20.55

 其中Data ID的命令规则为:应用名-环境profile名.文件后缀

  • 应用名(Data ID前缀):默认为  ${spring.appliction.name}, 也可以使用${spring.cloud.nacos.config.prefix}来配置
  • 环境profile名:既${spring.profiles.active}指定的环境。  若不区分环境,则本内容既前面的中划线都可以不用存在。
  • 文件后缀:既SpringBoot中配置文件扩展名,也是Nacos中的配置格式。

客户端使用

新建一个project或者module。 在生成的默认pom.xml增加nacos-configbootstrap依赖。如下

<?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.6.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>firstapp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>firstapp</name>
    <description>firstapp</description>
    <properties>
        <java.version>1.8</java.version>
        <springcloud.version>3.1.5</springcloud.version>
        <springcloudalibaba.version>2021.0.4.0</springcloudalibaba.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>${springcloudalibaba.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.nacos</groupId>
                    <artifactId>nacos-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>${springcloudalibaba.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.nacos</groupId>
                    <artifactId>nacos-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>1.4.5</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>${springcloud.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 创建bootstrap.properties文件(与application.properties文件同目录存放),bootstrap.properties加载顺序先于application.properties 。

bootstrap.properties文件内容如下:

spring.application.name=firstapp

#Data ID的前缀(如果不指定,则默认取 ${spring.appliction.name})
spring.cloud.nacos.config.prefix=firstapp
#指定为开发环境
spring.profiles.active=dev
#Nacos配置中心服务端的地址和端口(形式ip:port,ip:port,...) 前个地址不可用时,才会自动重连下一个地址
spring.cloud.nacos.config.server-addr=39.100.80.168:8848
#命名空间(由于Nacos自身Bug:若这里显示指定为public会导致高频刷,不显示指定或者指定其他命名空间均正常。 Bug链接 https://github.com/alibaba/nacos/issues/3460)
#spring.cloud.nacos.config.namespace=public
#配置组(如果不指定,则默认为DEFAULT_GROUP)
spring.cloud.nacos.config.group=DEFAULT_GROUP
#指定文件后缀(如果不指定,则默认为properties)
spring.cloud.nacos.config.file-extension=properties

 对SpringBoot启动类中,增加获取配置项并输出的代码。

@SpringBootApplication
public class FirstappApplication {
    public static void main(String[] args) throws InterruptedException {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(FirstappApplication.class, args);
        while (true) {
            String weather = applicationContext.getEnvironment().getProperty("weather");
            String temperature = applicationContext.getEnvironment().getProperty("temperature");
            System.err.println("weather:" + weather + "; temperature: " + temperature);
            TimeUnit.SECONDS.sleep(3);
        }
    }
}

启动运行后,可以看到SpringBoot程序获得了Nacos配置中心的值。

同时,如果在Nacos控制台界面中人工调整配置项的值,SpringBoot会立即自动取得最新值。因为Nacos带自动刷新功能。

可以通过配置 spring.cloud.nacos.config.refresh.enabled=false 来关闭自动刷新

案例二:配置拆分与复用

背景

本案例在前一个案例(https://blog.csdn.net/zyplanke/article/details/120849248)基础上进行注册中心修改。

配置拆分复用说明

在nacos中配置如下三个Data ID:

  • commonshare.properties  放各个服务的公共配置
  • paymentService.properties  放支付服务需要的配置
  • orderService.properties  放订单服务需要的配置

在Nacos中人工定义如上三个Data ID,内容分别如下:

commonshare.properties:

paymentService.properties:

orderService.properties:

对pom.xml增加依赖

   ------ 前面省略 ------
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>${springcloudalibaba.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>${springcloud.version}</version>
        </dependency>
   ------ 后面省略 ------

删除application.properties,增加bootstrap.properties

分别删除payment、order服务下的application.properties文件。

在payment服务下新增bootstrap.properties文件,改为从配置中心获取应用程序的配置,bootstrap.properties内容如下:

spring.application.name=payment

#配置中心服务器地址
spring.cloud.nacos.config.server-addr=39.100.80.168:8848
#Data ID的前缀(如果不指定,则默认取 ${spring.appliction.name})
spring.cloud.nacos.config.prefix=paymentService
spring.cloud.nacos.config.group=DEFAULT_GROUP
#指定文件后缀(如果不指定,则默认为properties)
spring.cloud.nacos.config.file-extension=properties
#通用共享配置的信息
spring.cloud.nacos.config.shared-configs[0].data-id=commonshare.properties
spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].refresh=true

   在order服务下新增bootstrap.properties文件,内容如下:

spring.application.name=order

#配置中心服务器地址
spring.cloud.nacos.config.server-addr=39.100.80.168:8848
#Data ID的前缀(如果不指定,则默认取 ${spring.appliction.name})
spring.cloud.nacos.config.prefix=orderService
spring.cloud.nacos.config.group=DEFAULT_GROUP
#指定文件后缀(如果不指定,则默认为properties)
spring.cloud.nacos.config.file-extension=properties
#通用共享配置的信息
spring.cloud.nacos.config.shared-configs[0].data-id=commonshare.properties
spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].refresh=true

启动

   分别启动payment、order服务。

   可以看到payment服务启动端口为9999(从nacos配置中心获得的端口配置);   可以看到order服务启动端口为8888(从nacos配置中心获得的端口配置)

调用验证

curl http://localhost:8888/consumer/66

调用Order服务成功,返回信息符合预期。

附1:Nacos config客户端临时暂存目录

  • Nacos客户端会将从Nacos服务端的配置下载到客户端本地(若服务端配置有变更,会自动将变更后的下载到客户端本地),作为配置的临时暂存。
  • Nacos客户端在在本地临时暂存的目录为:$HOME/nacos/config/fixed-NacosServerIP_nacos\snapshot\            ($HOME为客户端应用启动用户所在的HOME路径)

附2:Nacos config隔离层次概念

  • namespace:可用于资源完全隔离,不同namespace下的config配置资源不共享,服务不互通(无法发现找到)。可通过namespace实现多租户隔离
  • group:可用于资源分组。在同一namespace下,不同group的config配置资源不共享。 服务不互通(无法无法发现找到)。可通过group实现不同环境隔离
  • cluster_name:在Nacos config配置中心,无此概念。 属于服务注册中心概念

注意1:注册中心和配置中心的Group两者是不同的,各自管各自。

注意2:以上层的设置,对于同一服务实例可以在Nacos注册中心、配置中心分别配置不同group。既同一个服务在向Nacos向Nacos获取配置时申明的group=A,而向Nacos注册服务时申明的group=B,这是允许的。

更多的关于springcloud中nacos config配置项可参加nacos官网:

Nacos config · alibaba/spring-cloud-alibaba Wiki · GitHub

附3:显示写入Nacos config配置中心及监听代码示例

在Java代码中显示的将配置内容写入发布至配置中心

    a、 不使用Springboot Bean方式,通过以下方式直接访问Nacos服务端,向服务端写配置,或者读取配置:

ConfigService configService = NacosFactory.createConfigService(ServerAddrList);
configService.publishConfig("test.properties", "GJS_GROUP" , "aaa.bbb=111\nccc.ddd=222\nxxx=333");
configService.getConfig(String dataId, String group, long timeoutMs);
configService.shutDown();

   b、 若在Springboot Bean中,通过自动注入获得configService对象:

@Autowired
NacosConfigManager nacosConfigManager;


...... 省略 ......
     ConfigService configService = nacosConfigManager.getConfigService();
...... 然后使用该对象操作(省略)......

在Java代码增加对Nacos配置中心的配置项监听

    向Nacos配置中心注册监听器,当Nacos配置中心的配置内容变化时,通过此监听器自动获取最新内容,并更新并保存本类变量中:

/**
 * 向Nacos配置中心注册监听器
 * 当Nacos配置中心的配置内容变化时,通过此监听器自动获取最新内容,并更新并保存本类变量中
 *
 */
@Component
@Slf4j
public class NacosConfigListener {

    public static Map<String, String> exchCodeServiceNameMap = new HashMap<>(2000);

    @Autowired
    private void addNacosConfigListener(NacosConfigManager nacosConfigManager) {
        ConfigService configService = nacosConfigManager.getConfigService();
        try {
            configService.addListener(Global.NacosConfigDataID_ExchCode_ServiceName_Map, Global.NacosConfigGroup_ExchCode_ServiceName_Map,
                    new PropertiesListener() {
                        @Override
                        public void innerReceive(Properties properties) {
                            properties.forEach((key, value) -> exchCodeServiceNameMap.put( (String) key, (String)value));
                            log.info("感知到Nacos配置中心dataID=[{}],group=[{}]发生变化,已将最新配置内容更新至本地对象", Global.NacosConfigDataID_ExchCode_ServiceName_Map,Global.NacosConfigGroup_ExchCode_ServiceName_Map );
                        }
                    });
            log.info("作向Nacos配置中心注册器(监听配置变化)完成");
        } catch (NacosException e) {
            log.error("监听Nacos配置中心遇到异常", e);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/zyplanke/article/details/120860958