Spring Cloud Config 与Spring Cloud Bus组合实现配置文件热部署

先介绍下Spring Cloud Config

功能 :配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git以及Subversion。

接下来直接来一个demo

我这里是集成了eureka的,将config-server和config-client注册到eureka

先上eureka的demo

pom依赖,我这里有父级pom,具体jar的版本号就写,自己可以去maven中央仓库找

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

配置文件

server:
  port: 8889
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

config-server的demo

pom依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
//下面这个包是为引入bus热部署
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigServerApplication {

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

配置文件

spring:
  application:
    name: config-server
  rabbitmq:
    host: 192.168.1.154
    port: 5672
    username: admin
    password: admin123qwezxc
    virtual-host: /developer
//以上部分是集成bus用到的中间件,这里使用rabbitmq
  cloud:
    config:
      server:
        health:
          enabled: true #健康检查关闭
#          repositories:
#            config-repo-demo:
#              name:
#              label:
#              profiles:
        git:
          uri:xxxxxx//配置文件地址
          search-paths: /
          username: xxxxxx//例如git用户名
          password: xxxxxxx//例如git密码
          ##默认为false,Spring Cloud Config Server强制从远程存储库中提取,如果本地副本是脏的
          force-pull: false
          ##searchPaths: 搜索路径
#          repos: 源分组
          ##路径
#            simple:
#            special:
#              pattern: special*/dev*,*special*/dev*
#                uri: https://github.com/special/config-repo
         ## order: 优先级,order属性的数值越低,优先级越高
#        overrides:
#          foo: bar将导致配置客户端的所有应用程序独立于自己的配置读取该参数下面的值
      label: developer

##该服务端口号
server:
  port: 8888
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8889/eureka/

##http://localhost:8881/actuator/bus-refresh  post  请求这个地址以后动态刷新配置信息
#bus的端点暴露在服务端的好处是分布式环境以下,只需要请求一次这个地址就可以做到所有的应用的配置文件自动刷新
management:
  endpoints:
    web:
      exposure:
        include: bus-refresh//开启这个管理节点,供http调用
      # 用户认证,客户端应用接入时加入安全认证配置
      #  security:
      #    user:
      #      name: config
      #      password: config2018
      #    basic:
      #      enabled: true

      # 基于消息总线的MQ配置
      #  cloud:
      #    stream:
      #      kafka:
      #        binder:
      #          zk-nodes: ${ZK_NODES:localhost:2181}
      #          brokers: ${KAFKA_BROKERS:localhost:9092}
      #          requiredAcks: -1
      #          configuration:
      #            security:
      #              protocol: SASL_PLAINTEXT
      #            sasl:
      #              mechanism: PLAIN
      #          jaas:
      #            loginModule: org.apache.kafka.common.security.plain.PlainLoginModule
      #            options:
      #              username: test
      #              password: test-secret
      #    # 开启跟踪事件消息(默认是false)
      #    bus:
      #      trace:
      #        enabled: true
      #      # 自定义topic主题
      #      destination: test.springcloud.config

config-client的demo

pom依赖导入

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</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>

启动类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
@EnableEurekaClient
@EnableDiscoveryClient
@RefreshScope
public class ConfigClientApplication {

    @Value("${foo}")
    private String value;

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

    @RequestMapping(value = "/hi", method = RequestMethod.GET)
    public String hi() {
        return value;
    }
}

配置文件
application

spring:
  cloud:
    bus:
      enabled: true
      trace:
        enabled: true
  rabbitmq:
    host: 192.168.1.154
    port: 5672
    username: admin
    password: admin123qwezxc
    virtual-host: /developer


##http://localhost:8881/actuator/bus-refresh  post  请求这个地址以后动态刷新配置信息
#management:
#  endpoints:
#    web:
#      exposure:
#        include: bus-refresh

#        spring:
#          application:
#            name: letv-mas-client
#            index: ${CLIENT_SERVER_IP:127.0.0.1}:${server.port}
#          profiles:
#            active: ${CLIENT_PROFILE:default}
#            #include: busdev,streamdev
#          cloud:
#            config:
#              uri: ${CONFIG_SERVER_DOMAIN:http://config.xxx.cn/}
#              failFast: true #the client will halt with an Exception
#              enabled: true
#              # boostrap.yml配置优先于启动参数变量--spring.profiles.active
#              profile: ${spring.profiles.active:${CLIENT_PROFILE:default}}
#              label: master
#              # 访问配置中心,用户安全认证
#              username: config
#              password: config2018
#              # 激活定时任务,当GIT版本发生变更后加载最新配置上下文
#              watcher:
#                enabled: true
#        security:
#          user:
#            name: config
#            password: config2018
#
#        # 基于消息总线的MQ配置(kakfa队列),如果zipkin中也使用kafka队列,那么需要通过binder形式配置做隔离,否则会互相影响,无法下发配置消息。
#        spring:
#          cloud:
#            stream:
#              # 自定义开关
#              enabled: true
#              # 指定中间件
#              default-binder: config-kafka
#              binders:
#                config-kafka:
#                  type: kafka
#                  environment:
#                    spring:
#                      cloud:
#                        stream:
#                          kafka:
#                            binder:
#                              zkNodes: ${ZK_NODES:localhost:2181}
#                              brokers: ${KAFKA_BROKERS:localhost:9092}
#                              # 生产者确认,0、1、-1,默认为1。0为不确认,1为leader单确认,-1为同步副本确认。-1的情况下消息可靠性更高。
#                              required-acks: -1
#                              # 是否自动创建topic,默认为true。设为false的情况下,依赖手动配置broker相关topic>配置,如果topic不存在binder则无法启动。
#                              auto-create-topics: true
#                              configuration:
#                                security:
#                                  protocol: SASL_PLAINTEXT
#                                sasl:
#                                  mechanism: PLAIN
#                              jaas:
#                                loginModule: org.apache.kafka.common.security.plain.PlainLoginModule
#                                options:
#                                  username: test
#                                  password: test-secret
#            bus:
#              # 是否启用bus
#              enabled: true
#              # Bus使用的队列或Topic,kafka中的topic,rabbitmq中的queue
#              destination: test.springcloud.config
#              trace:
#                # 是否启用bus事件跟踪,可以通过/trace页面查看
#                enabled: true
#              refresh:
#                # 是否发送refresh事件,开启时支持基于config文件变更的动态配置
#                enabled: true
#              env:
#                # 是否开启env事件,开启时支持直接动态配置相应环境变量,如/bus/env?arg1=value1&arg2=value2
#                enabled: true

bootstrap

spring:
  application:
    name: config-client

  cloud:
    config:
      label: developer
      profile: dev
      uri: http://localhost:8888/
      discovery:
        enabled: true
        service-id: config-server

server:
  port: 8881
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8889/eureka/

操作说明

1.首先启动eureka项目,然后再启动config-server,最后启动config-client
2.启动成功后,访问hi接口,得到foo参数变量;
3.去仓库中修改foo变量值
4.利用postman请求http://localhost:8881/actuator/bus-refresh 注意必须使用post请求
5.重复第二步,获取到最新的foo参数.

注意:这里最好是将bus集成到config-server中,这样才分布式环境中只需要请求config-server一次,就可以实现所有机器服务的刷新

说明一下bootstrap.propertie与application.properties的区别

① .bootstrap.yml先于application.properties被加载。

②.当使用Spring Cloud Config Server时,需要将spring.application.name和spring.cloud.config.server.git.uri写入bootstrap.yml。

③. 一些encryption/decryption(加密/解密)存储在bootstrap.yml里面。

④. bootstrap.yml被Spring ApplicationContext的父类加载,这个类先于加载**application.yml的ApplicatonContext启动。

当使用 Spring Cloud 的时候,配置信息一般是从 config server 加载的,为了取得配置信息(比如密码等),你需要一些提早的或引导配置。因此,把 **config server **信息放在 bootstrap.yml,用来加载真正需要的配置信息。

想要深入了解的话参考这篇文章https://www.jianshu.com/p/50981e01784e,然后结合源码观看

一些复杂操作,例如多个源,安全性,valut作为提供原等,请观看文档https://springcloud.cc/spring-cloud-config.html

看过的觉着有用,希望点个喜欢,谢谢!,讨论加QQ:1107156537

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

推荐阅读更多精彩内容