1. 程式人生 > >《springcloud — Finchley.RELEASE版》第七篇 訊息匯流排Bus

《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