SpringCloud 進階:消息驅動之Spring Cloud Stream 消費者分組

我的博客:程序員笑笑生,歡迎瀏覽博客!

? ?上一章 SpringCloud進階:Spring Cloud Stream 核心組件當中,我們了解了Spring Cloud Stream的核心組件和Spring Integration的簡介,本章我們將聊一聊消費者分組相關的知識。

# 前言

?在實際的企業應用場景下,一條消息只能被一個消費者消費,但是在我們部署的應用中,通常會一個消費者應用部署了多臺實例。Spring Cloud Stream利用消費者分組就解決這個問題,確保當生產者發送一條消息后,多個實例當中只有一個能夠消費到這樣的消息。

一 、多實例未分組消費者測試

?在我們之前的章節中, SpringCloud進階-消息驅動pring Cloud Stream中,我們創建了消費者服務:server-receiver和生產者:server-sender,接下來我們結合之前的注冊中心Eureka搭建多實例的消費者,首先在server-receiver引入Eureka客戶端的依賴:

  <dependency>
    <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

?在resource目錄下新建applicaiton-s1.yml 、applicaiton-s2.yml 通過applicaiton.yml中配置spring.profiles.active屬性激活不同的配置文件:

applicaiton-s1.yml

spring:
  cloud:
    stream:
      bindings:
         input:
            destination: mytopic
            binder: defaultRabbit
      binders:
         defaultRabbit:
             type: rabbit
             environment:
                spring:
                 rabbitmq:
                     host: localhost
                     port: 5672
server:
  port: 8081


eureka:
    instance:
      hostname: eureka7001.com  #eureka服務端的實例名稱
      instance-id: receiver1
    client:
      service-url:
         # 與注冊中心交互的url
        defaultZone: http://eureka7001.com:7001/eureka/
        enabled: true

applicaiton-s2.yml

spring:
  cloud:
    stream:
      bindings:
         input:
            destination: mytopic
            binder: defaultRabbit
      binders:
         defaultRabbit:
             type: rabbit
             environment:
                spring:
                 rabbitmq:
                     host: localhost
                     port: 5672
server:
  port: 8082

eureka:
    instance:
      hostname: eureka7001.com  #eureka服務端的實例名稱
      instance-id: receiver2
    client:
      service-url:
         # 與注冊中心交互的url
        defaultZone: http://eureka7001.com:7001/eureka/
        enabled: true

?生產者:server-sender的代碼不變化,也不需要注冊到Eureak中,

@RestController
public class SenderController {

    @Autowired
    SenderSource source;

    @RequestMapping("/send")
    public String sender(String msg) {
        source.output().send(MessageBuilder.withPayload(msg).build());
        return "ok";
    }

?先后啟動Eureak和服務消費者server-receiver 兩 個實例,最后在啟動生產者:server-sender,我們看看Eureka中:

file

顯示了2個消費者,我們通過HTTP調用生產者的發送接口: http://localhost:8081/send?msg=test

我們看到receiver1:日志

file

我們看到receiver2:日志

file

我們看到每個實例都會受到消息。這不是我們想要的,我們需要不管消費者服務有多少實例,確保只有一個實例消費信息。

二、添加分組配置

? 在Spring Cloud Stream中,如果不給消費者指定一個組Group,那么Spring Cloud Stream將會給當前的實例分配一個匿名的、獨立的只有一個成員的消費組,這就導致了一個服務n個實例,就會有n個消費者分組;

?怎么樣去配置是的所有的實例都是一個組呢?我們可以通過配置 spring.cloud.stream.bindings.input.group=group1就可以實現,我們在applicaiton-s1.yml 和 applicaiton-s2.yml 添加:

spring:
  cloud:
    stream:
      bindings:
         input:
           group: group1

?重啟項目后,再次通過生產者發送消息后,就能確保只有一個消費者收到消息了。

我們可以看到未分組之前是這樣的:

我們看到每個實例都會受到消息。這不是我們想要的,我們需要不管消費者服務有多少實例,確保只有一個實例消費信息。

二、添加分組配置

? 在Spring Cloud Stream中,如果不給消費者指定一個組Group,那么Spring Cloud Stream將會給當前的實例分配一個匿名的、獨立的只有一個成員的消費組,這就導致了一個服務n個實例,就會有n個消費者分組;

?怎么樣去配置是的所有的實例都是一個組呢?我們可以通過配置 spring.cloud.stream.bindings.input.group=group1就可以實現,我們在applicaiton-s1.yml 和 applicaiton-s2.yml 添加:

spring:
  cloud:
    stream:
      bindings:
         input:
           group: group1

?重啟項目后,再次通過生產者發送消息后,就能確保只有一個消費者收到消息了。

我們可以看到未分組之前是這樣的:

file

分組之后:

file

總結

?本章主要是通過示例的方式,使用Spring Cloud Stream如何實現消費者分組,這也是在實際的開發中需要考慮的問題。

----END----

? .以就是本期的分享,你還可以關注公眾號: 程序員笑笑生,關注更多精彩內容!

file
file

SpringCloud基礎教程(一)-微服務與SpringCloud

SpringCloud基礎教程(二)-服務發現 Eureka

SpringCloud基礎教程(三)-Eureka進階

SpringCloud 基礎教程(四)-配置中心入門

SpringCloud基礎教程(五)-配置中心熱生效和高可用

SpringCloud 基礎教程(六)-負載均衡Ribbon

SpringCloud 基礎教程(七)-Feign聲明式服務調用

SpringCloud 基礎教程(八)-Hystrix熔斷器(上)

SpringCloud 基礎教程(九)-Hystrix服務監控(下)

SpringCloud 基礎教程(十)-Zull服務網關

SpringCloud 基礎教程(十一)- Sleuth 調用鏈追蹤簡介

SpringCloud 基礎教程(十二)-Zipkin 分布式鏈路追蹤系統搭建

SpringCloud 進階: 消息驅動(入門) Spring Cloud Stream【Greenwich.SR3】

SpringCloud 進階: Spring Cloud Stream 核心組件

SpringCloud 進階: 消息驅動之Spring Cloud Stream 消費者分組

更多精彩內容,請期待...

本文由博客一文多發平臺 OpenWrite 發布!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容