《springcloud — Finchley.RELEASE版》第七篇 訊息匯流排Bus
cloud Bus簡述
spring cloud bus在整個後端服務中起到通訊的作用,聯通後端的多臺伺服器。後端伺服器一般都做了叢集化,很多臺伺服器,訊息匯流排可以在機器之間互相傳輸訊息、檔案等。訊息匯流排扮演著一種訊息路由的角色,擁有一套完備的路由機制來決定訊息傳輸方向。傳送段只需要向訊息匯流排發出訊息而不用管訊息被如何轉發。總的來說,就是在我們需要把一個操作散發到所有後端相關伺服器的時候,就可以選擇使用cloud bus了。Spring cloud bus 通過輕量訊息代理連線各個分佈的節點。管理和傳播所有分散式專案中的訊息,本質是利用了MQ的廣播機制在分散式的系統中傳播訊息。
當前spring cloud bus提供了可用的介面:./bus-refresh用於重新整理所有繫結到重新整理點的配置項,引數有destination,其中destination引數可以不提供
spring cloud config 配置更新方式一般採用,配置git倉庫,當git倉庫更新完成後,確認更新無誤手工呼叫bus提供的重新整理介面重新整理快取。
關鍵的修改點是把所有的後端伺服器連線到同一個訊息系統上,然後監聽配置更新訊息。
Bus服務
因為bus利用了MQ的廣播機制在分散式的系統中傳播訊息,目前常用的有Kafka和RabbitMQ。所以我們需要安裝一款訊息佇列,我們這裡使用RabbitMQ,安裝比較簡單具體安裝方式不在詳述,安裝後啟動即可。
micro-config-server服務複用上篇,這裡就不再敘述。
在micro-parent下新建module,micro-bus-server,新增config client,bus等相關依賴,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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>micro-bus-server</artifactId> <packaging>jar</packaging> <name>micro-bus-server</name> <description>微服務實戰</description> <parent> <groupId>com.sun</groupId> <artifactId>micro-parent</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.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</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> </dependencies> </project>
配置檔案bootstrap.yml如下:
spring:
application:
name: micro-bus-server
profiles:
active: ha1
cloud:
bus:
enabled: true
trace:
enabled: true
config:
label: master
profile: dev
#uri: http://localhost:7070/
discovery:
enabled: true
service-id: micro-config-server
rabbitmq: #配置rabbitmq
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://localhost:8080/eureka/
management:
endpoints:
web:
exposure:
include: bus-refresh #公開重新整理端點
---
server: #配置兩套用於測試
port: 7080
spring:
profiles: ha1
---
server:
port: 7081
spring:
profiles: ha2
啟動類:
package com.sun.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class BusApplication {
public static void main(String[] args) {
SpringApplication.run(BusApplication.class, args);
}
}
提供服務的controller如果有注入的屬性需要加@RefreshScope註解不然無法重新整理
package com.sun.eureka.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 ConfigController {
@Value("${name}")
String name;
@RequestMapping(value = "/name")
public String name(){
return name;
}
}
啟動micro-eureka-server,micro-config-server,micro-bus-server-ha1,micro-bus-server-ha2和訊息佇列,訪問
zhangsan