likes
comments
collection
share

SpringCloud-配置中心

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

一、配置中心简介

配置中心是一种用于集中管理微服务的配置信息的工具。它可以帮助开发团队在不同环境中轻松地管理和更新配置信息,如数据库连接信息、服务端口、日志级别等。通过配置中心,开发团队可以实现配置的集中管理、动态更新和版本控制,从而提高微服务的灵活性和可维护性

1. 微服务的配置问题

首先我们来看一下,微服务架构下关于配置文件的一些问题:

  1. 配置文件相对分散,不利于维护。

    在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。

  2. 配置文件不方便区分环境。

    微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。

  3. 配置文件无法实时更新。

    我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。

基于上面这些问题,我们就需要配置中心的加入来解决这些问题。

  1. 可以统一管理配置文件

  2. 配置文件可以区分环境。给每个微服务设置多个配置文件,在启动微服务时,可以设置拉取指定的配置文件

    比如:一个微服务,在配置中心提供多个配置文件。一个开发环境的配置文件,一个测试环境的配置文件,一个生产环境的配置文件

    然后:在启动微服务时,可以指定要拉取哪个环境的配置文件

  3. 配置文件可以实时更新,不需要重启微服务

2. 配置中心的思路是

  • 首先把项目中各种配置全部都放到一个集中的地方进行统一管理。
  • 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
  • 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。

SpringCloud-配置中心

SpringCloudAlibaba Nacos本身就可以管理配置文件。

我们只要把配置文件放到nacos上,微服务就可以从nacos里拉取配置、实现配置的动态刷新了

二、配置中心Nacos入门

SpringCloud本身提供了一种配置中心:SpringCloudConfig,使用相对麻烦

SpringCloudAlibaba提供了配置中心:Nacos,使用更简单

1. 使用步骤

  1. 把配置文件托管到配置中心Nacos

  2. 修改微服务

    添加依赖坐标nacos-config 删除application.yaml,创建bootstrap.yaml, 在bootstrap.yaml里,配置 从哪拉取配置文件

  3. 启动微服务,测试功能是否正常

2.示例

把配置文件托管到nacos

  1. 新增配置

SpringCloud-配置中心

  1. 设置配置信息

SpringCloud-配置中心

注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。

​ 基本不会变更的一些配置还是保存在微服务本地比较好。

从nacos上拉取配置

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

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

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

SpringCloud-配置中心

添加依赖坐标

  • 在用户服务的pom.xml中,添加nacos配置中心的坐标
  • 注意:一旦引入了nacos配置中心的坐标,就必须有bootstrap.yaml配置文件
<!--nacos配置-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

添加bootstrap.yaml

  • 先把用户服务的application.yaml删除掉(配置文件的所有内容,都已经托管到nacos上了)
  • 再给用户服务创建bootstrap.yaml。注意:名称必须是bootstrap
spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 #配置中心nacos的地址
        prefix: user-service # 要加载的配置文件,{application}部分
        file-extension: yaml # 要加载的配置文件,{extension}后缀名部分
  profiles:
    active: dev # 激活的环境名称,配置文件中{profile}部分

3) 测试

打开浏览器,所有功能都可以正常使用,说明已经成功拉取到了配置参数

打开浏览器,访问 http://localhost:8080/user/company,可以看到公司名称,也说明成功拉取到了配置参数

三、配置参数的动态刷新

Nacos支持动态刷新配置,也叫热更新:只要在nacos里修改了配置,微服务不需要重启,就会自动拉取最新的配置参数。

有两种实现方案:

  • 方案1:使用@Value获取参数值,并在bean对象上添加注解@RefreshScope
  • 方案2【推荐】:使用@ConfigurationProperties封装配置参数,会自动拉取最新配置

方案1: @Value和@RefreshScope

  1. 在UserController里读取参数
    • 在UserController里使用@Value读取了company.name配置参数
    • 在UserController上添加注解@RefreshScope
@RestController
@RefreshScope
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @Value("${company.name}")
    private String companyName;

    @GetMapping("/{id}")
    public User findById(@PathVariable("id") Long id) {
        return userService.findById(id);
    }

    @GetMapping("/company")
    public String company(){
        return companyName;
    }
}
  1. 打开浏览器访问 http://localhost:7070/user/company,先查看一下company.name原始值

  2. 在nacos里修改company.name的值

    company.name的值修改为“传智教育”

  3. 打开浏览器刷新 http://localhost:7070/user/company,可以看到已经得到最新的值了

方案2: @ConfigurationProperties

  1. 创建Company类,用于封装配置参数
@Data
@ConfigurationProperties(prefix = "company")
public class Company {
    private String name;
}
  1. 在引导类上添加 @EnableConfigurationProperties,启动Company类
@EnableConfigurationProperties(Company.class)
@EnableDiscoveryClient
@SpringBootApplication
@MapperScan("com.itheima.user.mapper")
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}
  1. 修改UserController

    去掉@RefreshScope注解

    注入Company对象

    添加方法,浏览器访问时,把Company对象返回给客户端 显示到页面上

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @Value("${company.name}")
    private String companyName;

    @Autowired
    private Company company;

    @GetMapping("/{id}")
    public User findById(@PathVariable("id") Long id) {
        return userService.findById(id);
    }

    @GetMapping("/company")
    public String companyStr(){
        return companyName;
    }

    @GetMapping("/companyObj")
    public Company companyObj(){
        return company;
    }
}
  1. 功能测试

    先打开浏览器访问 http://localhost:8080/user/companyObj,查看原始参数值

    在Nacos里修改company.name的值

    再打开浏览器,直接刷新页面,可以看到参数值已经变成最新的了

四、配置共享

在实际开发中,一个服务通常有多个配置文件。在不同环境中,只要激活对应的配置文件即可。例如:

  • user-service-dev.yaml:作为用户服务的开发环境配置
  • user-service-test.yaml:作为用户服务的测试环境配置
  • user-service-prod.yaml:作为用户服务的生产环境配置

但是这多个环境的配置文件中,可能有大部分配置参数都是完全相同的,如果在每个文件里都复制一份的话,修改维护起来会比较麻烦,这时候可以使用共享的配置文件的:

  • 再创建一个user-service.yaml:不带环境标识的配置文件,会被所有环境共享

1. 准备多环境配置

准备dev和test两个配置文件

在Nacos配置中心里已经有了user-service-dev.yaml

我们再增加一个配置文件 user-service-test.yaml,内容如下:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///cloud_user?useSSL=false
    username: root
    password: mysql
logging:
  level:
    com.itheima.user: debug
  pattern:
    dateformat: HH:mm:ss.SSS
company:
  name: test

准备多环境的启动链接

在idea里创建dev和test的启动链接,创建方式如下:

  • dev环境,激活dev
  • test环境,激活test

SpringCloud-配置中心

2. 多环境配置共享

创建共享配置文件

在Nacos的配置中心里,创建一个用户服务的共享配置文件

SpringCloud-配置中心

读取配置参数值

修改UserController,读取共享配置项aaa的值

@RestController
@RequestMapping("/user")
public class UserController {
	...略...;
    
    @Value("${aaa}")
    private String shareValue;
    
    @GetMapping("/share")
    public String share(){
        return shareValue;
    }
}

启动测试

同时启动两个环境的用户服务,

打开浏览器访问:

3. 配置共享的优先级

实际开发中,通常是:

  • 在项目内使用bootstrap.yaml中配置 不变的、不需要修改的参数
  • 在配置中心里配置可能变化的、可能修改的参数

当nacos、服务本地同时出现相同属性时,优先级高的生效。优先级从高到低如下:

  1. Nacos里的服务名-{profile}.yaml:Nacos里激活的某一环境的配置文件
  2. Nacos里的服务名.yaml:Nacos里的共享配置文件
  3. 本地的application-{profile}.yaml
  4. 本地的application.yaml
转载自:https://juejin.cn/post/7362789570217738303
评论
请登录