SpringCloud统一配置中心

时间:2024-04-02 08:06:16

在微服务中会有很多服务,每个服务中都会有一个配置文件,并且有些配置是一样的。

**例如:**在实际项目中,我们创建了用户和订单两个服务,这两个服务是同一个数据库,那么我们在这两个服务的配置文件都会配置相同的数据源,一旦我们的数据库地址发生改变(只是一种情况),用户和订单两个服务的配置文件都需要改,这还是只是两个服务,在一个大型系统(比如淘宝),将会有成千上万个服务,按照这种方式代价无疑是巨大的。

不过无需担心,正所谓上有政策,下有对策,既然有这个问题,就一定会有解决方案,那就是创建一个配置中心,专门用于管理系统的所有配置,也就是我们将所有配置文件放到统一的地方进行管理。

Spring Cloud Config 是一个高可用的分布式配置中心,它支持将配置存放到内存(本地),也支持将其放到 Git 仓库进行统一管理。

SpringCloud统一配置中心
配置中心的流程是通过config-server从远端git上拉取配置,并保存在本地git,再将由其他服务调用。

config server搭建

创建git仓库

在github创建一个order.yml,此处就不展示了。

新建一个config工程,为config server端

1、添加依赖

添加config server 依赖

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-config-server</artifactId>
</dependency>

添加服务注册客户端依赖

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、配置文件

1)配置服务名
2)注册中心配置
3)Git远程地址配置

spring:
  application:
    name: config
  cloud:
    config:
      server:
        git:
          uri: https://github.com/taojin1122/spring-cloud-config/
          username: [email protected]
          password: xxxxxxxxxx
eureka:
  client:
    service-url:
        defaultZone: http://localhost:8761/eureka
3、启动类添加注解

启动类上添加config server注解@EnableConfigServer

@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer
public class ConfigApplication {

   public static void main(String[] args) {
      SpringApplication.run(ConfigApplication.class, args);
   }
}
4、测试

访问:http://localhost:8080/order-a.yml ,结果如图
SpringCloud统一配置中心
如果直接访问:http://localhost:8080/order.yml 会提示404错误。这是因为根据地质进行查询时是根据以下两种方式查找的:

1、/{name}-{profiles}.yml
2、/{label}/{name}-{profiles}.yml

Name 表示文件名
Profiles 表示环境
Lable 表示分支(branch)

当我们请求远程git仓库地址时,会同时拉取到本地,可以下控制台看到如下结果:
SpringCloud统一配置中心
这里的git仓库地址时系统自动创建的,如有需要我们可以对git仓库生成地址进行设置。

spring.cloud.config.server.git.basedir = #目录地址

config client 使用

这里以订单服务为例

1、引入config client依赖
   <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
   </dependency>
2、配置文件

这里需要将配置文件application.yml改为bootstrap.yml
因为spring boot 默认执行的配置文件application.yml项目启动之后,就会直接加载。
而bootstrap.yml在spring boot中会优先加载,且bootstrap中的属性不会被覆盖。

spring:
  application:
    name: order
  cloud:
    config:
      discovery:
        enabled: true
        service-id: CONFIG
      profile: dev
  • enabled:设置true,开启config。
  • service-id : config server 服务的服务名
  • profile:环境dev,test等
3、测试

项目启动成功,说明配置成功。
自己可以通过HTTP请求,测试能否读取到配置中的属性值。

可以通过启用多个config server 服务,达到config统一配置中心的高可用。

问题

1、如果Eureka服务的端口不是8761,而是其他的。这个时候,其他服务,服务中心地址应该配置在本地配置文件中。而不是配置在远端git上。
这是因为服务启动时,会把服务注册到Eureka上,而又因为配置中没有服务注册地址,这样服务就不会被注册到Eureka上。进而不能通过服务,进行配置中心的访问。

SpringCloud Bus 自动刷新配置

在修改远程git之后,order订单服务并没有得到通知。这里我们通过消息队列的方式,实现config-server和服务之间的消息互通。
SpringCloud统一配置中心
config-server实现bus依赖之后,会对外提供一个HTTP接口 /bus-refresh,调用这个接口config-server就会把更新的配置的信息发送到MQ里面。
1、在config-server和config-client端加入依赖:

  <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
  </dependency>

2、启动项目,可以在Rabbitmq中看到有两个队列注册。
SpringCloud统一配置中心
3、配置文件配置
config-server端配置如下,* 表示暴漏所有接口

management:
  endpoints:
     web:
       exposure:
         include: "*"

config-client不需要其他配置,但需要在使用配置的地方添加注解@RefreshScope

@RestController
@RefreshScope
public class EnvController {
    @Value("${env}")
    private String env;
    @GetMapping("/env")
    public String print(){
        return env;
    }
}

4、在修改远端git配置后,需要先在cmd命令中访问该地址:http://localhost:8080/actuator/bus-refresh ,然后再访问获取配置的接口。

curl -v -X POST "http://localhost:8080/actuator/bus-refresh"

SpringCloud统一配置中心
此时达到的手动刷新配置,但是每次修改配置都需要访问/bus-refresh接口,并没有达到自动刷新的情况。
为了达到自动刷新,我们可以将外网可以访问的 http://网址/monitor接口地址设置在webhook中,每次文件发生变动,都会自动发起post请求。

  • config组件提供了用于webhook的路由monitor
  • content Type选择 application/json
    SpringCloud统一配置中心