【转】配置中心篇——SpringCloud Config(配置中心)实现配置自动刷新总结

一、实现原理

1、ConfigServer(配置中心服务端)从远端git拉取配置文件并在本地git一份,ConfigClient(微服务)从ConfigServer端获取自己对应 配置文件;

2、当远端git仓库配置文件发生改变,ConfigServer如何通知到ConfigClient端,即ConfigClient如何感知到配置发生更新?

Spring Cloud Bus会向外提供一个http接口,即图中的/bus/refresh。我们将这个接口配置到远程的git的webhook上,当git上的文件内容发生变动时,就会自动调用/bus-refresh接口。Bus就会通知config-server,config-server会发布更新消息到消息总线的消息队列中,其他服务订阅到该消息就会信息刷新,从而实现整个微服务进行自动刷新。

二:实现方式

实现方式一:某个微服务承担配置刷新的职责


1、提交配置触发post调用客户端A的bus/refresh接口

2、客户端A接收到请求从Server端更新配置并且发送给Spring Cloud Bus总线

3、Spring Cloud bus接到消息并通知给其它连接在总线上的客户端,所有总线上的客户端均能收到消息

4、其它客户端接收到通知,请求Server端获取最新配置

5、全部客户端均获取到最新的配置

存在问题:

1、打破了微服务的职责单一性。微服务本身是业务模块,它本不应该承担配置刷新的职责。2、破坏了微服务各节点的对等性。3、有一定的局限性。WebHook的配置随着承担刷新配置的微服务节点发生改变。

改进如下方式二:配置中心Server端承担起配置刷新的职责,原理图如下:

1、提交配置触发post请求给server端的bus/refresh接口

2、server端接收到请求并发送给Spring Cloud Bus总线

3、Spring Cloud bus接到消息并通知给其它连接到总线的客户端

4、其它客户端接收到通知,请求Server端获取最新配置

5、全部客户端均获取到最新的配置

三:实现步骤

基本步骤:1、添加依赖 2、修改配置文件 3、添加注解

备注:这里给出方式二配置方法,方式一的区别在:因为是某个微服务承担配置刷新的职责,所以Server端不需要配置 Rabbitmq和添加bus-amqp的依赖。

<一>Config Server端配置(提前安装rabbitmq移步链接:)

1、添加依赖

<!-- config-server依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
 
<!-- springcloud-bus依赖实现配置自动更新,rabbitmq -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2、修改配置文件Bootstrap.yml文件

server:
  port: 9090
 
spring:
  application:
    name: config-server
  cloud:                                                  #config服务端,从git拉取数据
    config: 
      server:
        git:
          uri: https://github.com/****/config-repo        # 配置git仓库的地址
          username:                                       # git仓库的账号
          password:                                       # git仓库的密码
          search-paths: /*/*/*,/*                         #仓库下配置文件搜索路径
  rabbitmq:                 #本地环境不需要配置mq,但是需要启动mq,Springboot会自动连接本地mq
    host: localhost
    port: 5672
    username: guest
    password: guest
 
eureka:                         #注册服务
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
      #defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/ #eureka高可用  
 
management:                    #SpringCloud 1.5版本暴露接口,暴露/bus-refresh接口
  security:
    enabled: false
#  endpoints:                  #SpringCloud 2.0.0版本以后暴露接口方式
#    web:
#      exposure:
#        include: "*"
 
security:                       #是否开启基本的鉴权,默认为true
  basic:
    enabled: false

备注:关于git仓库配置那块,参考这篇博客:http://www.cnblogs.com/hellxz/p/9306507.html

本地环境不需要配置mq,但是需要启动mq,Springboot会自动连接本地mq,后面客户端也是,如果是线上环境的话,必须要进行配置,原因看看SpringCloud bus如下说明:


3、启动类增加注解 @EnableConfigServer

至此Config-Server端已配置完毕

<二>Config Client端配置

1、添加依赖

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

2、修改配置文件Bootstrap.yml文件

server:
  port: 9092
 
spring:
  application:
    name: config-client                         #对应微服务配置文件名称
  cloud:
    config:
      uri: http://localhost:9090/                   #config server 端地址
      profile: dev                                      #项目配置文件选择
      label: master                                     #git仓库的分支
      discovery:
        enabled: true
        service-id: config-server                       #config-server服务名称
 
rabbitmq:                               #本地环境不需要配置mq
    host: localhost
    port: 5672
    username: guest
    password: guest
 
security:                                #
  basic:
    enabled: false

3、添加注解: @RefreshScope添加在需要刷新的配置文件上

注明:自动刷新只能刷新 @RefreshScope 注解下的配置,一些特殊配置,如数据库等,需要同样先设置数据库链接ConfigServer类,然后通过加 @RefreshScope 注解方式

到这里Config-Server端和Client端已经配置完毕,先后启动Server端和Client端,post请求方式进行测试:http://localhost:9090/bus/refresh

<三>配置git的webhook

前面已准备就绪,启动Server端和Client端,要实现配置自动刷新需要调用/bus-refresh接口通知config-Server

方式一:手动调用(post请求):http://localhost:9090/bus/refresh(Server端地址)

方式二:配置git的webhook ,当git端配置发生改变,自动调用/bus-refresh接口


<四>附件

config-client-dev.yml配置文件:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://127.0.0.1:3306/test_mybatis_db?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 1234
    driverClassName: com.mysql.jdbc.Driver
    druid:
      initialSize: 5
      minIdle: 5
      maxActive: 20
      maxWait: 60000
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 300000
      validationQuery: SELECT 1
      testWhileIdle: true
      filters: stat,wall,log4j
 
mybatis:
  type-aliases-package: com.scnu.springcloudconfigclient.domain
  mapper-locations: classpath*:mapper/*.xml
 
eureka:                                 #注册服务
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
 
custom:
  username: guest-new
  passwd: guest-new
  
profile: test-new

<五>加解密

引入:配置文件统一放在配置中心,配置中心文件明文存在不安全,容易泄露比如数据库用户名、密码等,如何实现git仓库配置文件为密文时,通过配置中心在Config-Server端进行解密。

<一>对称加密

1、JCE加密,Oracl官网下载,替换本机JDK下JRE的lib下在两个文件。

https://www.oracle.com/technetwork/java/javase/downloads/jce-all-download-5170447.html

2、

a) Config-Server 端配置文件添加:

encrypt:                                 #加密因子
  key: foobar

加密因子为foobar,这里借助了Server端的加密,因此配置完毕需要启动Config-Server

b) 启动Config-Server

$ curl -X post http://localhost:9090/encrypt -d mysecret

加密mysecret为密码,得到如下加密字串:

682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda

c) 逆向操作:

$ curl -X post http://localhost:9090/decrypt -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda

解密得到:

mysecret

3、使用:

a) Config-Server端配置文件中加入:

encrypt: #加密因子foobar

key: foobar

b) Git仓库中配置文件caiyun-test-dev.yml

profile: '{cipher}682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda'

备注:.properties文件吧引号去掉

c) Config-client不需要做任何操作

<二>非对称加密

RSA算法

1、命令行下执行

$ keytool -genkeypair -alias mytestkey -keyalg RSA -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass changeme -keystore server.jks -storepass letmein

执行完生成 server.jks 文件,加密文件

2、将Server.jks 文件放在Config-Server的ClassPass路径下,

Config-Server 端配置文件bootstrap.yml中添加:

encrypt:
  keyStore:
    location: classpath:/server.jks     #生成在jks文件路径
    password: letmein           #key store 秘钥
    alias: mytestkey            #别名
    secret: changeme            #私钥

启动Config-Server

3、加密

$ curl -X post http://localhost:9090/encrypt -d caiyun-mima

加密caiyun-mima,得到如下加密字串:

682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda

4、使用:

a)Config-Server端配置文件中加入:

encrypt:
  keyStore:
    location: classpath:/server.jks     #生成在jks文件路径
    password: letmein           #key store 秘钥
    alias: mytestkey            #别名
    secret: changeme            #私钥

b) Git仓库中配置文件caiyun-test-dev.yml

profile: '{cipher}682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda'

备注:.properties文件吧引号去掉

c) Config-client不需要做任何操作

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容