前言
本章講解Spring Cloud組件中的Spring Cloud Bus的相關知識
方法
1.概念
ConfigClient(微服務)從ConfigServer端獲取自己對應的配置文件,但是目前的問題是:當遠程git倉庫配置文件發生改變時,每次都是需要重啓ConfigCient(微服務),如果有上百上千個微服務呢?我想我們不會一個個去重啓每個微服務,也就是說如何讓ConfigServer端通知到ConfigClient端?即ConfigClient端如何感知到配置發生更新?
如果想要解決這個問題,就需要用到我們的Spring Cloud Bus,即消息總線!
通過學習他人的博客,我已經完全蒙圈了,這裏來聊下我的總結!
2.環境搭建
爲了更好的演示我們這次的程序,我們將重新編寫ConfigClient和ConfigServer兩個工程!
1)創建ConfigClient和ConfigServer兩個工程
2)修改pom文件
ConfigServer:主要配置config-server、bus、actuator
<dependencies>
<!-- 配置springBoot的啓動器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- config-server座標 -->
<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>
<!-- actuator的座標 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
ConfigClient:主要配置config-client、bus、actuator
<dependencies>
<!-- 配置springBoot的web啓動器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- config-client座標 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<!--bus的座標-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<!--actuator的座標-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
那麼,這裏的pom文件就算配置完畢了。
3.config-server搭建
1)直接上乾貨,配置application.yml
注意:本次的項目git上的配置文件爲:application-hello.yml
內容如下:
spring:
profiles:
active: dev
---
server:
port: 8080
spring:
application:
name: application-6
profiles: dev
---
server:
port: 9090
spring:
application:
name: application-10
profiles: test
這是最基本的配置。。。如果不明白的話自行百度,至於爲什麼用yml,是上個博客的經驗。。。
application.yml:
server:
port: 8688
# spring cloud config server
spring:
application:
name: config-bus-server
cloud:
config:
server:
git:
uri: https://github.com/wangjian136/spring-cloud-config.git
# rabbitmq config
rabbitmq:
host: 192.168.1.108
port: 5672
username: jwang
password: 123456
# bus-refresh config
management:
endpoints:
web:
exposure:
include: bus-refresh
ConfigServerApp加入@EnableConfigServer註解,我相信大家都知道:
package cn.edu.ccut;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApp {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApp.class, args);
}
}
到這裏,我們的config-server就算配置完畢了!
4.config-client搭建
本次的客戶端不搞那麼多花頭,直接上最簡單的springboot工程,這樣大家可能好理解些。
1)配置bootstrap.yml
#spring cloud config client
spring:
cloud:
config:
name: application-hello
profile: dev
label: master
uri: http://192.168.1.103:8688
#rabbitmq config
rabbitmq:
host: 192.168.1.108
port: 5672
username: jwang
password: 123456
#bus-refresh config
management:
endpoints:
web:
exposure:
include: bus-refresh
2)編寫一個controller用來做測試
package cn.edu.ccut.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 TestController {
@Value("${spring.application.name}")
private String applicationName;
@Value("${server.port}")
private String port;
@RequestMapping("/config")
public String getMsg(){
System.out.println("--port--:"+port);
System.out.println("--name--:"+applicationName);
return "port:"+port+",name:"+applicationName;
}
}
該controller將輸出應用名稱和端口號,等下我們在git文件中把應用名稱改了,然後在不重啓的狀態下試試。
3)啓動類的編寫
啓動類沒什麼改變,就是普通的springboot啓動類就哦了
5.測試運行
1)首先將我們的rabbitmq啓動完畢,這裏不再贅述
2)啓動config-server
我們可以看到,服務端啓動成功了!在rabbitmq中我們將發現一個隊列生成!
輸入以下地址http://localhost:8688/application-hello-dev.yml驗證是否可以讀取配置文件:
該輸出代表成功!
3)啓動config-client
我們發現,它從config-server端成功的讀取了配置,且端口號爲8080!
接下來我們訪問http://localhost:8080/config觀察效果:
這顯然是正確的!
4)改動git相關配置文件並上傳
我們將application-6改成了application-7
這裏我使用命令將其上傳:
5)訪問http://localhost:8080/config觀察效果
還是他孃的沒變!
6)在postman中輸入命令
http://localhost:8688/actuator/bus-refresh
觀察rabbitmq隊列狀態:
很顯然,已經發生了改變!
7)訪問http://localhost:8080/config觀察效果