springboot+springcloud的学习——Nacos配置管理

Nacos除了可以做注册中心,同样可以做配置管理来使用。

1、统一配置管理

多个服务相同配置或者需要动态调整的配置,可以交给统一的配置中心进行管理,服务从配置 中心拉取配置,

如果需要修改配置,只需要修改配置中心的配置,即可实现服务的批量和动态配置更新。

在nacos中添加配置文件

nacos中添加配置
新建配置
微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动,如果application.yml还没有获取到属性,项目启动就会报错,属性解析异常

spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下
启动流程

读取配置

引入nacos-config依赖
在user-service服务中,引入nacos-config的客户端依赖:

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

添加bootstrap.yaml(服务名、环境、配置中心地址、文件扩展名)
代码中读取配置

然后,在user-service中添加一个bootstrap.yaml文件,内容如下:

spring:
  application:
    # 服务名
    name: user-service
  profiles:
    # 环境
    active: dev
  cloud:
    nacos:
      # nacos 服务端地址
      server-addr: localhost:8848
      config:
        # 文件扩展名
        file-extension: yaml

访问测试
在user-service中的UserController中添加业务逻辑,读取 jdbc.username 配置:

@Value("${jdbc.username}")
private String username;

@GetMapping("/config")
public String config(){
    
    
    return username;
}

总结

2、配置自动刷新

需求:是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新

要实现配置热更新,可以使用两种方式:

方式1: @Value所在类上添加 @RefreshScope

方式2: 使用@ConfigurationProperties注解读取配置

方式1

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

@RestController
@RequestMapping("/user")
@RefreshScope //刷新配置
public class UserController {
    
    

方式2

使用@ConfigurationProperties注解读取配置

在user-service服务中,添加一个类,读取jdbc.username属性:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Configuration
@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {
    
    

    private String username;
    private String password;
}

在UserController中使用这个类:

@Autowired
JdbcProperties jdbcProperties;

@GetMapping("/config")
public String config(){
    
    

    return jdbcProperties.toString();
}

3、多环境配置

开发过程中,同一组配置可能在不同的环境(dev、test、prod…)中,配置的值不一样,如何在多个环境中切换配置?
演示

1)、nacos 配置中心添加 test 环境的配置

添加新的配置

2)、修改当前环境

修改环境
记得将dev修改成test

3)、测试

测试

4、配置共享

当不同环境具有相同的一些配置时,这些配置在每个环境的配置文件中都配置了一份,此时出现了重复配置

如何只配置一次,还能在多个环境中共享配置呢?

其实微服务启动时,会去nacos读取 2 个配置文件,例如:

  • 环境配置: [spring.application.name]-[spring.profiles.active].yaml,例如:user-service-dev.yaml
  • 共享配置: [spring.application.name].yaml,例如:user-service.yaml

1)添加共享配置

添加共享配置:在nacos中添加一个user-service.yaml文件:
添加的共享配置
此时nacos中用户服务有3个配置文件:
配置

2)读取共享配置

在user-service服务中,修改UserController类,读取新添加的属性:

//读取公共配置
@Value("${user.auth}")
private Boolean auth;

@Autowired
JdbcProperties jdbcProperties;

@GetMapping("/config")
public String config(){
    
    
    //return username;
    return jdbcProperties.getUsername()+" - "+auth;
}

之后就可以进行测试。

当nacos、服务本地同时出现相同属性时,优先级有高低之分:最低的是本地配置

5、配置隔离

第一步: 新建namespace

  • 默认namespace只有一个public
    新建的命名空间
  • 新建 dev 和 test 两个命名空间
    新建的空间
    空间

第二步:添加配置

  • 添加user-service.yaml
    添加的配置
    展现

第三步:开发环境添加配置

添加user-service.yaml
条件开发环境的配置
dev的展现

第四步: 读取配置

用户服务读取 test 环境配置

  • 配置文件 bootstrap.yml 读取指定的 namespace 、group
spring:
  application:
    # 服务名
    name: user-service
  #profiles:
    #active: dev # 不需要指定,namespace指定的就是对应环境
  cloud:
    nacos:
      # nacos 服务端地址
      server-addr: localhost:8848
      config:
        file-extension: yaml # 文件扩展名
        namespace: 42b87aee-ed82-4b07-ad0d-6138cf4c0c24 # test 环境的namespace
        group: USER_GROUP # 组名 区分大小写

第五步:测试

namespace下的共享配置

nacos中test环境添加共享配置

命名的共享文件
命名共享展现

在bootstrap.yml中添加配置

spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        namespace: c05434f9-5d25-49ba-be6e-862b21380d25
        group: USER_GROUP
        # 主要是下面这个配置
        # 当前namespace 下各个service 都共享的配置
        shared-configs: 
          - data-id: common.yaml
            group: COMMON_GROUP
            refresh: true  #是否支持应用中可动态刷新, 默认是不支持的。

之后测试。

猜你喜欢

转载自blog.csdn.net/ImisLi/article/details/128745872