欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

day12_SpringCloud(网关、Nacos 配置中心、哨兵组件)-2 Nacos 配置中心

最编程 2024-03-06 08:23:03
...

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

2.1 统一配置管理

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。

在这里插入图片描述

nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

2.2 Nacos入门

2.2.1 Nacos中添加配置

在Nacos服务端创建一个配置,如下所示:

在这里插入图片描述

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

在这里插入图片描述

2.2.2 微服务集成配置中心

微服务需要进行改造,从Nacos配置中心中获取配置信息进行使用。

步骤:

1、在spzx-cloud-user微服务中,引入spring-cloud-starter-alibaba-nacos-config依赖

<!-- nacos作为配置中心时所对应的依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2、在spzx-cloud-user项目的 /src/main/resources/application.yml 配置文件中配置 Nacos Config 地址并引入服务配置

# 配置数据库的连接信息
spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.136.142:8848
  config:
    import:
      - nacos:spzx-cloud-user-dev.yml

2.2.3 读取自定义配置

@Value

通过@Value注解读取自定义配置,如下所示:

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

    @Autowired
    private UserService userService ;

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

    @GetMapping(value = "/findUserByUserId/{userId}")
    public User findUserByUserId(@PathVariable(value = "userId") Long userId , @RequestHeader(name = "Truth")String header) {
        log.info("UserController...findUserByUserId方法执行了... ,header: {} , dateformat: {} " , header , pattern);
        return userService.findUserByUserId(userId) ;
    }

}
@ConfigurationProperties

也可以通过实体类,配合@ConfigurationProperties注解读取自定义配置,代码如下所示:

1、定义一个实体类,代码如下所示:

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

    private String dateformat ;

}

2、在启动类上添加@EnableConfigurationProperties注解,如下所示:

@SpringBootApplication
@EnableConfigurationProperties(value = { PatternProperties.class })
public class UserApplication {

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

}

3、使用该实体类,代码如下所示:

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

    @Autowired
    private UserService userService ;

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

    @Autowired   // 注入实体类
    private PatternProperties patternProperties ; 

    @GetMapping(value = "/findUserByUserId/{userId}")
    public User findUserByUserId(@PathVariable(value = "userId") Long userId , @RequestHeader(name = "Truth")String header) {
        log.info("UserController...findUserByUserId方法执行了... ,header: {} , dateformat: {} " , header , patternProperties.getDateformat());
        return userService.findUserByUserId(userId) ;
    }

}

2.3 配置热更新

我们最终的目的,是修改Nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。实现配置的热更新有两种方式:

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

在这里插入图片描述

方式二:通过实体类,配合@ConfigurationProperties注解读取配置信息,自动支持热更新

2.4 配置内容共享

如果多个环境存在相同的配置,那么此时就可以将相同的配置抽取到一个新的配置中,然后在微服务中再次导入新的配置。那么此时就实现了多环境配置共享。

案例演示:

1、在Nacos上创建一个不带环境的配置

在这里插入图片描述

2、微服务读取共享配置,在实体类中添加对应的属性

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

    private String dateformat ;
    private String envSharedValue ;		// 读取共享配置属性

}

3、在微服务的配置文件中,通过spring.config.import导入最新的配置

spring:
  config:
    import:
      - nacos:spzx-cloud-user-dev.yml
      - nacos:spzx-cloud-user.yml       # 导入共享配置
# 项目中的配置提取时,所有的环境都相同的配置我们会抽取到一个公共配置中
# 其他的不同值的配置 会创建不同命名空间、分组、环境后缀的配置文件编写配置
#  项目中可以引入公共配置&当前环境需要的配置文件

2.5 配置优先级

思考问题:如果在application.yml文件中和Nacos配置中心中都定义了相同的配置内容,那么哪一个配置的优先级较高呢?

优先级顺序:Nacos配置中心的配置(后导入的配置 > 先导入的配置) > application.yml