SpringCloud Stream使用解析
官方定義Spring Cloud Stream 是一個構(gòu)建消息驅(qū)動微服務(wù)的框架。應(yīng)用通過inputs和outputs來與Spring Cloud Stream中binder對象交互。通過我們配置來binding(綁定),而Spring Cloud Stream中的binder對象負(fù)責(zé)與消息中間件交互。所以,我們只需要搞清楚如何與Spring Cloud Stream 交互就可以方便使用消息驅(qū)動的方式。通過使用Spring Integration來連接消息代理中間件以及實現(xiàn)消息事件驅(qū)動。目前僅支持RabbitMQ和kafka
下面用RabbitMQ來說明使用!案例之消息驅(qū)動之生產(chǎn)者1.建一個項目,并添加如下的依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</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-stream-rabbit</artifactId> </dependency>
2.編寫下面的yml文件
server: port: 8801spring: application: name: cloud-stream-provider rabbitmq: host: 192.168.43.76 port: 5672 username: guest password: guest cloud: stream: binders: # 在此處配置要綁定的rabbitmq的服務(wù)信息; defaultRabbit: # 表示定義的名稱,用于于binding整合 type: rabbit # 消息組件類型# environment: # 設(shè)置rabbitmq的相關(guān)的環(huán)境配置,(本機(jī)方式)# spring:# rabbitmq:#host: localhost#port: 5672#username: guest#password: guest bindings: # 服務(wù)的整合處理 output: # 這個名字是一個通道的名稱 destination: studyExchange # 表示要使用的Exchange名稱定義 content-type: application/json # 設(shè)置消息類型,本次為json,文本則設(shè)置“text/plain” binder: defaultRabbit # 設(shè)置要綁定的消息服務(wù)的具體設(shè)置(爆紅不要管)eureka: client: # 客戶端進(jìn)行Eureka注冊的配置 service-url: defaultZone: http://localhost:7001/eureka instance: lease-renewal-interval-in-seconds: 2 # 設(shè)置心跳的時間間隔(默認(rèn)是30秒) lease-expiration-duration-in-seconds: 5 # 如果現(xiàn)在超過了5秒的間隔(默認(rèn)是90秒) instance-id: send-8801.com # 在信息列表時顯示主機(jī)名稱 prefer-ip-address: true # 訪問的路徑變?yōu)镮P地址
3.編寫service,下面僅展示實現(xiàn)類:
import org.lzl.springcloud.service.IMessageProvider;import org.springframework.cloud.stream.annotation.EnableBinding;import org.springframework.cloud.stream.messaging.Source;import org.springframework.messaging.MessageChannel;import org.springframework.messaging.support.MessageBuilder;import javax.annotation.Resource;import java.util.UUID;//注意這里不需要寫@Service,因為該service是跟rabbitmq打交道的@EnableBinding(Source.class)//定義消息的推送管道public class MessageProviderImpl implements IMessageProvider { @Resource private MessageChannel output; @Override public String send() { String serial = UUID.randomUUID().toString(); output.send(MessageBuilder.withPayload(serial).build()); System.out.println('*****serial:'+serial); return null; }}
4.編寫controller
import org.lzl.springcloud.service.IMessageProvider;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RestControllerpublic class SendMessageController { @Resource private IMessageProvider messageProvider; @GetMapping(value = '/sendMessage') public String sendMessage(){ return messageProvider.send(); }}案例之消息驅(qū)動消費(fèi)者
1.寫pom,加上下面的依賴
<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-stream-rabbit</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
2.編寫yml,和生產(chǎn)者唯一的區(qū)別在于,下面是input
server: port: 8802spring: application: name: cloud-stream-consumer rabbitmq: host: 192.168.43.76 port: 5672 username: guest password: guest cloud: stream: binders: # 在此處配置要綁定的rabbitmq的服務(wù)信息; defaultRabbit: # 表示定義的名稱,用于于binding整合 type: rabbit # 消息組件類型# environment: # 設(shè)置rabbitmq的相關(guān)的環(huán)境配置# spring:# rabbitmq:#host: localhost#port: 5672#username: guest#password: guest bindings: # 服務(wù)的整合處理 input: # 這個名字是一個通道的名稱 destination: studyExchange # 表示要使用的Exchange名稱定義 content-type: application/json # 設(shè)置消息類型,本次為對象json,如果是文本則設(shè)置“text/plain” binder: defaultRabbit # 設(shè)置要綁定的消息服務(wù)的具體設(shè)置eureka: client: # 客戶端進(jìn)行Eureka注冊的配置 service-url: defaultZone: http://localhost:7001/eureka instance: lease-renewal-interval-in-seconds: 2 # 設(shè)置心跳的時間間隔(默認(rèn)是30秒) lease-expiration-duration-in-seconds: 5 # 如果現(xiàn)在超過了5秒的間隔(默認(rèn)是90秒) instance-id: receive-8802.com # 在信息列表時顯示主機(jī)名稱 prefer-ip-address: true # 訪問的路徑變?yōu)镮P地址
3.編寫controller,該controller不向外界暴露端口,起到實時監(jiān)控消息管道的作用!
import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.cloud.stream.annotation.EnableBinding;import org.springframework.cloud.stream.annotation.StreamListener;import org.springframework.cloud.stream.messaging.Sink;import org.springframework.messaging.Message;import org.springframework.stereotype.Component;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@Component@EnableBinding(Sink.class)public class ReceiveMessageListenerController { @Value('${server.port}') private String serverPort; @StreamListener(Sink.INPUT)//只要8801發(fā)送消息,8802就會接收到8801的消息 public void input(Message<String> message){ System.out.println('消費(fèi)者1號--------》接收到的消息:'+message.getPayload()+'t port: '+serverPort); }}測試
啟動rabbitMQ和上面的兩個項目,訪問http://localhost:8801/sendMessage在消費(fèi)者的控制臺中就會出現(xiàn)下面的訂單流水號:

我們打開rabbitmq的監(jiān)控界面:發(fā)現(xiàn)默認(rèn)是幫我們分組的

想要自定義分組只需要在消費(fèi)者的yml文件中加上下面的一行:

如果有多個消費(fèi)者,為了避免出現(xiàn)重復(fù)消費(fèi)的問題,應(yīng)將組名設(shè)置成一樣的。一個組的成員輪循消費(fèi),不同組的成員進(jìn)行相同的消費(fèi)。
到此這篇關(guān)于SpringCloud Stream介紹的文章就介紹到這了,更多相關(guān)SpringCloud Stream介紹內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. 詳解Android studio 動態(tài)fragment的用法2. 編程語言PHP在Web開發(fā)領(lǐng)域的優(yōu)勢在哪?3. 什么是python的自省4. Spring Boot和Thymeleaf整合結(jié)合JPA實現(xiàn)分頁效果(實例代碼)5. 解決Android studio xml界面無法預(yù)覽問題6. 基于android studio的layout的xml文件的創(chuàng)建方式7. Android如何加載Base64編碼格式圖片8. Springboot Druid 自定義加密數(shù)據(jù)庫密碼的幾種方案9. Vue封裝一個TodoList的案例與瀏覽器本地緩存的應(yīng)用實現(xiàn)10. 圖文詳解vue中proto文件的函數(shù)調(diào)用

網(wǎng)公網(wǎng)安備