小白学习spring-cloud(二): 集成nacos

前言

版本信息

  • java版本:17.0.8
  • maven版本:3.9.2
  • 系统版本:win11 64位
  • spring-cloud版本:2021.0.4
  • spring-boot版本:2.6.12

项目使用的是spring-boot-dependencies,不是spring-boot-starter-parent

集成nacos

新建spring-boot项目

使用Spring Initializr创建spring-boot项目,下载打开,删除除了pom.xml.gitignore以外的所有文件。

将以下内容覆盖pom.xml原有内容:

pom 复制代码
<?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>
    <groupId>com.example</groupId>
    <artifactId>spring-cloud-learning</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>spring-cloud-learning</name>
    
    <properties>
       <java.version>1.8</java.version>
       <lombok.version>1.18.26</lombok.version>
       <log4j.version>1.2.17</log4j.version>
       <fastjson2.version>2.0.14</fastjson2.version>
       <fastjson.version>1.2.49</fastjson.version>
       <hutool-all.version>5.7.13</hutool-all.version>
       <commons-lang3.version>3.12.0</commons-lang3.version>
       <jjwt.version>0.9.0</jjwt.version>
       <nimbus-jose-jwt.version>9.23</nimbus-jose-jwt.version>
       <tencentcloud-sdk-java.version>3.1.270</tencentcloud-sdk-java.version>
       <spring-boot.version>2.6.12</spring-boot.version>
       <spring-boot-maven-plugin.version>2.7.3</spring-boot-maven-plugin.version>
       <spring-cloud-oauth2.version>2.2.5.RELEASE</spring-cloud-oauth2.version>
       <mybatis-spring-boot.version>2.2.2</mybatis-spring-boot.version>
       <pagehelper-spring-boot.version>1.3.0</pagehelper-spring-boot.version>
       <spring-boot-test.version>2.6.12</spring-boot-test.version>
       <spring-boot-security.version>2.6.12</spring-boot-security.version>
       <spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
       <alibaba.nacos.version>1.4.2</alibaba.nacos.version>
       <spring-cloud.version>2021.0.4</spring-cloud.version>
       <!-- 覆盖SpringBoot中okhttp3的旧版本声明,解决MinIO 8.3.x的依赖冲突 -->
       <okhttp3.version>4.8.1</okhttp3.version>
       <!-- spring-boot原本的okhttp版本 -->
       <okhttp.version>3.14.9</okhttp.version>
    </properties>

    <dependencies>
       <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <scope>runtime</scope>
       </dependency>

       <dependency>
          <groupId>com.squareup.okhttp3</groupId>
          <artifactId>okhttp</artifactId>
          <version>${okhttp3.version}</version>
       </dependency>

       <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>${fastjson.version}</version>
       </dependency>

       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-validation</artifactId>
       </dependency>

       <dependency>
          <groupId>cn.hutool</groupId>
          <artifactId>hutool-all</artifactId>
          <version>${hutool-all.version}</version>
       </dependency>

       <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-lang3</artifactId>
          <version>${commons-lang3.version}</version>
       </dependency>

       <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>${log4j.version}</version>
       </dependency>

       <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>${lombok.version}</version>
          <optional>true</optional>
       </dependency>

       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-configuration-processor</artifactId>
          <optional>true</optional>
       </dependency>
    </dependencies>

    <!--
        https://start.spring.io/actuator/info
        cloud版本一定要和boot版本匹配
        必须以这种方式集成cloud-->
    <dependencyManagement>
       <dependencies>
          <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-dependencies</artifactId>
             <version>${spring-boot.version}</version>
             <type>pom</type>
             <scope>import</scope>
             <exclusions>
                <exclusion>
                   <groupId>com.squareup.okhttp3</groupId>
                   <artifactId>okhttp</artifactId>
                </exclusion>
             </exclusions>
          </dependency>
          <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <version>${spring-boot-test.version}</version>
             <scope>test</scope>
          </dependency>
          <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-dependencies</artifactId>
             <version>${spring-cloud.version}</version>
             <type>pom</type>
             <scope>import</scope>
          </dependency>

          <!-- spring cloud alibaba -->
          <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-alibaba-dependencies</artifactId>
             <version>${spring-cloud-alibaba.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>
             <version>${spring-boot-maven-plugin.version}</version>
             <configuration>
                <skip>true</skip>
             </configuration>
          </plugin>
       </plugins>
    </build>
</project>

这样我们就完成了将spring-boot改造成spring-cloud项目了。

创建 nacos-provider 服务提供者

在上文讲到 nacos 有服务发现的功能,在这里需要两个角色

  • nacos-provider: 注册进入 nacos-server, 对外暴露服务
  • nacos-consumer: 注册进入 nacos-server, 调用 nacos-provider的服务。

创建 nacos-provider模块

由于使用了多模块聚合项目,这里直接添加spring-cloud-starter-alibaba-nacos-discovery 依赖:

pom 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- nacos服务发现 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

配置 yml 文件

配置 yml 首先需要知道每个参数代表的含义,下面是配置列表:

配置项 Key 默认值 说明
服务端地址 spring.cloud.nacos.discovery.server-addr Nacos Server 启动监听的ip地址和端口
服务名 spring.cloud.nacos.discovery.service ${spring.application.name} 注册的服务名
权重 spring.cloud.nacos.discovery.weight 1 取值范围 1 到 100,数值越大,权重越大
网卡名 spring.cloud.nacos.discovery.network-interface 当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址
注册的IP地址 spring.cloud.nacos.discovery.ip 优先级最高
注册的IP地址类型 spring.cloud.nacos.discovery.ip-type IPv4 可以配置IPv4和IPv6两种类型,如果网卡同类型IP地址存在多个,希望制定特定网段地址,可使用spring.cloud.inetutils.preferred-networks配置筛选地址
注册的端口 spring.cloud.nacos.discovery.port -1 默认情况下不用配置,会自动探测
命名空间 spring.cloud.nacos.discovery.namespace 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等
AccessKey spring.cloud.nacos.discovery.access-key 当要上阿里云时,阿里云上面的一个云账号名
SecretKey spring.cloud.nacos.discovery.secret-key 当要上阿里云时,阿里云上面的一个云账号密码
Metadata spring.cloud.nacos.discovery.metadata 使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息
日志文件名 spring.cloud.nacos.discovery.log-name
集群 spring.cloud.nacos.discovery.cluster-name DEFAULT Nacos集群名称
接入点 spring.cloud.nacos.discovery.endpoint 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否集成Ribbon ribbon.nacos.enabled true 一般都设置成true即可
是否开启Nacos Watch spring.cloud.nacos.discovery.watch.enabled true 可以设置成false来关闭 watch

接下来配置 yml 文件:

yml 复制代码
server:
  port: 9001
spring:
  main:
    allow-bean-definition-overriding: true
  application:
    ## 指定服务名称,在nacos中的名字
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        # nacos的服务地址,nacos-server中IP地址:端口号
        server-addr: 127.0.0.1:8848
management:
  endpoints:
    web:
      exposure:
        ## yml文件中存在特殊字符,必须用单引号包含,否则启动报错
        include: '*'

开启服务发现

在启动类添加@EnableDiscoveryClient开启服务发现的功能:

java 复制代码
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }

}

编写测试接口

作为服务提供者,需要提供接口给服务消费者,下面是随意编写的测试接口:

java 复制代码
package com.example.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/nacos")
public class NacosController {

    @GetMapping(value = "/test")
    public String test(){
        return "成功访问服务者接口111";
    }
}

启动项目

项目启动成功后,访问 nacos控制台 -> 服务管理 -> 服务列表,可以看到 nacos-provider已成功注册进来:

创建 nacos-consumer 服务消费者

既然已经有了服务提供者,那么相应的就需要消费者去消费暴露出来的接口,nacos-consumer的创建步骤与nacos-provider类似。

创建 nacos-consumer 模块

引入依赖:

pom 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- nacos服务发现 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
    <!--loadbalancer负载均衡器-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
</dependencies>

配置 yml 文件

yml 复制代码
server:
  port: 9002

spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        # nacos的服务地址
        server-addr: 192.168.159.1:8848
management:
  endpoints:
    web:
      exposure:
        ## yml文件中存在特殊字符,必须用单引号包含,否则启动报错
        include: '*'
# 调用的微服务名称,这里指服务提供者,nacos服务列表里注册的服务名
service-url:
  nacos-provider: nacos-provider

开启服务发现

同样在启动类添加@EnableDiscoveryClient开启服务发现:

java 复制代码
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

编写测试接口

在 Spring Cloud Nacos 2021 以后就没有在默认使用 Ribbon 作为负载均衡器了,而且在Cloud官网中也推荐使用LoadBalancer 作为负载均衡器,对此先引入依赖:

  • 引入 LoadBalancer依赖:
pom 复制代码
<!--loadbalancer负载均衡器-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
  • 创建RestTemplate,如下:
java 复制代码
package com.example.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {
    /**
     * 注入 RestTemplate
     *
     * @return
     */
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}
  • 编写接口调用 nacos-provider服务暴露出来的接口:
java 复制代码
package com.example.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/consumer")
public class NacosController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @Value("${service-url.nacos-provider}")
    private String serviceUrl;

    @GetMapping("/getMessage")
    public String test(){
        //使用 LoadBalanceClient 和 RestTemplate 结合的方式来访问
        ServiceInstance serviceInstance = loadBalancerClient.choose(serviceUrl);
        //调用 nacos-provider 的接口
        String url = String.format("http://%s:%s/nacos/test",serviceInstance.getHost(),serviceInstance.getPort());
        return restTemplate.getForObject(url,String.class);
    }
}

启动项目

启动 nacos-consumer服务,可以看得到服务提供者与服务消费者都已经注册进来:

接下来要做的事情是调用 nacos-consumer的接口,输入地址:http://localhost:9002/consumer/getMessage 成功调用 nacos-provider接口。

Nacos Config 服务配置中心

创建nacos-config模块

Nacos 不只有服务注册与发现的功能,还拥有配置管理的功能, 下面是配置管理的参数列表及代表的含义:

配置项 Key 默认值 说明
服务端地址 spring.cloud.nacos.config.server-addr Nacos Server 启动监听的ip地址和端口
配置对应的 DataId spring.cloud.nacos.config.name 先取 prefix,再取 name,最后取 spring.application.name
配置对应的 DataId spring.cloud.nacos.config.prefix 先取 prefix,再取 name,最后取 spring.application.name
配置内容编码 spring.cloud.nacos.config.encode 读取的配置内容对应的编码
GROUP spring.cloud.nacos.config.group DEFAULT_GROUP 配置对应的组
文件扩展名 spring.cloud.nacos.config.fileExtension properties 配置项对应的文件扩展名,目前支持 properties 和 yaml(yml)
获取配置超时时间 spring.cloud.nacos.config.timeout 3000 客户端获取配置的超时时间(毫秒)
接入点 spring.cloud.nacos.config.endpoint 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
命名空间 spring.cloud.nacos.config.namespace 常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等
AccessKey spring.cloud.nacos.config.accessKey 当要上阿里云时,阿里云上面的一个云账号名
SecretKey spring.cloud.nacos.config.secretKey 当要上阿里云时,阿里云上面的一个云账号密码
Nacos Server 对应的 context path spring.cloud.nacos.config.contextPath Nacos Server 对外暴露的 context path
集群 spring.cloud.nacos.config.clusterName 配置成Nacos集群名称
共享配置 spring.cloud.nacos.config.sharedDataids 共享配置的 DataId, "," 分割
共享配置动态刷新 spring.cloud.nacos.config.refreshableDataids 共享配置中需要动态刷新的 DataId, "," 分割
自定义 Data Id 配置 spring.cloud.nacos.config.extConfig 属性是个集合,内部由 Config POJO 组成。Config 有 3 个属性,分别是 dataId, group 以及 refresh
  • 引入依赖

从 SpringCloud 2020 版本开始bootstrap 文件便失效了,需要手动导入相应的依赖:

pom 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- 配置中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!-- bootstrap 文件生效 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

bootstrap.properties/yml文件优先级高于 application.properties/yml

配置 yml 文件

bootstrap.yml添加以下配置:

yml 复制代码
server:
  port: 9003
  
spring:
  application:
    name: nacos-config
    # 当前环境,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        # nacos的地址,作为配置中心
        server-addr: 127.0.0.1:8848
        ## 配置内容的数据格式,目前只支持 properties 和 yaml 类型,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
        file-extension: properties
management:
  endpoints:
    web:
      exposure:
        # yml文件中存在特殊字符,必须用单引号包含,否则启动报错
        include: '*'

dataId 的含义

dataId 是一个配置的唯一标识,格式如下:

bash 复制代码
${prefix}-${spring.profiles.active}.${file-extension}
  • prefix:前缀,默认是spring.cloud.nacos.config.prefix的值,再是 spring.cloud.nacos.config.name的值, 最后是 spring.application.name的值。
  • spring.profiles.active: 即为当前环境对应的 profile。当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

Nacos 添加配置

Nacos 中 添加一个 user.age配置,如下图:

填写完后点击发布保存配置,如下图:

获取 Nacos 配置

新建一个 entity 用于接收配置:

java 复制代码
package com.example.enity;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

@Component
public class ConfigUser {

    @Value("${user.age}")
    private Integer age;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

新建一个 controller, 用于测试:

java 复制代码
package com.example.controller;

import com.example.enity.ConfigUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/config")
public class NacosConfigController {

    @Autowired
    private ConfigUser configUser;

    @GetMapping("/test")
    public String test() {
        return "current user age is:" + configUser.getAge();
    }
}

启动项目,访问 http://localhost:9003/config/test 接口,成功读取到配置信息:

动态刷新配置

我们肯定不想每次配置完都重启项目,想要实现动态刷新需要添加注解@RefreshScope,将注解标注在对应的类上,如下:

java 复制代码
package com.example.enity;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

@Component
@RefreshScope // 支持动态刷新配置
public class ConfigUser {

    @Value("${user.age}")
    private Integer age;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

重启项目完毕,修改 Nacos 中的 user.age=20,然后访问接口:

发现配置自动更新了。

多环境隔离(NameSpace)

正常的业务开发分为以下三个环境:

  • dev:本地开发环境
  • test:测试环境
  • prod:生产环境

虽然 dataId能够唯一的区分每一个配置文件,但是当微服务配置多了,很难查找每个环境的配置,因此有了 NameSpace即命名空间来隔离每个环境的配置。

我们创建了以下三个命名空间:

注意:上图中的命名空间ID是系统自动生成的唯一 ID,后续指定不同的Namespace 就用这个 ID。

Nacos 默认的命名空间是 public, 在 test命名空间添加 user.age=20的配置,如下图:

bootstrap.yml 修改配置如下:

yml 复制代码
server:
  port: 9003

spring:
  application:
    name: nacos-config
    # 当前环境,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
  profiles:
    active: test
  cloud:
    nacos:
      config:
        # nacos的地址,作为配置中心
        server-addr: 192.168.159.1:8848
        # 配置内容的数据格式,目前只支持 properties 和 yaml 类型,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
        file-extension: properties
        # 命名空间ID
        namespace: e08e898c-1d86-422e-9120-ff19cf5c78f5
management:
  endpoints:
    web:
      exposure:
        # yml文件中存在特殊字符,必须用单引号包含,否则启动报错
        include: '*'

配置完毕,重启项目访问 http://localhost:9003/config/test 接口,如下:

成功读取配置。

不同业务隔离(Group)

不同的微服务可能有着不同的配置,例如商品系统与订单系统通过分库分别访问不同的数据库,意味着有不同的数据库配置,此时就需要根据Group即组进行配置的区分,例如Goods_GroupOrder_Group, 默认的是 DEFAULT_GROUP

nacos添加配置user.age=40,命名空间为test, 分组为Goods_Group:

bootstrap.yml指定分组,配置如下:

yml 复制代码
spring:
  application:
    name: nacos-config
    # 当前环境,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
  profiles:
    active: test
  cloud:
    nacos:
      config:
        # nacos的地址,作为配置中心
        server-addr: 127.0.0.1:8848
        # 配置内容的数据格式,目前只支持 properties 和 yaml 类型,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
        file-extension: properties
        # 指定命名空间ID
        namespace: e08e898c-1d86-422e-9120-ff19cf5c78f5
        # 指定分组
        group: Goods_Group

重启项目后再次访问 http://localhost:9003/config/test 接口,如下:

读取配置成功。

共享配置

当微服务数量增多,一般会有相同的配置,那如何把相同的配置提取出来实现共享呢?

Nacos添加 share-config1.propertiesshare-config2-properties配置,如下:

注意:dataId的后缀一定要为propertiesyml

  • share-config1.properties的配置为 user.name=lin
  • share-config2.properties的配置为 user.age=50
  • 新建nacos-config-share模块 引入依赖:
pom 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- 配置中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!-- bootstrap 文件生效 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
  • bootstrap.yml配置如下:
yml 复制代码
server:
  port: 9004

spring:
  application:
    name: nacos-config-share
  cloud:
    nacos:
      config:
        # nacos的地址,作为配置中心
        server-addr: 127.0.0.1:8848
        ## 共享配置,List集合,可以配置多个
        shared-configs:
          ## dataId:配置文件的dataId,必须带有后缀
          - dataId: share-config1.properties
            ## refresh:指定是否能够动态刷新,默认是false
            refresh: true
          - dataId: share-config2.properties
            ## 指定配置文件的分组,默认是DEFAULT_GROUP
            group: Goods_Group
        # 命名空间ID
        namespace: e08e898c-1d86-422e-9120-ff19cf5c78f5
management:
  endpoints:
    web:
      exposure:
        # yml文件中存在特殊字符,必须用单引号包含,否则启动报错
        include: '*'

可以看到:

  • 通过 spring.cloud.nacos.config.shared-configs[n].data-id 来支持多个共享 Data Id 的配置。
  • 通过 spring.cloud.nacos.config.shared-configs[n].group 来配置自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
  • 通过 spring.cloud.nacos.config.shared-configs[n].refresh 来控制该Data Id在配置变更时,是否支持应用中动态刷新,默认false。

新建 entity,用于接收共享配置,如下:

java 复制代码
package com.example.enity;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

@Component
@RefreshScope
public class ConfigUser {

    @Value("${user.name}")
    private String name;

    @Value("${user.age}")
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

新建controller,用于接收共享配置,如下:

java 复制代码
package com.example.controller;

import com.example.enity.ConfigUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/config")
public class NacosConfigShareController {

    @Autowired
    private ConfigUser configUser;

    @GetMapping("/test")
    public String test() {
        return "current user name is:" + configUser.getName() + " , and age is:" + configUser.getAge();
    }
}

启动项目,访问 http://localhost:9004/config/test, 如下:

成功访问到 share-config1.propertiesshare-config2.properties的共享配置。

到这里 Nacos的基本用法介绍完毕,了解更多详细信息参考官方Nacos config文档

相关推荐
Gy-1-__7 分钟前
【springcloud】快速搭建一套分布式服务springcloudalibaba(一)
后端·spring·spring cloud
茶本无香1 天前
kafka+spring cloud stream 发送接收消息
spring cloud·kafka·java-zookeeper
陌殇殇1 天前
002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡
java·spring cloud·微服务
m0_675447081 天前
Java版企电子招标采购系统源业码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
java·spring cloud·企业电子招投标系统源码·招投标系统源码
LUCIAZZZ2 天前
EasyExcel快速入门
java·数据库·后端·mysql·spring·spring cloud·easyexcel
黄名富2 天前
Spring Cloud — 深入了解Eureka、Ribbon及Feign
分布式·spring·spring cloud·微服务·eureka·ribbon
LUCIAZZZ2 天前
SkyWalking快速入门
java·后端·spring·spring cloud·微服务·springboot·skywalking
m0_748245172 天前
SpringCloud-使用FFmpeg对视频压缩处理
spring·spring cloud·ffmpeg
黄名富2 天前
Spring Cloud — Hystrix 服务隔离、请求缓存及合并
java·分布式·spring·spring cloud·hystrix·微服务
LUCIAZZZ2 天前
简单说一下什么是RPC
java·网络·网络协议·计算机网络·spring cloud·rpc