[菜鸟SpringCloud实战入门]第七章:配置中心客户端主动刷新机制 + 配置中心服务化和高可用改造

前言

欢迎来到菜鸟SpringCloud实战入门系列(SpringCloudForNoob),该系列通过层层递进的实战视角,来一步步学习和理解SpringCloud。

本系列适合有一定Java以及SpringBoot基础的同学阅读。

每篇文章末尾都附有本文对应的Github源代码,方便同学调试。

实战版本

  • SpringBoot:2.0.3.RELEASE
  • SpringCloud:Finchley.RELEASE

-----正文开始-----

配置中心客户端主动刷新机制 + 配置中心服务化和高可用改造

客户端Refresh:客户端主动获取配置信息

经过上一章节配置好Spring Cloud Config后,客户端(config-client模块)能够获得从服务端(config-server模块)传来的配置文件信息。

文末写出了一个问题,客户端并不能获取更新后的配置信息,想要刷新信息,必须重启config-client模块,这显然不切实际。

实验:验证客户端无法更新

下面做一个实验,启动客户端和服务端,随后更新dev配置文件,新加了(new):

在这里插入图片描述

随后push到远程仓库,我们再次直接访问服务端的 http://localhost:8769/spring-cloud-config-dev.properties

在这里插入图片描述

发现更新成了新的配置文件。

之后访问客户端:

在这里插入图片描述

发现依然是老的配置文件信息,客户端只在启动时获取了当时的配置文件信息。

开启更新机制

我们只需要在config-server模块中进行改动。

实现Refresh机制需要添加依赖spring-boot-starter-actuator,这个依赖在我们的root模块中就已经添加,在config-server模块就不需要重复添加了。如果你在root父模块没有添加,那么就需要加上。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

大坑:

对需要刷新的类加上注解@RefreshScope

当配置更改时,标有@RefreshScope的Bean将得到特殊处理来生效配置。

注意这里不是直接加载主类上,除非你的controller写在了主类里。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class HelloController {
    @Value("${config.hello}")
    private String hello;

    @RequestMapping("/hello")
    public String from() {
        return this.hello;
    }
}

对于springboot 1.5.X 以上版本,需要在配置文件中关闭安全认证。

management.security.enabled=false

对于springboot 2,上述配置不起作用,需要修改server端配置文件,将端口暴露:

management:
  endpoints:
    web:
      exposure:
        include: "*"

还要将客户端端口暴露:

management:
  endpoints:
    web:
      exposure:
        include: refresh

测试:

我们开启服务端和客户端,先测试下未更新前获取的配置信息:

在这里插入图片描述

随后我们修改配置文件并push:

在这里插入图片描述

然后以post请求访问 curl -v -X POST "http://localhost:8002/actuator/refresh"

在这里插入图片描述

得到了:

在这里插入图片描述

如果在不变更的情况下,再次发送POST请求:

在这里插入图片描述

使用Webhook监听配置更新

WebHook是当某个事件发生时,通过发送http post请求的方式来通知信息接收方。Webhook来监测你在Github.com上的各种事件,最常见的莫过于push事件。如果你设置了一个监测push事件的Webhook,那么每当你的这个项目有了任何提交,这个Webhook都会被触发,这时Github就会发送一个HTTP POST请求到你配置好的地址。

如此一来,你就可以通过这种方式去自动完成一些重复性工作,比如,你可以用Webhook来自动触发一些持续集成(CI)工具的运作,比如Travis CI;又或者是通过 Webhook 去部署你的线上服务器。下图就是github上面的webhook配置。

这种机制适用于只有少数微服务的情况,在大量未服务的情况下,这种机制就显得捉襟见肘。

消息总线机制

如果项目少配置少的情况可以通过/refresh来手动刷新配置,如果项目比较复杂的情况呢这种肯定是行不通的,Spring Cloud Bus消息总线可以解决配置修改的真正的动态刷新。我们放在下一章进行学习。

配置中心服务化和高可用改造

目前我们的两个子模块config-server和config-client是相互耦合的,client需要输入server的地址来调用它,这样的调用违反了低耦合原则(低耦合:就是A模块与B模块存在依赖关系,那么当B发生改变时,A模块仍然可以正常工作,那么就认为A与B是低耦合的。)

现在我们就是用之前学习的Eureka来对配置中心进行改造。

服务端改造

改造集中在两方面,一个是在注册中心注册,一个是开启多个服务端达到高可用的目的。

添加依赖(由于eureka的依赖在我们的父模块已经添加,所以对于config-server模块我们不需要改动):

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
</dependencies>

配置文件新增注册配置:

server:
  port: 8769
spring:
  application:
    name: spring-cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://xxxxxxxxxxx.git # 配置git仓库的地址
          search-paths: config-repo                              # git仓库地址下的相对地址,可以配置多个,用,分割。
          username: xxxxxx                                     # git仓库的账号
          password: xxxxx                                   # git仓库的密码
# 客户端调用需要
management:
  endpoints:
    web:
      exposure:
        include: "*"
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

启动类添加@EnableDiscoveryClient:

@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public class ConfigServerApplication {

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

客户端改造

依赖修改:同服务端相同,我们不需要修改,父模块将注册中心等都已经引入(见第一章)

启动类添加@EnableDiscoveryClient:同上。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ConfigClientApplication {

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

}

配置文件yml修改:

在前面我们给config-client子模块配置了两个yml文件,一个是传统application.yml一个是bootstrap.yml,bootstrap.yml的启动优先于application.yml

我们修改bootstrap.yml,添加注册中心配置,并将config的配置加上:

  • spring.cloud.config.discovery.enabled :开启Config服务发现支持
  • spring.cloud.config.discovery.serviceId :指定server端的name,也就是server端spring.application.name的值
  • 删除spring.cloud.config.uri
spring:
  cloud:
    config:
      name: spring-cloud-config
      profile: dev
      label: master
      discovery:
        enabled: true
        service-id: spring-cloud-config-server
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

随后我们启动三个模块:

  • Eureka子模块
  • config-server
  • config-client
在这里插入图片描述

查看Eureka状态 http://localhost:8761/

在这里插入图片描述

为了达成高可用,我们将config-server的端口号再修改为8770,启动一个新的config-server,这样就有两个config-server同时为我们服务。

调用客户端接口:

在这里插入图片描述

本章代码

https://github.com/qqxx6661/springcloud_for_noob/tree/master/07-config-server-config-client-eureka

参考

http://www.ityouknow.com/springcloud/2017/05/23/springcloud-config-svn-refresh.html

https://blog.csdn.net/youanyyou/article/details/78993060

http://www.ityouknow.com/springcloud/2017/05/25/springcloud-config-eureka.html

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

推荐阅读更多精彩内容