springcloud:config+bus-amqp+actuator+monitor+碼云實(shí)現(xiàn)配置文件動(dòng)態(tài)刷新

1.框架版本
spring boot - version: 2.1.9.RELEASE
spring cloud - version : Greenwich.SR3
git版本控制工具 : 碼云
2.代碼

前提條件:
需要已安裝erlang和rabbitmq翼闹,并啟動(dòng)它們。
如果您是windows系統(tǒng),可以參照 Windows安裝rabbitmq 這篇文章

2.1 eureka服務(wù)端

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>xzl.xiongzelin</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-server</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
    </properties>

    <dependencies>
        <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>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

  • 啟動(dòng)類
package xzl.xiongzelin.eurekaserver;

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

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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

  • application.properties

 #服務(wù)名稱
spring.application.name=eureka.server

 #端口
server.port=8761

 # eureka訪問路徑
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

#這行屬性最好不加奴愉,當(dāng)配置eureka服務(wù)端負(fù)載均衡時(shí)有這行代碼會(huì)出問題(其他實(shí)例不可用)
#eureka.instance.prefer-ip-address=true

#服務(wù)端示例id
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}

#單eureka服務(wù)器必加屬性(以下兩個(gè))
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

啟動(dòng)eureka服務(wù)器,訪問http://localhost:8761,正常界面如下:

eureka服務(wù)器正常界面.png



2.2 config-server 服務(wù)端

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>xzl.xiongzelin</groupId>
    <artifactId>spring-cloud-config-monitor-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-cloud-config-monitor-server</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</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-starter-bus-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-monitor</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


  • 啟動(dòng)類
package xzl.xiongzelin.springcloudconfigmonitorserver;

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;

@EnableConfigServer
@EnableEurekaClient
@SpringBootApplication
public class SpringCloudConfigMonitorServerApplication {

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

  • application.properties


server.port=9999

#本應(yīng)用名稱
spring.application.name=config-server

#此處用的是gitee,也就是碼云存儲(chǔ)配置文件
spring.cloud.config.server.git.uri=https://gitee.com/xiongzelin/springcloudconfigserver.git

#配置文件的文件夾路徑
spring.cloud.config.server.git.search-paths=config-repo

#登錄gitee所需賬號及密碼
spring.cloud.config.server.git.username=xiongzelin
spring.cloud.config.server.git.password=xzl.123

eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

#actuator配置
  ##開啟actuator
management.endpoints.enabled-by-default=true
  ##打印日志
management.endpoint.health.show-details=always
  ##向外暴露的接口,這里*則表示所有的actuator接口都可以被訪問
management.endpoints.web.exposure.include=*

#rabbitmq配置信息锋华,這里的信息和默認(rèn)的rabbitmq信息一樣,其實(shí)是可以省略掉的
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

#encrypt.key=4444

啟動(dòng)config-server,正常情況下箭窜,該服務(wù)會(huì)注冊到eureka毯焕,頁面如下:


config-server注冊成功.png

2.3 config-client 客戶端

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>xzl.xiongzelin</groupId>
    <artifactId>spring-cloud-config-monitor-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-cloud-config-monitor-client</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
    </properties>

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

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>


  • 啟動(dòng)類
package xzl.xiongzelin.eurekaserver;

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

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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


  • web 控制器
package xzl.xiongzelin.springcloudconfigmonitorclient;

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;


@RefreshScope
@RestController
public class TestController {
  
    /**配置文件中的屬性*/
    @Value("${from}")
    private String from;

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


  • application.propreties

spring.application.name=didispace
server.port=8866

#開啟配置發(fā)現(xiàn)
spring.cloud.config.discovery.enabled=true

#對應(yīng)配置服務(wù)名稱
spring.cloud.config.discovery.service-id=config-server

#git分支名稱
spring.cloud.config.label=feature-xiongzelin

#profile 對應(yīng)開發(fā)環(huán)境
spring.cloud.config.profile=dev

##這行代碼很重要,根據(jù)官方定義的標(biāo)準(zhǔn)來的
spring.cloud.bus.id=${spring.application.name}:${spring.cloud.config.profile}:${random.value}

eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

#下面的配置可省
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

啟動(dòng)config-client磺樱,同樣的纳猫,在eureka中它也會(huì)被注冊,訪問http://localhost:8866/from獲取from的值竹捉,發(fā)現(xiàn)頁面展示的是git-dev-28.0,頁面就不展示了芜辕。

2.4配置文件

  • 目錄結(jié)構(gòu)


    配置文件.png

上圖只展示了master分支,還有一個(gè)feature-xiongzelin分支块差,它們的文件是一樣的侵续,現(xiàn)在測試的是feature-xiongzelin分支,這些文件中都只有一個(gè)類似于from=git-dev-27.0的鍵值對

到了這里憨闰,大家就可以嘗試看看是否在不配置webhook的情況下状蜗,服務(wù)端和客戶端訪問的配置文件是否有動(dòng)態(tài)刷新以及提交變更代碼時(shí)rabbitmq的queue變化



3.配置webhooks

注意:這里的webhooks所屬于存放配置文件的項(xiàng)目,具體位置如下:


webhooks.png

點(diǎn)擊“添加”鹉动,進(jìn)入如下頁面


添加webhook.png

添加頁面的url要求 必須公網(wǎng)ip 或者 域名轧坎,我這里使用 natapp

做內(nèi)網(wǎng)滲透,生成一個(gè)臨時(shí)可用域名泽示,具體怎么做大家百度一下就知道了缸血,有一點(diǎn)要注意的是蜜氨,做內(nèi)網(wǎng)滲透的是配置服務(wù)端的ip+port,而不是配置客戶端的属百。

在生成域名后记劝,在域名后添加/monitor就可以了,類似于http://6ku6fu.natappfree.cc/monitor ,密碼可以先不設(shè)置族扰,“選擇事件”還是“push”,好了,可以直接點(diǎn)“添加“了



4.測試

  • 修改配置文件
    將gitee中的didispace-dev.properties文件的from的值修改為git-dev-30.0(原來是git-dev-28.0),將修改部分提交到git服務(wù)器后定欧,可以觀察到rabbitmq的變化渔呵,頁面如下:

    rabbitmq消息傳遞.png

  • 訪問http://localhost:8866/from獲取from的值,產(chǎn)看是否已自動(dòng)刷新,頁面如下:

    動(dòng)態(tài)更新配置文件.png



另外:如果大家要給webhook加密碼的話砍鸠,急需要把config-server服務(wù)端的配置的最后一行代碼注釋給解開


  1. 代碼地址
    eureka-server:https://gitee.com/xiongzelin/eureka-seever.git
    config-server:https://gitee.com/xiongzelin/spring-cloud-config-monitor-server.git
    config-client: https://gitee.com/xiongzelin/spring-cloud-config-monitor-client.git
    配置文件:https://gitee.com/xiongzelin/springcloudconfigserver.git
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扩氢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子爷辱,更是在濱河造成了極大的恐慌录豺,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饭弓,死亡現(xiàn)場離奇詭異双饥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)弟断,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門咏花,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阀趴,你說我怎么就攤上這事昏翰。” “怎么了刘急?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵棚菊,是天一觀的道長。 經(jīng)常有香客問我叔汁,道長统求,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任攻柠,我火速辦了婚禮球订,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瑰钮。我一直安慰自己冒滩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布浪谴。 她就那樣靜靜地躺著开睡,像睡著了一般因苹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上篇恒,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天扶檐,我揣著相機(jī)與錄音,去河邊找鬼胁艰。 笑死款筑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腾么。 我是一名探鬼主播奈梳,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼解虱!你這毒婦竟也來了攘须?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤殴泰,失蹤者是張志新(化名)和其女友劉穎于宙,沒想到半個(gè)月后臭墨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盗尸,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年锡搜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了员凝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片署驻。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖健霹,靈堂內(nèi)的尸體忽然破棺而出旺上,到底是詐尸還是另有隱情,我是刑警寧澤糖埋,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布宣吱,位于F島的核電站,受9級特大地震影響瞳别,放射性物質(zhì)發(fā)生泄漏征候。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一祟敛、第九天 我趴在偏房一處隱蔽的房頂上張望疤坝。 院中可真熱鬧,春花似錦馆铁、人聲如沸跑揉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽历谍。三九已至现拒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間望侈,已是汗流浹背印蔬。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脱衙,地道東北人侥猬。 一個(gè)月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像岂丘,于是被迫代替她去往敵國和親陵究。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359