我的博客:程序員笑笑生,歡迎瀏覽博客!
? ?上一章 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中:
顯示了2個消費者,我們通過HTTP調用生產者的發送接口: http://localhost:8081/send?msg=test
我們看到receiver1:日志
我們看到receiver2:日志
我們看到每個實例都會受到消息。這不是我們想要的,我們需要不管消費者服務有多少實例,確保只有一個實例消費信息。
二、添加分組配置
? 在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
?重啟項目后,再次通過生產者發送消息后,就能確保只有一個消費者收到消息了。
我們可以看到未分組之前是這樣的:
分組之后:
總結
?本章主要是通過示例的方式,使用Spring Cloud Stream如何實現消費者分組,這也是在實際的開發中需要考慮的問題。
----END----
? .以就是本期的分享,你還可以關注公眾號: 程序員笑笑生,關注更多精彩內容!
SpringCloud基礎教程(一)-微服務與SpringCloud
SpringCloud基礎教程(二)-服務發現 Eureka
SpringCloud基礎教程(五)-配置中心熱生效和高可用
SpringCloud 基礎教程(六)-負載均衡Ribbon
SpringCloud 基礎教程(七)-Feign聲明式服務調用
SpringCloud 基礎教程(八)-Hystrix熔斷器(上)
SpringCloud 基礎教程(九)-Hystrix服務監控(下)
SpringCloud 基礎教程(十一)- Sleuth 調用鏈追蹤簡介
SpringCloud 基礎教程(十二)-Zipkin 分布式鏈路追蹤系統搭建
SpringCloud 進階: 消息驅動(入門) Spring Cloud Stream【Greenwich.SR3】
SpringCloud 進階: Spring Cloud Stream 核心組件
SpringCloud 進階: 消息驅動之Spring Cloud Stream 消費者分組
更多精彩內容,請期待...
本文由博客一文多發平臺 OpenWrite 發布!