Spring Cloud Config 统一管理微服务

spring cloud config 简介

spring cloud config为分布式系统外部化配置提供了服务器端和客户端支持,包括Config Server和Config Client两部分,这两部分都实现了对Spring Environment和PropertySource抽象的映射,因此spring cloud config非常适合Spring应用。

Config Server是一个可横向扩展、集中式的配置服务器,用于集中管理应用程序各个环境下的配置,默认使用Git存储配置内容,可实现对配置的版本控制和内容审计。

Config Client是Config Server的客户端,用于操作存储在Config Server中的配置属性,所有的微服务都指向Config Server,各个微服务在启动时,会请求Config Server以获取所需的配置属性,然后缓存这些属性以提高性能。

Spring Cloud Config 统一管理微服务_第1张图片

我们将配置文件放入git或者svn等服务中,通过一个Config Server服务来获取git中的配置数据,而我们需要使用的到配置文件的Config Client系统可以通过Config Server来获取对应的配置。


下面我们通过一个示例来演示一下config是如何被各个微服务系统获取到的。

1.向git中上传示例配置文件

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/taotao?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
jdbc.username=root
jdbc.password=root

文件名分别为:

microservice-dev.properties
microservice-production.properties
microservice-test.properties

内容分别为:

profile=default-1.0
profile=production-1.0
profile=test-1.0

添加依赖

<parent>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-parentartifactId>
    <version>1.5.4.RELEASEversion>
parent>


<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-dependenciesartifactId>
            <version>Dalston.SR3version>
            <type>pomtype>
            <scope>importscope>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-eureka-serverartifactId>
            <exclusions>
                <exclusion>                     
                    <groupId>com.fasterxml.jackson.dataformatgroupId>
                    <artifactId>jackson-dataformat-xmlartifactId>
                exclusion>
            exclusions>
        dependency>
    dependencies>
dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-config-serverartifactId>
    dependency>
    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-bus-amqpartifactId>
    dependency>
dependencies>

<build>
    <finalName>${project.artifactId}finalName>
    <plugins>
        
        <plugin>
            <groupId>org.apache.maven.pluginsgroupId>
            <artifactId>maven-resources-pluginartifactId>
            <configuration>
                <encoding>UTF-8encoding>
            configuration>
        plugin>
        
        <plugin>
            <groupId>org.apache.maven.pluginsgroupId>
            <artifactId>maven-compiler-pluginartifactId>
            <configuration>
                <source>1.8source>
                <target>1.8target>
                <encoding>UTF-8encoding>
            configuration>
        plugin>
    plugins>
build>

2.2 编写ConfigApplication

@EnableDiscoveryClient
@EnableConfigServer //开启配置服务
@SpringBootApplication
public class ConfigApplication {

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

}

2.3 编写yml配置文件

server:
  port: 6688 #服务端口

spring: 
  application:  
    name: microservice-config-server #指定服务名
  cloud:  
    config:
      server:
        git: #配置git仓库地址
          uri: 具体的配置文件的git地址
          #username: 
          #password:
  rabbitmq: #RabbitMQ相关的配置
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

eureka: 
  client:
    registerWithEureka: true #是否将自己注册到Eureka服务中,默认为true
    fetchRegistry: true #是否从Eureka中获取注册信息,默认为true
    serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
      defaultZone: http://cloud:[email protected]:6868/eureka/
  instance: 
    prefer-ip-address: true #将自己的ip地址注册到Eureka服务中
    ipAddress: 127.0.0.1
management:
  security:
    enabled: false #是否开启actuator安全认证

可使用Config Server的端点获取配置文件的内容。

这是我们启动该服务,访问该配置文件,访问路径示例如下(以该配置为例): 

127.0.0.1:6688/microservice-dev.properties

访问路径的写法也有多种方式:

/{application}/{profile}/[label]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
其中{label}是指分支,默认是master。

已上端点都可以映射到{application}-{profile}.properties这个配置文件,{application}表示微服务名称,{profile}表示

对应的Git仓库分支,默认是master。

3. Config Client的搭建 

3.1 添加依赖
<dependency>        <groupId>org.springframework.bootgroupId>        <artifactId>spring-boot-starter-webartifactId>dependency>
<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-configartifactId>
dependency>
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-bus-amqpartifactId>
dependency>

3.2 添加yml配置文件

eureka:
  client:
    serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
      defaultZone: http://cloud:[email protected]:6868/eureka/
spring:
  cloud:
    config:
      name: microservice #对应的配置服务中的应用名称
      profile: dev #对应配置服务中的{profile}
      label: master #对应的分支
      discovery: 
        enabled: true #启用发现服务功能
        service-id: microservice-config-server #指定服务名称
  spring: 
  application:  
    name: itcasst-microservice-config-server #指定服务名
  cloud:  
    config:
      server:
        git: #配置git仓库地址
          uri: http://172.16.55.138:10080/itcast-config-server.git
          #username: xxx
          #password: ooo
  rabbitmq: #RabbitMQ相关的配置
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

注意,这里的yml配置文件是:bootstrap.yml,它和application.yml文件一样,会被spring boot加载,但是bootstrap.yml会优先加载。

3.3 在application.yml文件中添加配置

management:
  security:
    enabled: false #是否开启actuator安全认证

这个时候,我么通过@Value的方式,就可以获取到对应的配置了。

@RefreshScope
@Component//加入到Spring容器
public class JdbcConfigBean {

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    @Value("${jdbc.driverClassName}")
    private String driverClassName;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    @Override
    public String toString() {
        return "JdbcConfigBean [url=" + url + ", username=" + username
                + ", password=" + password + ", driverClassName="
                + driverClassName + "]";
    }

}

再次测试,我们发现当我们修改了git中的配置文件的内容之后,client系统中读取到的属性也是修改之后的了。

到此为止,其架构变成如下:

Spring Cloud Config 统一管理微服务_第2张图片

Config Server 的Git仓库配置

使用spring.cloud.config.server.git.uri指定了一个Git仓库,事实上,该属性非常灵活。

1.占位符支持

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

yml配置文件

server:
  port:8080
spring:
  application:  
    name: microservice-config-server #指定服务名
  cloud:  
    config:
      server:
        git: #配置git仓库地址
          uri: http://172.16.55.138:10080/itcast-config-server.git
          username: xxx
          password: ooo
 

2.模式匹配

模式匹配指的是带有通配符的{application}/{profile}名称的列表,如果{application}/{profile}不匹配任何模式,将会使用

spring.cloud.config.server.git.uri指定URI。

yml配置文件

spring:
    cloud:  
        config:
          server:
            git: #配置git仓库地址
              uri: http://172.16.55.138:10080/itcast-config-server.git              re[os:                 simple:https://github.com/simple/config-repo                 special:                     pattern:special*/dev*,*special*/dev*                     uri:https://github.com/special/config-repo
                 local:                     pattern:local*                     uri:file:/home/configsvc/config-repo

  • 3.搜索模式

    把配置文件放在Git仓库自目录中,此时可使用search-path指定,同样支持占位符。

    spring:
        cloud:  
            config:
              server:
                git: #配置git仓库地址
                  uri: http://git.oschina.net/itmuch/itcast-config-server.git              search-paths:foo,bar*
    
    • 这样,Config Server就会在Git仓库根目录,foo子目录下,所有以bar开始的子目录中查找配置文件。

    • 4.启动时加载配置文件

    • 默认情况下,在配置被首次请求时,Config Server才会clone Git仓库,也可以启动时clone Git       

      spring:
          cloud:  
              config:
                server:
                  git: #配置git仓库地址
                    uri: http://172.16.55.138:10080/zhangzhijun/itcast-config-server.git              repos:                 team-a:                      pattern:microservice-*                     clone-on-start:true
                           uri:http://home/configsvc/config-repo
      

你可能感兴趣的:(spring)