【SpringCloud】Nacos注册中心、配置中心用法与原理(下)

上集回顾

二、Nacos 配置中心

1. 统一配置管理

(1)在 Nacos 中添加配置文件

(2)从微服务拉取配置

2. 配置热更新

方式一:使用 @RefreshScope注解

方式二:使用 @ConfigurationProperties注解代替 @Value注解

3. 配置共享

(1)添加一个环境共享配置

(2)在user-service中读取共享配置

(3)运行两个UserApplication,使用不同的profile

(4)配置共享的优先级

4. 搭建Nacos集群


【SpringCloud】Nacos注册中心、配置中心用法与原理(下)

上集回顾

【SpringCloud】Nacos注册中心、配置中心用法与原理(上)_面向架构编程的博客-CSDN博客https://blog.csdn.net/weixin_43715214/article/details/128740974

二、Nacos 配置中心

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

1. 统一配置管理

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置非常的麻烦,而且很容易出错!

所以,我们需要一种统一配置管理方案,可以集中管理所有实例的配置,而且还要实现热更新,即无需重启项目就可以让配置生效

Nacos 就实现了这个功能!一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新

Nacos 配置中心的图形化界面

(1)在 Nacos 中添加配置文件

然后在弹出的表单中,填写配置信息

Data ID命名规则一般是:服务名称-项目运行环境(开发).yaml ” 

注意:

项目的核心配置,需要热更新的配置才有放到 Nacos 管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。

(2)从微服务拉取配置

微服务要拉取 nacos 中管理的配置,并且与本地的 application.yml 配置合并,才能完成项目启动。

【问】但如果尚未读取 application.yml,又如何得知 nacos地址呢?

Spring引入了一种新的配置文件:bootstrap.yaml文件,会在 application.yml 之前被读取!

也就是说,我们可以把 nacos的地址、文件相关信息 配置在 bootstrap.yaml 中,那么,我们就可以完成 Nacos配置的读取!!!

详细流程如下:

a. 引入 nacos-config 依赖

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

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

b. 添加bootstrap.yaml  

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

# 优先级比 application 高!!!
spring:
  application:
    name: userservice
  profiles:
    active: dev  # 环境
  cloud:
    nacos:
      server-addr: localhost:8848  # nacos地址
      config:
        file-extension: yaml  #文件后缀名

注意:这里的文件名一定要是bootstrap,后缀 yml or yaml都行。 

c. 读取nacos配置  

user-service 中的 UserController 中添加业务逻辑,读取 pattern.dateformat 配置

目的:这样子做是为了证明我们刚刚在 Nacos 控制台配置的内容可以生效

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    // nacos 统一配置热加载
    // 获取nacos配置文件 - userservice-dev.yaml
    // 用于证明 nacos 统一配置中心生效!
    @Value("${pattern.dataformat}")
    private String dateformat;

    @GetMapping("now")
    public String now() {
        // 按照我们在nacos上面配置的格式,完成格式化 yyyy-MM-dd HH:mm:ss
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }    
}

8081、8082页面访问,可以看到效果:

8081端口

8082端口

2. 配置热更新

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

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

方式一:使用 @RefreshScope注解

@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope // 开启 nacos 属性刷新
public class UserController {
    ......
}

方式二:使用 @ConfigurationProperties注解代替 @Value注解

@ConfigurationProperties

这个注解可以完成配置的自动加载!采用的是约定大于配置的方式,只要 @ConfigurationProperties(prefix = "pattern") 中的 前缀名+变量名和配置文件一致,就可以完成属性的自动注入!!!

在user-service服务中的 config包下新建一个 PatternProperties类,读取 patterrn.dateformat属性

PatternProperties类

/**
 * @ConfigurationProperties: 这个注解可以完成配置的自动加载!
 * 前缀名+变量名和配置文件一致,就可以完成属性的自动注入!!!
 */
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}

UserController类

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    // nacos 统一配置热加载
    @Autowired
    private PatternProperties patternProperties;

    @GetMapping("now")
    public String now() {
        // 按照我们在nacos上面配置的格式,完成格式化 yyyy-MM-dd HH:mm:ss
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
    }
}

3. 配置共享

其实微服务启动时,会去nacos读取多个配置文件

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

  • [spring.application.name].yaml,例如:userservice.yaml

[spring.application.name].yaml不包含环境,因此可以被多个环境共享

所以,我们现在就是要验证 userservice.yaml 能否被多个环境共享

(1)添加一个环境共享配置

我们在 Nacos 中添加一个userservice.yaml文件

(2)在user-service中读取共享配置

修改PatternProperties类,读取新添加的属性

@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {

    private String dataformat;

    private String envShareValue;
}

在user-service服务中,修改UserController添加一个方法  

@Slf4j
@RestController
@RequestMapping("/user")
//@RefreshScope // 开启 nacos 属性刷新
public class UserController {

    // nacos 统一配置热加载
    @Autowired
    private PatternProperties patternProperties;

    // 共享配置
    @GetMapping("prop")
    public PatternProperties properties() {
        return patternProperties;
    }
}

(3)运行两个UserApplication,使用不同的profile

修改UserApplication2这个启动项,改变其active profile值

这样,UserApplication1(8081)使用的profile是dev(开发)UserApplication2(8082)使用的profile是test(测试)

分别启动 UserApplication1 UserApplication2

访问页面  localhost:8081/user/prop

​访问页面 localhost:8082/user/prop

可以看出来,dataformat是配置在dev环境的,所以在test环境中是读不到的。

但是,不管是dev,还是test环境,都读取到了envSharedValue这个属性的值,说明了userservice.yaml 被多个环境共享了!

(4)配置共享的优先级

假如,userservice.yaml 和 userservice-dev.yaml 有一个同名属性时,那么该属性究竟为何值呢???

这就要谈谈配置共享的优先级了!

4. 搭建Nacos集群

【SpringCloud】Nacos集群搭建_面向架构编程的博客-CSDN博客icon-default.png?t=MBR7https://blog.csdn.net/weixin_43715214/article/details/128762945

Logo

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

更多推荐