最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年04月08日 09:43:06   作者:smartdt  
這篇文章主要介紹了SpringCloud之消息總線Spring Cloud Bus實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、簡介

在微服務(wù)架構(gòu)的系統(tǒng)中,我們通常會使用輕量級的消息代理來構(gòu)建一個共用的消息主題讓系統(tǒng)中所有微服務(wù)實例都連接上來,由于該主題中產(chǎn)生的消息會被所有實例監(jiān)聽和消費,所以我們稱它為消息總線。

二、消息代理

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

  1. 將消息路由到一個或多個目的地。
  2. 消息轉(zhuǎn)化為其他的表現(xiàn)方式。
  3. 執(zhí)行消息的聚集、消息的分解,并將結(jié)果發(fā)送到它們的目的地,然后重新組合響應(yīng)返回給消息用戶。
  4. 調(diào)用Web服務(wù)來檢索數(shù)據(jù)。
  5. 響應(yīng)事件或錯誤。
  6. 使用發(fā)布-訂閱模式來提供內(nèi)容或基千主題的消息路由。

目前已經(jīng)有非常多的開源產(chǎn)品可以供大家使用, 比如:

  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)發(fā)送者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)創(chuàng)建RabbitMQ的配置類 RabbitConfig

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

(7)創(chuàng)建單元測試類, 用來調(diào)用消息生產(chǎn)

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

(8)測試,執(zhí)行HelloApplicationTests


(9)訪問host:15672


四、改造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)測試準(zhǔn)備

一個服務(wù)注冊中心,EUREKASERVER,端口為5555;

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

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


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


RabbitMQ:


(4)去倉庫修改password的值

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

(5)POST請求http://localhost:5589/bus/refresh或者h(yuǎn)ttp://localhost:5590/bus/refresh


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


(6)再次訪問

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


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


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

(7)架構(gòu)


(8)架構(gòu)調(diào)整

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

因此, 我們將之前的架構(gòu)做了 一些調(diào)整, 如下圖所示:


主要做了以下這些改動:

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Java線程池的使用(7種創(chuàng)建方法)

    詳解Java線程池的使用(7種創(chuàng)建方法)

    這篇文章主要介紹了詳解Java線程池的使用(7種創(chuàng)建方法),線程池的創(chuàng)建?式總共包含7種,其中6種是通過Executors創(chuàng)建的,1種是通過ThreadPoolExecutor創(chuàng)建的,今天我們就來詳細(xì)說一下
    2023-03-03
  • java、freemarker保留兩位小數(shù)

    java、freemarker保留兩位小數(shù)

    這篇文章主要介紹了 java、freemarker保留兩位小數(shù)的實現(xiàn)方法,然后給大家補充介紹了freemarker保留兩位小數(shù)的詳解,需要的朋友可以參考下
    2017-03-03
  • Springboot自定義banner及驗證過程

    Springboot自定義banner及驗證過程

    這篇文章主要介紹了Springboot自定義banner及驗證過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Springboot 如何使用@Async整合線程池

    Springboot 如何使用@Async整合線程池

    這篇文章主要介紹了Springboot 使用@Async整合線程池的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java @SentinelResource全面介紹

    Java @SentinelResource全面介紹

    在實際應(yīng)用過程中,我們可能需要限流的層面不僅限于接口??赡軐τ谀硞€方法的調(diào)用限流,對于某個外部資源的調(diào)用限流等都希望做到控制。對此,我們需要學(xué)習(xí)使用@SentinelResource注解,靈活的定義控制資源以及如何配置控制策略
    2022-08-08
  • SpringBoot如何統(tǒng)一處理返回結(jié)果和異常情況

    SpringBoot如何統(tǒng)一處理返回結(jié)果和異常情況

    這篇文章主要介紹了SpringBoot如何統(tǒng)一處理返回結(jié)果和異常情況問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 最新評論

    海淀区| 屏山县| 贵定县| 台中市| 贵阳市| 济宁市| 柘城县| 平和县| 怀柔区| 邵阳市| 吉木萨尔县| 鸡东县| 葵青区| 盱眙县| 龙里县| 穆棱市| 竹山县| 基隆市| 宝清县| 汝南县| 香格里拉县| 阿鲁科尔沁旗| 元阳县| 上高县| 开远市| 扶余县| 聊城市| 嘉荫县| 乐陵市| 广西| 四会市| 库伦旗| 新巴尔虎右旗| 洛南县| 新源县| 昌平区| 锡林浩特市| 乐安县| 通许县| 胶南市| 辽阳市|