中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringCloud之消息總線Spring Cloud Bus實例代碼

發布時間:2020-08-21 18:56:13 來源:腳本之家 閱讀:193 作者:smartdt 欄目:編程語言

一、簡介

在微服務架構的系統中,我們通常會使用輕量級的消息代理來構建一個共用的消息主題讓系統中所有微服務實例都連接上來,由于該主題中產生的消息會被所有實例監聽和消費,所以我們稱它為消息總線。

二、消息代理

消息代理(Message Broker)是一種消息驗證、傳輸、路由的架構模式。它在應用程序之間起到通信調度并最小化應用之間的依賴的作用,使得應用程序可以高效地解耦通信過程。消息代理是一個中間件產品,它的核心是一個消息的路由程序,用來實現接收和分發消息, 并根據設定好的消息處理流來轉發給正確的應用。 它包括獨立的通信和消息傳遞協議,能夠實現組織內部和組織間的網絡通信。設計代理的目的就是為了能夠從應用程序中傳入消息,并執行一些特別的操作,下面這些是在企業應用中,我們經常需要使用消息代理的場景:

  1. 將消息路由到一個或多個目的地。
  2. 消息轉化為其他的表現方式。
  3. 執行消息的聚集、消息的分解,并將結果發送到它們的目的地,然后重新組合響應返回給消息用戶。
  4. 調用Web服務來檢索數據。
  5. 響應事件或錯誤。
  6. 使用發布-訂閱模式來提供內容或基千主題的消息路由。

目前已經有非常多的開源產品可以供大家使用, 比如:

  1. ActiveMQKafka
  2. RabbitMQ
  3. RocketMQ
  4. 等......

三、SpringCloud+RabbitMQ

(1)RabbitMQ簡介、安裝不贅述。

(2)pom.xml

<dependencies> 
 <dependency> 
 <groupId>org.springframework.boot</groupId> 
 <artifactId>spring-boot-starter-amqp</artifactId> 
 </dependency> 
 
 <dependency> 
 <groupId>org.springframework.boot</groupId> 
 <artifactId>spring-boot-starter-test</artifactId> 
 <scope>test</scope> 
 </dependency> 
</dependencies> 

(3)application.yml

spring: 
 application: 
 name: rabbitmq-hello 
 rabbitmq: 
 host: ***.***.***.*** 
 port: 5672 
 username: guest 
 password: guest 

(4)發送者Sender

@Component 
public class Sender { 
 
 private static final Logger log = LoggerFactory.getLogger(Sender.class); 
 @Autowired 
 private AmqpTemplate amqpTemplate; 
 
 public void send() { 
 String context = "hello " + new Date(); 
 log.info("Sender : " + context); 
 this.amqpTemplate.convertAndSend("hello", context); 
 } 
} 

(5)接受者Receiver

@Component 
@RabbitListener(queues = "hello") 
public class Receiver { 
 
 private static final Logger log = LoggerFactory.getLogger(Receiver.class); 
 
 @RabbitHandler 
 public void process(String hello) { 
 log.info("Receiver : " + hello); 
 } 
} 

(6)創建RabbitMQ的配置類 RabbitConfig

@Configuration 
public class RabbitConfig { 
 
 @Bean 
 public Queue helloQueue(){ 
 return new Queue("hello"); 
 } 
} 

(7)創建單元測試類, 用來調用消息生產

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringBootTest(classes = SpringcloudbusrabbitmqApplication.class) 
public class HelloApplicationTests { 
 
 @Autowired 
 private Sender sender; 
 
 @Test 
 public void hello() throws Exception { 
 sender.send(); 
 } 
} 

(8)測試,執行HelloApplicationTests

SpringCloud之消息總線Spring Cloud Bus實例代碼

(9)訪問host:15672

SpringCloud之消息總線Spring Cloud Bus實例代碼

四、改造Config-Client(整合springcloud bus)

(1)pom.xml

<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-eureka</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> 

(2)bootstrap.properties

spring.application.name=configspace 
spring.cloud.config.label=master 
spring.cloud.config.profile=dev 
spring.cloud.config.uri= http://localhost:5588/ 
eureka.client.serviceUrl.defaultZone=http://localhost:5555/eureka/ 
 
server.port=5589 
 
spring.rabbitmq.host=118.89.237.88 
spring.rabbitmq.port= 5672 
spring.rabbitmq.username=guest 
spring.rabbitmq.password=guest 
 
management.security.enabled=false 

(3)其他不用改變

五、測試

(1)測試準備

一個服務注冊中心,EUREKASERVER,端口為5555;

一個分布式配置中心,ConfigServer,端口為5588;

二個分布式配置,ConfigClient,端口為5589、5590;(2)訪問http://localhost:5589/from

SpringCloud之消息總線Spring Cloud Bus實例代碼

(3)訪問http://localhost:5590/from

SpringCloud之消息總線Spring Cloud Bus實例代碼

RabbitMQ:

SpringCloud之消息總線Spring Cloud Bus實例代碼

(4)去倉庫修改password的值

from=git-dev-v1.0 by springcloud config-server 
username=springcloud 
password=1234567890 

(5)POST請求http://localhost:5589/bus/refresh或者http://localhost:5590/bus/refresh

SpringCloud之消息總線Spring Cloud Bus實例代碼

成功請求后config-client會重新讀取配置文件

SpringCloud之消息總線Spring Cloud Bus實例代碼

(6)再次訪問

  1. 如果POST請求的是:http://localhost:5589/bus/refresh,請訪問http://localhost:5590/from
  2. 如果訪問出現401,則配置需要加上management.security.enabled=false

SpringCloud之消息總線Spring Cloud Bus實例代碼

如果POST請求的是:http://localhost:5590/bus/refresh,請訪問http://localhost:5589/from

SpringCloud之消息總線Spring Cloud Bus實例代碼

另/bus/refresh接口可以指定服務,即使用“username”參數,比如 “/bus/refresh?destination=username:**”即刷新服務名為username的所有服務,不管ip地址。

(7)架構

SpringCloud之消息總線Spring Cloud Bus實例代碼

(8)架構調整

既然SpringCloud Bus的/bus/refresh接口提供了針對服務和實例進行配置更新的參數,那么我們的架構也可以相應做出一些調整。在之前的架構中,服務的配置更新需要通過向具體服務中的某個實例發送請求,再觸發對整個服務集群的配置更新。雖然能實現功能,但是這樣的結果是,我們指定的應用實例會不同千集群中的其他應用實例,這樣會增加集群內部的復雜度,不利于將來的運維工作。比如, 需要對服務實例進行遷移,那么我們不得不修改Web Hook中的配置等。所以要盡可能地讓服務集群中的各個節點是對等的。

因此, 我們將之前的架構做了 一些調整, 如下圖所示:

SpringCloud之消息總線Spring Cloud Bus實例代碼

主要做了以下這些改動:

  1. 在ConfigServer中也引入SpringCloud Bus,將配置服務端也加入到消息總線中來。
  2. /bus/refresh請求不再發送到具體服務實例上,而是發送給Config Server,并通過des巨nation參數來指定需要更新配置的服務或實例。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桦南县| 南宫市| 浙江省| 高青县| 包头市| 班戈县| 西乌珠穆沁旗| 吕梁市| 新郑市| SHOW| 灵寿县| 十堰市| 邵阳县| 张家界市| 阿瓦提县| 介休市| 高青县| 镇赉县| 浦县| 汤阴县| 奈曼旗| 秦皇岛市| 天峻县| 临夏市| 清新县| 涞源县| 石屏县| 漳州市| 秦安县| 兰溪市| 凤冈县| 沧州市| 芦溪县| 永胜县| 芷江| 渑池县| 电白县| 永昌县| 黄石市| 思茅市| 祥云县|