微服务开发实战

配置中心 Spring Cloud Config

2019-06-09  本文已影响1人  董二弯

当我们的后台服务逐渐增多,各个服务的配置也越来越多,随之而来的就是一个配置管理问题,各自管各自的开发时没什么问题,到了线上之后管理就会很头疼,到了要大规模更新就更麻烦了。这时候Spring Cloud Config的作用就体现出来了,它是一个统一管理配置的组件。它支持配置统一放在内存中(即本地),也支持放在远程Git仓库中,也支持放在关系型数据库中。在spring cloud config 组件中,分两个角色,一是Config Server,二是Config Client。Config Server用于管理配置并暴露Http API接口,Config Client通过暴露的接口来读取配置文件。
本章依然使用前面讲解其他组件所建的工程,github地址

Config Server从本地读取配置文件

这种方式是本地仓库模式。本地仓库指将所有的配置文件统一写在Config Server工程目录下。现搭建一个Config Server和Config Client,Config Server采用本地仓库模式。

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
 </dependency>
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}
server:
  port: 8090
spring:
  cloud:
    config:
      server:
        native:
          search-locations: classpath:/shared
  profiles:
    active: native
  application:
    name: config-server
name: dzy  #这里仅仅添加一个变量
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
spring:
  application:
    name: eureka-client
  cloud:
    config:
      fail-fast: true  #如果没有读取成功,则执行快速失败
      profile: dev   # 读取的是dev文件
      discovery:
        enabled: true
        serviceId: config-server # config-server的服务实例名称

注意
这里用的必须是bootstrap.yml,而不是application.yml。bootstrap相对于application具有优先的执行顺序。其中配置文件中变量{spring.application.name}和变量{spring.profiles.active},两者以“-”相连,构成了向config server读取的配置文件名。本列中为eureka-client-dev.yml。

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

    @GetMapping("/name")
    public String config() {
        return "I am " + name;
    }
}

Config Server从远程Git仓库读取配置文件

这种模式 Config Server不从本地的仓库读取,而是从Git仓库读取配置。

server:
  port: 8090
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/dzydzydzy/spring-cloud.git #git仓库地址
          search-paths: eureka-client  #为搜索远程仓库的文件夹地址
          username:    #git仓库登录用户名
          password:    #git仓库登录密码
      label: master   # git仓库的分支名
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

构建高可用的Config Server

只需要把Config Server和Config Client向Eureka Server注册,且将Config Server多实例集群部署。

使用Spring Cloud Bus刷新配置

以上的方式当仓库中配置更改时,需要重新启动config client才能实现配置的更改。Spring Cloud Bus的一个功能让这个过程变的简单,当远程git仓库的配置更改后,只需要向某一个微服务实例发送一个post请求,通过消息组件通知其他微服务实例重新拉取配置文件。如图,当远程Git仓库的配置更改后,通过发送“/bus/refresh”Post请求给某一个微服务实例,通过消息组件,通知其他微服务实例更新配置。


image.png
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
spring:
  rabbitmq:
    host:  #rabbitmq服务器ip地址
    port:  #rabbitmq服务器端口
    username: #rabbitmq服务器用户名
    password: #rabbitmq服务器密码
management:
  security:
    enabled: false  #通过消息总线更改配置,需要经过安全验证,这里为了方便先屏蔽安全验证
@RestController
@RefreshScope
public class ConfigController {
    @Value("${name}")
    private String name;

    @GetMapping("/name")
    public String config() {
        return "I am " + name;
    }
}

注意
“bus/refresh"API接口可以指定服务,使用"destination"参数,例如"/bus/refresh?destination=eureka-client:**",即刷新服务名为eureka-client的所有服务实例。

总结

本章学习了为什么要使用Spring Cloud Config,以及Config Server在本地和GitHub上读取配置的两者方式,最后介绍了通过Spring Cloud Bus在不启动服务实例时获取最新的配置。在下一章一起学习服务链路追踪——Spring Cloud Sleuth

上一篇下一篇

猜你喜欢

热点阅读