[菜鳥SpringCloud實戰(zhàn)入門]第七章:配置中心客戶端主動刷新機制 + 配置中心服務化和高可用改造

前言

歡迎來到菜鳥SpringCloud實戰(zhàn)入門系列(SpringCloudForNoob),該系列通過層層遞進的實戰(zhàn)視角,來一步步學習和理解SpringCloud空盼。

本系列適合有一定Java以及SpringBoot基礎的同學閱讀。

每篇文章末尾都附有本文對應的Github源代碼,方便同學調(diào)試晦溪。

實戰(zhàn)版本

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

-----正文開始-----

配置中心客戶端主動刷新機制 + 配置中心服務化和高可用改造

客戶端Refresh:客戶端主動獲取配置信息

經(jīng)過上一章節(jié)配置好Spring Cloud Config后,客戶端(config-client模塊)能夠獲得從服務端(config-server模塊)傳來的配置文件信息挣跋。

文末寫出了一個問題三圆,客戶端并不能獲取更新后的配置信息,想要刷新信息,必須重啟config-client模塊舟肉,這顯然不切實際修噪。

實驗:驗證客戶端無法更新

下面做一個實驗,啟動客戶端和服務端路媚,隨后更新dev配置文件黄琼,新加了(new):

在這里插入圖片描述

隨后push到遠程倉庫,我們再次直接訪問服務端的 http://localhost:8769/spring-cloud-config-dev.properties

在這里插入圖片描述

發(fā)現(xiàn)更新成了新的配置文件整慎。

之后訪問客戶端:

在這里插入圖片描述

發(fā)現(xiàn)依然是老的配置文件信息脏款,客戶端只在啟動時獲取了當時的配置文件信息。

開啟更新機制

我們只需要在config-server模塊中進行改動裤园。

實現(xiàn)Refresh機制需要添加依賴spring-boot-starter-actuator撤师,這個依賴在我們的root模塊中就已經(jīng)添加,在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"

在這里插入圖片描述

得到了:

在這里插入圖片描述

如果在不變更的情況下教翩,再次發(fā)送POST請求:

在這里插入圖片描述

使用Webhook監(jiān)聽配置更新

WebHook是當某個事件發(fā)生時,通過發(fā)送http post請求的方式來通知信息接收方贪壳。Webhook來監(jiān)測你在Github.com上的各種事件饱亿,最常見的莫過于push事件。如果你設置了一個監(jiān)測push事件的Webhook闰靴,那么每當你的這個項目有了任何提交彪笼,這個Webhook都會被觸發(fā),這時Github就會發(fā)送一個HTTP POST請求到你配置好的地址蚂且。

如此一來配猫,你就可以通過這種方式去自動完成一些重復性工作,比如杏死,你可以用Webhook來自動觸發(fā)一些持續(xù)集成(CI)工具的運作泵肄,比如Travis CI捆交;又或者是通過 Webhook 去部署你的線上服務器。下圖就是github上面的webhook配置腐巢。

這種機制適用于只有少數(shù)微服務的情況品追,在大量未服務的情況下,這種機制就顯得捉襟見肘系忙。

消息總線機制

如果項目少配置少的情況可以通過/refresh來手動刷新配置诵盼,如果項目比較復雜的情況呢這種肯定是行不通的惠豺,Spring Cloud Bus消息總線可以解決配置修改的真正的動態(tài)刷新银还。我們放在下一章進行學習。

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

目前我們的兩個子模塊config-server和config-client是相互耦合的洁墙,client需要輸入server的地址來調(diào)用它蛹疯,這樣的調(diào)用違反了低耦合原則(低耦合:就是A模塊與B模塊存在依賴關系,那么當B發(fā)生改變時热监,A模塊仍然可以正常工作捺弦,那么就認為A與B是低耦合的。)

現(xiàn)在我們就是用之前學習的Eureka來對配置中心進行改造孝扛。

服務端改造

改造集中在兩方面列吼,一個是在注冊中心注冊,一個是開啟多個服務端達到高可用的目的苦始。

添加依賴(由于eureka的依賴在我們的父模塊已經(jīng)添加寞钥,所以對于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倉庫的密碼
# 客戶端調(diào)用需要
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);
    }
}

客戶端改造

依賴修改:同服務端相同,我們不需要修改咨油,父模塊將注冊中心等都已經(jīng)引入(見第一章)

啟動類添加@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文件,一個是傳統(tǒng)application.yml一個是bootstrap.yml役电,bootstrap.yml的啟動優(yōu)先于application.yml

我們修改bootstrap.yml赚爵,添加注冊中心配置,并將config的配置加上:

  • spring.cloud.config.discovery.enabled :開啟Config服務發(fā)現(xiàn)支持
  • 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狀態(tài) http://localhost:8761/

在這里插入圖片描述

為了達成高可用法瑟,我們將config-server的端口號再修改為8770冀膝,啟動一個新的config-server,這樣就有兩個config-server同時為我們服務瓢谢。

調(diào)用客戶端接口:

在這里插入圖片描述

本章代碼

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

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末畸写,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子氓扛,更是在濱河造成了極大的恐慌枯芬,老刑警劉巖论笔,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異千所,居然都是意外死亡狂魔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門淫痰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來最楷,“玉大人,你說我怎么就攤上這事待错∽阉铮” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵火俄,是天一觀的道長犯建。 經(jīng)常有香客問我,道長瓜客,這世上最難降的妖魔是什么适瓦? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮谱仪,結果婚禮上玻熙,老公的妹妹穿的比我還像新娘。我一直安慰自己疯攒,他們只是感情好嗦随,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卸例,像睡著了一般称杨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上筷转,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天姑原,我揣著相機與錄音,去河邊找鬼呜舒。 笑死锭汛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的袭蝗。 我是一名探鬼主播唤殴,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼到腥!你這毒婦竟也來了朵逝?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤乡范,失蹤者是張志新(化名)和其女友劉穎配名,沒想到半個月后啤咽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡渠脉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年宇整,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芋膘。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡鳞青,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出为朋,到底是詐尸還是另有隱情臂拓,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布潜腻,位于F島的核電站埃儿,受9級特大地震影響,放射性物質發(fā)生泄漏融涣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一精钮、第九天 我趴在偏房一處隱蔽的房頂上張望威鹿。 院中可真熱鬧,春花似錦轨香、人聲如沸忽你。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽科雳。三九已至,卻和暖如春脓杉,著一層夾襖步出監(jiān)牢的瞬間糟秘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工球散, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尿赚,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓蕉堰,卻偏偏與公主長得像凌净,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屋讶,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容