目录

1.统一配置管理

2.创建配置

3.拉取配置

 3.1引入依赖

 3.2配置

4.配置热更新

4.1@RefreshScope+@Value

 4.2@ConfigurationProperties

5.多环境配置共享

5.1添加共享配置

 5.2在user-server中读取配置

5.3访问

5.4不同微服务之间环境共享

5.4.1extension-configs属性

5.4.2shared-configs属性

5.5配置优先级


1.统一配置管理

        当微服务实例越来越多,配置就更繁杂,我们需要一个统一配置管理方案,可以集中管理所有实例的配置。最好能及时修改更新,不重启(即热更新)。

2.创建配置

        在 Nacos 中添加配置信息:

         在弹出表单中填写配置信息

写一个日期格式配置

pattern:
  dateformat: yyyy-MM-dd HH:mm:ss:SSS

 注意:项目的核心配置,需要热更新的配置才有放到 nacos 管理的必要。基本不会变更的一些配置(例如数据库连接)还是保存在微服务本地比较好。

3.拉取配置

         在没加入 Nacos 配置之前,获取配置是这样:

         加入 Nacos 配置之后,获取配置是这样:

 

         需要先读取nacos中的配置文件,所以把nacos地址放在application.yml中就不合适了。我们必须找一个比application.yml优先级高的存放nacos地址,所以使用bootstrap.yml

 3.1引入依赖

        在需要的服务user-server引入Nacos的配置管理客户端依赖

<!--nacos配置管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

如果控制台报错!!Param ‘serviceName‘ is illegal, serviceName is blank 说明你的版本不再默认优先加载bootstrap.yml文件,需要添加这个bootstrap依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

 3.2配置

        在user-server中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml。

spring:
  application:
    name: user-server # 服务名称
  profiles:
    active: dev # 环境
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
      config:
        file-extension: yaml # 后缀名

我们使用代码验证是否拉取成功:

在UserController读取日期配置并返回

    @Value("${pattern.dateformat}")
    private String dateformat;

    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }

访问http://localhost:8081/user/now

 配置拉取成功

4.配置热更新

4.1@RefreshScope+@Value

        在@Value注入的变量所在类上添加注解@RefreshScope

如UserController:

 4.2@ConfigurationProperties

         使用@ConfigurationProperties注解读取配置文件内容进行属性绑定

新建一个配置类

@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    //配置属性
    private String dateformat;
}

 在controller曾调用

    @Autowired
    private PatternProperties properties;

    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));
    }

5.多环境配置共享

        微服务启动时会从nacos读取多个配置文件:

  • [spring.application.name]-[spring.profiles.active].yaml,例如:user-server-dev.yaml
  • [spring.application.name].yaml,例如:user-server.yaml

        无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件

5.1添加共享配置

        在nacos控制台新建一个配置文件user-server.yaml:

 5.2在user-server中读取配置

        在配置类添加新属性envSharedValue:

@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
    private String envSharedValue;
}

        修改 UserController,返回PatternProperties对象查看是否读取成功

    @Autowired
    private PatternProperties properties;

    @GetMapping("prop")
    public PatternProperties properties(){
        return properties;
    }

启动两个UserApplication实例,使用不同环境:

  • 第一个UserApplication使用nacos的集中配置user-server-dev.yaml和共享配置user-server.yaml
  • 第二个UserApplication只使用共享配置user-server.yaml

小技巧:修改实例运行环境如使用test测试环境

5.3访问

        http://localhost:8081/user/prop

 

         http://localhost:8082/user/prop

        从结果看出,两个实例都读取了共享配置user-server.yaml的envSharedValue属性和各自所属的环境配置。

5.4不同微服务之间环境共享

        不同微服务之间的环境共享可以通过配置文件实现,有两种方式

        在nacos新建一个配置文件common.yaml

5.4.1extension-configs属性

在user-server

bootstrap.yml

spring:
  application:
    name: user-server # 服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
      config:
        extension-configs: # 多微服务间共享的配置列表
          - dataId: common.yaml # 要共享的配置文件id

 controller

    @Value("${common.commonValue}")
    private String commonValue;

    @GetMapping("common")
    public String common(){
        return commonValue;
    }

在order-server

bootstrap.yml

spring:
  application:
    name: order-server # 服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
      config:
        extension-configs: # 多微服务间共享的配置列表
          - dataId: common.yaml # 要共享的配置文件id

 controller

    @Value("${common.commonValue}")
    private String commonValue;

    @GetMapping("common")
    public String common(){
        return commonValue;
    }

访问 http://localhost:8081/user/common

访问 http://localhost:8080/order/common

        可以看到order-server和use-server读取了相同配置

5.4.2shared-configs属性

         将上述extension-configs属性直接修改为shared-configs属性即可

5.5配置优先级

        当 nacos、服务本地同时出现相同属性时,优先级有高低之分。

        在一个服务中:

 在多服务中:

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐