SpringCloud(十四)springCloud bus 訊息匯流排重新整理配置
前言:
在微服務中,我們將使用輕量級訊息代理,通過一個共用的訊息主題,讓系統中所有微服務都連上來,主題中的訊息會被所有監聽者消費,所以稱為訊息匯流排。spring cloud bus將分散式節點用輕量級訊息連線起來,他可以用於服務間通訊,例如:配置檔案的更改。可以用kafka、rabbitmq等
程式碼:
基於springboot2.0
首先基於上一篇的程式碼(搭建eureka、config、一個測試功能的微服務)
eureka和配置中心config不用做任何更改
修改測試微服務的pom.xml,加入下面這兩個依賴
<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>
第一個包,需要rabbitmq,所以需要搭建rabbitmq伺服器,第二個是程式監控的包,用於暴露bus-refresh埠,用作重新整理配置
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>eureka-service</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>eureka-service</name> <parent> <groupId>com.xhx.springcloud</groupId> <artifactId>springcloud15-bus</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <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-web</artifactId> </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.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
修改bootstrap.yml,其中spring.cloud.config.name 可寫多個引數,根據名字在配置中心拉取配置檔案,我把rabbitmq的配置也放在了git上
spring: cloud: config: discovery: enabled: true service-id: config-service label: master profile: prd name: eureka-service,rabbit-mq bus: refresh: enabled: true application: name: eureka-service management: endpoints: web: exposure: #暴露bus-refresh節點,通過此節點重新整理配置 include: '*'
rabbitmq的dev和prd環境配置如下(自己做測試,所以寫的一樣的配置)
spring:
rabbitmq:
host: 192.168.94.151
port: 5672
username: admin
password: admin
virtual-host: /
在eureka-sevice配置檔案中加入user.name,一會測試時修改他的value
server:
port: 8082
eureka:
client:
service-url:
default-zone: http://localhost:8761/eureka
instance:
#租期到期時間
lease-expiration-duration-in-seconds: 60
#租期更新時間間隔,即每15秒傳送一次心跳
lease-renewal-interval-in-seconds: 15
user:
name: xuhaixing02
在讀取配置的那個類上加入@RefreshScope,必須加,否則重新整理不生效
package com.xhx.springcloud.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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
* xuhaixing
* 2018/6/3 16:18
*/
@RestController
@RequestMapping(value = "hello")
@RefreshScope
public class HelloController {
@Value("${user.name}")
private String name;
@RequestMapping(value = "getName")
public String getName(){
return name;
}
}
然後啟動就可以了:
第一次訪問:
把上面的值修改成xuhaixing01,直接再請求值未生效。需要先請求127.0.0.1:8082/actuator/bus-refresh
看程式的控制檯日誌,在請求配置中心下載配置
仔細觀察全部打印出來的日誌,還發現了,在重新整理user.name注入的值
再次請求,結果已經變成了xuhaixing01
這樣必須手動重新整理,還是不好,如果有外網可以訪問的固定ip,可以配置git的webhooks,設定去請求這個方法,來達到重新整理配置的目的
127.0.0.1:8082/actuator/httptrace 可以看到呼叫