分布式配置中心服务化 - (Spring Cloud config + Consul)

简介

在分布式服务化的系统中,由于微服务模快的不断增加,为了方便服务配置文件的统一管理和实时更新,所以需要有分布式配置中心组件。至于具体为什么选择spring cloud config ,仁者见仁智者见智,就不一一赘述了。总的来说还是根据系统本身的需求,选择最合适的即是最好的。因为出于项目实际需要,也是现学现卖。而在整合spring cloud config 的过程中,发现与Consul集成的类似示例很少,几乎没有或者是不够详细。配置中心服务化的原理本质上与集成Eureka并无区别,只是在于配置方面稍有不同。以下就从config-server 和 config-client 开始介绍完整实现示例。

项目示例

一、config-server(配置中心服务端)

1、pom.xml 配置文件中加入Consul 依赖


com.demo
config-server
1.0.0
config
project for Spring Boot
jar



    org.springframework.boot
    spring-boot-starter-parent
    1.5.3.RELEASE
    




    UTF-8
    1.8
    Dalston.SR1




    
        
            org.springframework.cloud
            spring-cloud-dependencies
            Dalston.SR2
            pom
            import
        
    




    
    
        org.springframework.boot
        spring-boot-starter-web
        
        
            
                org.springframework.boot
                spring-boot-starter-tomcat
            
        
    
    
    
        org.springframework.boot
        spring-boot-starter-jetty
    
    
    
        org.springframework.cloud
        spring-cloud-starter-config
    
    
        org.springframework.boot
        spring-boot-starter-test
        test
    
    
    
        org.springframework.cloud
        spring-cloud-config-server
        1.3.1.RELEASE
    
    
    
        org.springframework.cloud
        spring-cloud-starter-bus-amqp
    
    
    
        org.springframework.boot
        spring-boot-starter-actuator
    
    
    
        org.springframework.cloud
        spring-cloud-starter-consul-discovery
        1.1.1.RELEASE
    
    
        org.springframework
        spring-context
        4.3.10.RELEASE
    
    
        org.springframework.cloud
        spring-cloud-config-monitor
        1.3.1.RELEASE
    
    
    
        ch.qos.logback
        logback-core
        1.1.7
    
    
        ch.qos.logback
        logback-classic
        1.1.7
        
            
                slf4j-api
                org.slf4j
            
        
    




    
    
        
            ${basedir}/src/main/resources
            false
        
    
    
        
        
            org.springframework.boot
            spring-boot-maven-plugin
            
            
                
                    org.springframework
                    springloaded
                    1.2.5.RELEASE
                
            
        
        
            org.springframework.boot
            spring-boot-maven-plugin
            
                com.demo.core.Application
            

            
                
                    
                        repackage
                    
                
            
        

    

2、Application启动类添加Consul支持注解,将配置服务注册到Consul上去

@EnableDiscoveryClient      //consul服务发现
@EnableConfigServer         //激活配置中心
@SpringBootApplication
public class Application {
   public static void main(String[] args) throws Exception {
       //启动Spring Boot项目的唯一入口
       new SpringApplicationBuilder(Application.class).web(true).run(args);
   }
}

3、application.yml 配置

server:
    port: 8888
spring:
    profiles:
        active: dev
    application:  
     name: config-server #应用程序名称
    cloud:
      config:
        server:
        #git 仓库相关配置
          git:
            uri:  http://x.x.x.x:8082/xxxxx/config.git         #git 仓库地址(当前配置中心微服务的地址,以Gitlab为例)
            search-paths: config-repo                             #配置所在目录(项目中存放配置文件的文件夹)
            username: admin                                #git 用户名
            password: 123456                                   #git 密码
            clone-on-start: true                            #程序启动是否clone远程仓库配置到本地
#关闭安全验证(后续也可以通过集成spring security做安全验证)
management:
  security:
    enabled: false
---
spring:
  profiles: dev
  cloud:
    bus:
      trace:
        enabled: true                                  #spring cloud bus 跟踪总线事件
    #服务发现配置  consul
    consul:
      host: 192.168.1.1                                   #当前环境Consul的IP地址
      port: 8500                                          #当前环境Consul的端口号
      enabled: true                                   #是否启用Consul
      discovery:               
        enabled: true                                 #启用Consul服务发现
        tags: protocol_config
        service-name: config-server                   #该配置服务在Consul中的服务名称
        instance-id: config-server                    #该配置服务在Consul中的实例名称
        hostname: 192.168.1.1                            #该配置服务的服务发现地址与consul.host一致
        port: ${server.port}        
        health-check-interval: 10s                        #Consul健康检查时间间隔
        health-check-url: http://192.168.1.1:8888/health  #Consul健康检查地址,端口与server.port保持一致
        heartbeat:                                        #是否启用Consul的心跳检测
          enabled: true
  rabbitmq:
      host: 192.168.1.1                                   #spring cloud bus基于AMQP实现所以需要配置,此处以Rabbitmq 为例
      username: guest
      password: guest

4、创建配置文件 config-server-dev.properties(在config-repo目录下)

#环境标识
environment=dev

服务端配置完毕,启动Config Server

二、config-client(客户端)

1、pom.xml 配置文件中加入Consul 依赖

com.demo
config-client
3.0.0
jar



    org.springframework.boot
    spring-boot-starter-parent
    1.5.2.RELEASE



    UTF-8
    1.8
    5.1.38
    0.3.0
    1.2.1
    1.1.1
    1.2.11
    4.5.3



    
    
        org.springframework.cloud
        spring-cloud-starter-bus-amqp
    
    
    
        org.springframework.cloud
        spring-cloud-config-client
        1.3.1.RELEASE
    
    
    
        org.springframework.cloud
        spring-cloud-starter-consul-discovery
        1.1.1.RELEASE
    
    
    
        org.springframework.retry
        spring-retry
        1.2.0.RELEASE
    
    
    
        org.springframework.boot
        spring-boot-starter-redis
        1.4.6.RELEASE
    
    
    
        org.springframework.boot
        spring-boot-starter-web
        
        
            
                org.springframework.boot
                spring-boot-starter-tomcat
            
        
    
    
    
        org.springframework.boot
        spring-boot-starter-test
        test
    
    
    
        org.springframework.boot
        spring-boot-starter-jetty
    
    
        org.springframework.boot
        spring-boot-starter-aop
    
    
    
    
        org.springframework.boot
        spring-boot-starter-redis
        1.4.6.RELEASE
    
    
    
        org.springframework.boot
        spring-boot-starter-amqp
        1.5.1.RELEASE
    
    

    
    
    
        com.zaxxer
        HikariCP
        2.6.1
    
    
    
        mysql
        mysql-connector-java
        ${mysql.version}
    
    
    
        com.github.pagehelper
        pagehelper-spring-boot-starter
        ${pagehelper.version}
    
    
    
    
        com.alibaba
        fastjson
        ${version.fastjson}
    
    
        org.apache.httpcomponents
        httpclient
        ${httpclient.version}
    
    
        com.jcraft
        jsch
        0.1.53
    
    
        commons-lang
        commons-lang
        2.6
    
    
        commons-io
        commons-io
        2.5
    
    
    
        ch.qos.logback
        logback-core
        1.1.7
    
    
        ch.qos.logback
        logback-classic
        1.1.7
        
            
                slf4j-api
                org.slf4j
            
        
    
    
    
    
        org.springframework.boot
        spring-boot-starter-freemarker
    




    
        
            org.springframework.cloud
            spring-cloud-dependencies
            Dalston.SR1
            pom
            import
        
    



    
        
            org.springframework.boot
            spring-boot-maven-plugin
        
        
            maven-assembly-plugin
            
                
                    
                        com.allen.capturewebdata.Main
                    
                
                
                    jar-with-dependencies
                
            
        
        
          
            org.apache.maven.plugins  
            maven-surefire-plugin   
               
                true  
              
        
    

2、Application启动类添加Consul支持注解,从Consul发现服务

@EnableDiscoveryClient  //服务发现客户端
@SpringBootApplication
public class Application {

    public static void main(String[] args) throws Exception {

MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true); 
  
  }

}

3、application.yml 配置 (几乎无需配置,当时未抽离数据源)

server:
    port: 7777
spring:
    profiles:
      active: dev
---
spring:
  profiles: dev
  datasource:
    url: jdbc:mysql://192.168.1.1:3306/config-client?characterEncoding=UTF8&useSSL=false&allowMultiQueries=true
    driver-class-name: com.mysql.jdbc.Driver
    type: com.zaxxer.hikari.HikariDataSource

4、bootstrap.yml 配置(spring cloud config 客户端必须配置)

spring:
    application:
        name: client
    profiles:
      active: dev
management: 
  security:
    enabled: false  #关闭安全验证,与服务端一致,若开启同时服务端也需要相关配置
---
spring:
    profiles: dev
    cloud:
        bus:
          trace:
            enabled: true    #与配置服务端一样,客户端也有spring cloud bus 的消息追踪
        consul:
           #配置consul地址与服务端使用的地址一致
           host: 192.168.1.1
           port: 8500
           discovery:
             #需要配置成false,否则系统启动的时候,会向consul注册一个服务
             register: false
        config:
          #获取对应配置中心的某个环境的配置,对应config-server-dev.properties 中的 dev
          profile: dev
          #获取对应配置中心的某个分支的配置,服务端 git 代码分支
          label: master
          #获取对应配置中心的服务名称
          name: config-server
          #服务发现配置
          discovery:
            #启用Consul服务发现
            enabled: true
            #对应配置中心服务实例名称
            service-id: config-server
          #是否快速失败
          fail-fast: true

5、统一管理所有配置(读取配置中心配置)

@RefreshScope    //配置实时刷新所必需注解
@Component
public class PropertiesFile {

    /*配置中心具体配置的Key*/
    @Value("{environment}")
    public String environment;
        
        public String getEnviroment(){
            return   environment;
    }
}

6、获取配置

    //注入配置管理类
    @Autowired
    private PropertiesFile  propertiesFile;


    public String test(){
        //获取配置中心属性值,配置获取均使用get方法
       String enviroment = propertiesFile.getEnvironment();
       return enviroment;
    }

这样就完成了config-server和config-client的全部配置

其他

一、抽离数据源至config-server可参照这里,支持多数据源,已经测试过可以使用,有兴趣的同学可以自行上手。

https://yq.aliyun.com/articles/8302

二、奈何才疏学浅,整个配置中心在应用上并不完善。顺带提一下Spring Cloud Config还有通过加密的方式保护配置信息数据,也可以整合Spring Security 进行安全验证,具体的实现大家可以先自行查阅资料,希望大家多多支持,如果有哪些地方讲得不合理,也希望能指出,大家共同进步。

这么说吧,如果你关心的是结局,是答案,是目的,你就读哲学,但如果你觉得人生的过程可能比答案还要迷人,你就要读文学。 -- 蒋勋 《生活十讲》

你可能感兴趣的:(分布式配置中心服务化 - (Spring Cloud config + Consul))