[TOC]
## **1. Spring Cloud Bus 解決的問題**
### 1.1 **疑問: 當我們更新 GitHub 中的配置文件內容后, Config 客戶端服務是否會及時更新的配置內容呢?**
* **測試:**
修改config客戶端,microservice-config-application.yml配置文件的prod的端口號

git配置

**將端口配置改成4010**

**但是端口的修改沒有生效,還是原來的4002**

* **結果**
重啟config客戶端后,配置生效

* **解決:**
如果希望在不重啟微服務的情況下更新配置如何來實現呢? 我們使用 Spring Cloud Bus 來實現配置的自動更新。
## **2. Spring Cloud Bus介紹**
1. **Spring Cloud Bus 翻譯為消息總線。** 大家可以將它理解為管理和傳播所有分布式項目中的消息即可。
2. Spring Cloud Bus本質是**利用了MQ的廣播機制** ***在分布式的系統中傳播消息,目前常用的有Kafka和RabbitMQ。***
3. 利用Bus的機制可以做很多的事情,其中配置中心客戶端刷新就是典型的應用場景之一,我們用一張圖來描述Bus在配置中心使用的機制。

## **3. Spring Cloud Bus實踐**
### 3.1 應用服務端配置
**1. 應用服務端配置pom,添加依賴**
```
<!--Bus 與 rabbitMQ依賴-->
<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>
```
**2. 修改 bootstrap.yml添加**
```
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
# 暴露觸發消息總線的地址
management:
endpoints:
web:
exposure:
include: bus-refresh
```
3. 修改git上的microservice-config-product.yml

改為

但是Eureka注冊名稱很明顯,沒有改過來,一定要重啟嗎?

**4. 使用 postman工具發送配置更新請求**
發送 POST 請求: http://localhost:8001/actuator/bus-refresh發送請求后,會向 rabbitmq 隊列發送數據,就會被監聽到進行更新服務配置信息

配置很快就生效了

### **3.2 自定義類中讀取配置實戰**
**1. 修改GitHub上的配置**
修改GitHub上的 microservice\-config\-product.yml 配置文件,增加自定義配置信息:
```
emp:
name: tuna
```
**2. 用@Value注解獲取配置**
~~~
@Value("${emp.name}")
private String name;
@GetMapping("/emp")
public String getEmpName() {
return name;
}
~~~
**3. 訪問測試**
注意:當@Value注解去取配置時,如果配置文件沒有加這個配置,則程序啟動不起來,并報解析錯誤

已經讀取到了配置
**4. 修改配置**
```
emp:
name: tuna
```
改成
```
emp:
name: fish
```
使用 postman工具發送 POST 請求: http://localhost:8001/actuator/bus-refresh,發現并沒有生效

### **5. 自定義配置需要 在controller上加 `@RefreshScope`注解支持**
是因為需要在 ProductController 上添加 @RefreshScope 注解 ,用于刷新配置
~~~
package com.tuna.springcloud.server.controller;
import com.tuna.springcloud.common.entities.Product;
import com.tuna.springcloud.server.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RefreshScope
@RestController
public class ProductController {
。。。
@Value("${emp.name}")
private String name;
@GetMapping("/emp")
public String getEmpName() {
return name;
}
}
~~~
**還原配置,重啟應用服務端**
再次post更新請求,生效

## 4.修改數據源實戰
1\. 先訪問 http://localhost:8001/product/get/1,發現當前獲取了 springcloud\_db01 庫的數據

2\. 修改GitHub上的 microservice\-config\-product.yml 配置文件,將 profile: dev (開發環境) 的 庫名 改 為 springcloud\_db02

3\. 使用 postman工具發送 POST 請求: http://localhost:8001/actuator/bus-refresh
4\. 訪問 http://localhost:8001/product/get/1,發現依然是 springcloud\_db01 庫的數據, 發現并沒有刷新配置。

### 4.1 自定義Druid配置類
~~~
@Configuration
public class DruidConfig {
@RefreshScope //刷新配置
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid() {
return new DruidDataSource();
}
}
~~~
### 4.2 測試
現在取得是數據庫2

修改配置成數據庫1,并發送更新消息http://localhost:8001/actuator/bus-refresh
再次請求服務端,不用重啟,數據庫連接立即生效了

- springcloud
- springcloud的作用
- springboot服務提供者和消費者
- Eureka
- ribbon
- Feign
- feign在微服務中的使用
- feign充當http請求工具
- Hystrix 熔斷器
- Zuul 路由網關
- Spring Cloud Config 分布式配置中心
- config介紹與配置
- Spring Cloud Config 配置實戰
- Spring Cloud Bus
- gateway
- 概念講解
- 實例
- GateWay
- 統一日志追蹤
- 分布式鎖
- 1.redis
- springcloud Alibaba
- 1. Nacos
- 1.1 安裝
- 1.2 特性
- 1.3 實例
- 1. 整合nacos服務發現
- 2. 整合nacos配置功能
- 1.4 生產部署方案
- 環境隔離
- 原理講解
- 1. 服務發現
- 2. sentinel
- 3. Seata事務
- CAP理論
- 3.1 安裝
- 分布式協議
- 4.熔斷和降級
- springcloud與alibba
- oauth
- 1. abstract
- 2. oauth2 in micro-service
- 微服務框架付費
- SkyWalking
- 介紹與相關資料
- APM系統簡單對比(zipkin,pinpoint和skywalking)
- server安裝部署
- agent安裝
- 日志清理
- 統一日志中心
- docker安裝部署
- 安裝部署
- elasticsearch 7.x
- logstash 7.x
- kibana 7.x
- ES索引管理
- 定時清理數據
- index Lifecycle Management
- 沒數據排查思路
- ELK自身組件監控
- 多租戶方案
- 慢查詢sql
- 日志審計
- 開發
- 登錄認證
- 鏈路追蹤
- elk
- Filebeat
- Filebeat基礎
- Filebeat安裝部署
- 多行消息Multiline
- how Filebeat works
- Logstash
- 安裝
- rpm安裝
- docker安裝Logstash
- grok調試
- Grok語法調試
- Grok常用表達式
- 配置中常見判斷
- filter提取器
- elasticsearch
- 安裝
- rpm安裝
- docker安裝es
- 使用
- 概念
- 基礎
- 中文分詞
- 統計
- 排序
- 倒排與正排索引
- 自定義dynamic
- 練習
- nested object
- 父子關系模型
- 高亮
- 搜索提示
- kibana
- 安裝
- docker安裝
- rpm安裝
- 整合
- 收集日志
- 慢sql
- 日志審計s
- 云
- 分布式架構
- 分布式鎖
- Redis實現
- redisson
- 熔斷和降級