01 基礎環境準備
02 一文讀懂Eureka
03 Zookeeper註冊中心
04 Consule註冊中心
05 Ribbon
06 OpenFegin
07 Hystrix全面解析
08 Gateway全面解析
09 Config配置中心
10 Bus消息總線
1 Spring Cloud Bus 簡介
Spring cloud bus通過輕量消息代理連接各個分佈的節點。這會用在廣播狀態的變化(例如配置變化)或者其他的消息指令。Spring bus的一個核心思想是通過分佈式的啓動器對spring boot應用進行擴展,也可以用來建立一個多個應用之間的通信頻道。目前唯一實現的方式是用AMQP消息代理作爲通道,同樣特性的設置(有些取決於通道的設置)在更多通道的文檔中。
大家可以將它理解爲管理和傳播所有分佈式項目中的消息既可,其實本質是利用了MQ的廣播機制在分佈式的系統中傳播消息,目前常用的有Kafka和RabbitMQ。利用bus的機制可以做很多的事情,其中配置中心客戶端刷新就是典型的應用場景之一,我們用一張圖來描述bus在配置中心使用的機制。
SpringCloud Bus 目前僅支持RabbitMQ 和 Kafka
(1) 提交代碼觸發post給客戶端A發送bus/refresh。
(2) 客戶端A接收到請求從Server端更新配置並且發送給Spring Cloud Bus。
(3) Spring Cloud bus接到消息並通知給其它客戶端。
(4) 其它客戶端接收到通知,請求Server端獲取最新配置。
(5) 全部客戶端均獲取到最新的配置。
1.1 總線
在微服務架構的系統中,通常會使用輕量級的消息代理來構建一個共用的消息主題,並讓系統中所有微服務實例都連接上來。由於該主題中產生的消息會被所有實例監聽和消費。所以稱它爲消息總線。在總線上的各個實例都可以方便地廣播些需要讓具他連接在該主題上的實例都知道的消息。
2 Kafka環境準備
192.168.0.39 zookeeper kafka
2.1 Zookeeper安裝略
2.2 安裝kafka
(1) 解壓
tar -zxvf kafka_2.11-0.11.0.2.tgz
mv kafka_2.11-0.11.0.2 kafka
(2) 修改配置文件
cd /usr/local/kafka/config
vim server.properties
listeners=PLAINTEXT://192.168.0.39:9092
host.name=192.168.0.39
port=9092
log.dirs=log.dirs=/usr/local/logs/kafka/kafka-logs
zookeeper.connect=192.168.0.39:2181
(3) 創建日誌路徑
mkdir -p /usr/local/logs/kafka
(4) 啓動kafka
cd /usr/local/kafka
nohup bin/kafka-server-start.sh config/server.properties 1>kafka.start.log 2>&1 &
(5) 查看
3 創建客戶端工程
(1) pom
<dependencies>
<!-- 配置客戶端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>com.zrs.springcloud</groupId>
<artifactId>commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
(2) bootstrap.yml
server:
port: 9005
spring:
application:
name: config-client-slave
cloud:
# 配置拼接:http://localhost:9003/Config-enviroment-release-v1.0/config-dev
config:
#分支
label: Config-enviroment-release-v1.0
#配置文件名稱
name: config
#讀取後綴名稱
profile: dev
#配置中心地址
uri: http://localhost:9003
eureka:
client:
#是否將自己註冊到EurekaServer
register-with-eureka: true
#是否從EurekaServer獲取已有的註冊服務
fetch-registry: true
#註冊地址
service-url:
defaultZone: http://localhost:7000/eureka/
instance:
instance-id: config-client-slave
prefer-ip-address: true
# 暴露監控端點
management:
endpoints:
web:
exposure:
include: "*"
(3) 主啓動類
@SpringBootApplication
@EnableEurekaClient
public class ConfigSlaveClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigSlaveClientApplication.class);
}
}
(4) Controller
@RestController
@RefreshScope
public class ConfigClientRontroller {
@Value("${config.info}")
private String info;
@Value("${server.port}")
private String port;
@GetMapping("/info")
public String info(){
return "server port:"+port+",info:"+info;
}
}
(5) 修改cloud-config-client的Controller
@RestController
@RefreshScope
public class ConfigClientRontroller {
@Value("${config.info}")
private String info;
@Value("${server.port}")
private String port;
@GetMapping("/info")
public String info(){
return "server port:"+port+",info:"+info;
}
}
4 修改服務端通知所有客戶端
4.1 服務端pom添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
4.2 修改服務端application.yml
server:
port: 9003
spring:
application:
name: config-center
#配置kafka
kafka:
bootstrap-servers: 192.168.0.39:9092
consumer:
group-id: springcloud-bus
cloud:
config:
server:
git:
#配置github
uri: https://github.com/zhurongsheng666/spring-cloud-hoxton.git
#配置搜索目錄
search-paths:
- springcloud-config
#配置分支
label: Config-enviroment-release-v1.0
eureka:
client:
#是否將自己註冊到EurekaServer
register-with-eureka: true
#是否從EurekaServer獲取已有的註冊服務
fetch-registry: true
#註冊地址
service-url:
defaultZone: http://localhost:7000/eureka/
instance:
instance-id: config-center
prefer-ip-address: true
#配置刷新
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
4.3 在兩個客戶端pom裏面添加配置文件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
4.4 在兩個客戶端bootstrap.yml添加配置
#配置kafka
kafka:
bootstrap-servers: 192.168.0.39:9092
consumer:
group-id: springcloud-bus
4.5 啓動Eureka、ConfigCenter、ConfigClient、ConfigClientSlave
4.6 測試
(1) 修改版本
(2) 服務端
(3) POST請求服務端
curl -X POST "http://localhost:9003/actuator/bus-refresh"
5 指定通知
curl -X POST "http://localhost:9003/actuator/bus-refresh/{destination}"
GITHUB
#分支 Bus-enviroment-release-v1.0
https://github.com/zhurongsheng666/spring-cloud-hoxton