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,正常界面如下:
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毯焕,頁面如下:
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)入如下頁面
添加頁面的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ù)端的配置的最后一行代碼注釋給解開