likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 52

前言

版本信息

  • 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原有内容:

<?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 依赖:

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

接下来配置 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开启服务发现的功能:

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);
    }

}

编写测试接口

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

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已成功注册进来: 小白学习spring-cloud(二): 集成nacos

创建 nacos-consumer 服务消费者

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

创建 nacos-consumer 模块

引入依赖:

<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 文件

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开启服务发现:

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依赖:
<!--loadbalancer负载均衡器-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
  • 创建RestTemplate,如下:
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服务暴露出来的接口:
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服务,可以看得到服务提供者与服务消费者都已经注册进来:

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

接下来要做的事情是调用 nacos-consumer的接口,输入地址:http://localhost:9002/consumer/getMessage 小白学习spring-cloud(二): 集成nacos 成功调用 nacos-provider接口。

Nacos Config 服务配置中心

创建nacos-config模块

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

配置项Key默认值说明
服务端地址spring.cloud.nacos.config.server-addrNacos Server 启动监听的ip地址和端口
配置对应的 DataIdspring.cloud.nacos.config.name先取 prefix,再取 name,最后取 spring.application.name
配置对应的 DataIdspring.cloud.nacos.config.prefix先取 prefix,再取 name,最后取 spring.application.name
配置内容编码spring.cloud.nacos.config.encode读取的配置内容对应的编码
GROUPspring.cloud.nacos.config.groupDEFAULT_GROUP配置对应的组
文件扩展名spring.cloud.nacos.config.fileExtensionproperties配置项对应的文件扩展名,目前支持 properties 和 yaml(yml)
获取配置超时时间spring.cloud.nacos.config.timeout3000客户端获取配置的超时时间(毫秒)
接入点spring.cloud.nacos.config.endpoint地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
命名空间spring.cloud.nacos.config.namespace常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等
AccessKeyspring.cloud.nacos.config.accessKey当要上阿里云时,阿里云上面的一个云账号名
SecretKeyspring.cloud.nacos.config.secretKey当要上阿里云时,阿里云上面的一个云账号密码
Nacos Server 对应的 context pathspring.cloud.nacos.config.contextPathNacos 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 个属性,分别是 dataIdgroup 以及 refresh
  • 引入依赖

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

<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添加以下配置:

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 是一个配置的唯一标识,格式如下:

${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 来配置。目前只支持 properties 和 yaml 类型。

Nacos 添加配置

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

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

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

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

获取 Nacos 配置

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

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, 用于测试:

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 接口,成功读取到配置信息:

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

动态刷新配置

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

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,然后访问接口:

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

发现配置自动更新了。

多环境隔离(NameSpace)

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

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

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

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

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

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

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

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

bootstrap.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 接口,如下:

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

成功读取配置。

不同业务隔离(Group)

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

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

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

在 bootstrap.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 接口,如下:

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

读取配置成功。

共享配置

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

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

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

注意:dataId的后缀一定要为properties或 yml

  • share-config1.properties的配置为 user.name=lin
  • share-config2.properties的配置为 user.age=50
  • 新建nacos-config-share模块 引入依赖:
<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配置如下:
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,用于接收共享配置,如下:

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,用于接收共享配置,如下:

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, 如下:

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

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

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

转载自:https://juejin.cn/post/7311596602253590554
评论
请登录