16、SpringCloud实战:Config分布式配置中心

目录

分布式配置中心概述

1、 为什么需要分布式配置中心?;

2、 配置中心的作用:;

Spring Cloud Config简介

新建项目springcloud-config-server

1、 引入配置中心config-server的依赖;

2、 在github/gitee上新建一个远程仓库作为config的远程配置中心;

3、 添加application.yml文件;

4、 添加启动类,在启动类上添加注解@EnableConfigServer;

5、 验证配置中心服务项目是否搭建成功;

新建项目springcloud-config-client

1、 引入config-client依赖;

2、 添加bootstrap.yml配置文件;

3、 添加启动类;

4、 添加Controller获取配置信息;

5、 启动config-client、config-server,将服务注册到统一个注册中心;

6、 配置无需重启获得修改后的配置信息;

6、 1、添加依赖;

6、 2、修改bootstrap.yml配置内容,添加如下内容;

6、 3、Controller类上加@RefreshScope注解;

6、 4、使用postman手动发送一个post请求,主动刷新client端项目;

6、 5、手动刷新client端项目后,重新访问localhost:9022/getConfig即可看到更新后的配置信息;


分布式配置中心概述

1、为什么需要分布式配置中心?

1、 1、配置文件无法统一管理,如数据库连接、redis连接、第三方账号信息等等;

1、 2、无法实时更新;

2、配置中心的作用:

2、 1统一管理配置信息;

使用配置中心管理各个项目的配置信息,而不需要写到每个项目的jar包的resource里,这样修改项目的配置更加方便,否则如果每个项目各自维护自己的配置信息,那么在项目很多的情况下,维护配置信息将是一件令人奔溃的事情

2、 2一处修改处处更新;

修改完后,会在项目中自动更新配置信息,而不需要去每台服务器上重启服务

Spring Cloud Config简介

配置中心为了方便服务配置文件的统一管理,实时更新,所以需要分布式配置中心组件,它就是Spring Cloud Config。它支持配置信息放在配置服务的内存中(即本地),也支持放在远程git仓库。在Spring Cloud Config中分为三个角色,一是远程仓库,二是config server,三是config client。

1、 远程仓库:负责存储配置文件信息;
2、 Configserver:负责拉取远程仓库上的配置文件信息;
3、 Configclient:负责从configserver读取配置信息;

架构图如下:

*

新建项目springcloud-config-server

1、引入配置中心config-server的依赖

<!--config server配置中心依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

2、在github/gitee上新建一个远程仓库作为config的远程配置中心

如:https://gitee.com/xxx/configuration.git

3、添加application.yml文件

server:
  port: 9021

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          #git的仓库地址
          uri:  https://gitee.com/xxx/configuration.git
          #文件路径
          search-paths: config
          #username
          #password
#如果仓库是公开仓库,则可以不配置用户名和密码
eureka:
  instance:
    # 使用ip地址作为host,而不是机器号/电脑名称
    prefer-ip-address: true
    #    Eureka客户端向注册中心发送心跳的时间间隔是1s,默认是30s
    lease-renewal-interval-in-seconds: 1
    #    Eureka服务端在收到一次心跳后等待时间上限是2s,默认是90s
    #    超时将剔出该微服务,也可以在Eureka服务端进行设置
    lease-expiration-duration-in-seconds: 2
  client:
    service-url:
      defaultZone: http://localhost:8060/eureka/

4、添加启动类,在启动类上添加注解@EnableConfigServer

@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer//表示配置中心的服务端
public class ConfigApp {
    public static void main( String[] args ) {
        SpringApplication.run(ConfigApp.class,args);
    }
}

5、验证配置中心服务项目是否搭建成功

启动springcloud-config-server后,访问:http://localhost:9021/application-dev.yml

http://localhost:9021/application-test.yml

前提是对应的git仓库上有对应的文件

springcloud config的url与配置文件的映射关系如下:

/{application}/{profile}[/{label}]

读取yaml文件

/{application}-{profile}.yml #常用

/{label}/{application}-{profile}.yml #常用

读取properties文件

/{application}-{profile}.properties

/{label}/{application}-{profile}.properties

其中label表示分支,不写默认从master分支上读取数据

*

*

可以看到已经config-server搭建成功,从远程仓库拿到了对应的配置文件信息

新建项目springcloud-config-client

1、引入config-client依赖

<!-- 引入config-client依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

2、添加bootstrap.yml配置文件

server:
  port: 9022

spring:
  application:
    name: config-client
  cloud:
    config:
      #分支,默认master
      label: master
      #配置文件名称
      name: application
      #文件名后缀(application-dev.yml)
      profile: dev
      discovery:
        #开启从注册中心获取服务
        enabled: true
        #指定配置中心的服务名称
        service-id: config-server
eureka:
  instance:
    # 使用ip地址作为host,而不是机器号/电脑名称
    prefer-ip-address: true
    #    Eureka客户端向注册中心发送心跳的时间间隔是1s,默认是30s
    lease-renewal-interval-in-seconds: 1
    #    Eureka服务端在收到一次心跳后等待时间上限是2s,默认是90s
    #    超时将剔出该微服务,也可以在Eureka服务端进行设置
    lease-expiration-duration-in-seconds: 2
  client:
    service-url:
      defaultZone: http://localhost:8060/eureka/

配置yml时,注意,config-client中需要用的是bootstrap.yml,bootstrap.yml优先级要对于application.yml

因为bootstrap(系统级)在容器一启动时就会去加载,而application(应用级)在容器启动过程中加载。由于我们需要在容器启动时就去拉取config-server里的配置信息,所以当前的配置文件优先级要更高。

3、添加启动类

@SpringBootApplication
@EnableEurekaClient
public class ConfigClientApp {
    public static void main( String[] args ) {
        SpringApplication.run(ConfigClientApp.class,args);
    }
}

4、添加Controller获取配置信息

@RestController
public class ConfigController {
    
    @Value("${config.name}")
    private  String config;

    @Value("${server.port}")
    private  String port;

    @GetMapping("/getConfig")
    public String getConfig(){
        return "content:" + config + ",port:" + port;
    }
}

config.name是配置在远程仓库的内容

5、启动config-client、config-server,将服务注册到统一个注册中心

访问localhost:9022/getConfig

*

可以看到远程仓库的内容已经被读取出来了

6、配置无需重启获得修改后的配置信息

但是此时在git上修改config.name的内容后,手动刷新/getConfig接口,数据并没有发生变化(未重启config-client),如果不想重启服务就让修改的配置信息生效,此时需要对config-client项目进行改造

6.1、添加依赖

<!--引入spring监控组件-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

6.2、修改bootstrap.yml配置内容,添加如下内容

#暴露监控端点
management:
  endpoints:
     web:
       exposure:
         include: "*"

6.3、Controller类上加@RefreshScope注解

@RestController
@RefreshScope
public class ConfigController {

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

    @Value("${server.port}")
    private  String port;

    @GetMapping("/getConfig")
    public String getConfig(){
        return "content:" + config + ",port:" + port;
    }
}

6.4、使用postman手动发送一个post请求,主动刷新client端项目

http://localhost:9022/actuator/refresh

6.5、手动刷新client端项目后,重新访问localhost:9022/getConfig即可看到更新后的配置信息

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: