共計(jì) 3953 個(gè)字符,預(yù)計(jì)需要花費(fèi) 10 分鐘才能閱讀完成。
這篇文章給大家分享的是有關(guān) Spring Cloud 如何開(kāi)發(fā)消息微服務(wù)的內(nèi)容。丸趣 TV 小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨丸趣 TV 小編過(guò)來(lái)看看吧。
開(kāi)發(fā)消息微服務(wù)準(zhǔn)備工作
我們需要在微服務(wù)客戶端中實(shí)現(xiàn)消息生產(chǎn)者與消費(fèi)者,先建立以下幾個(gè)項(xiàng)目:
spring-server:Eureka 服務(wù)器,端口 8761,代碼目錄“codes\08\8.4\spring-server”。
spring-consumer:消息消費(fèi)者,Eureka 客戶端,注冊(cè)到 Eureka,端口 8080,代碼目錄“codes\08\8.4\spring-consumer”。
spring-producer:消息生產(chǎn)者,Eureka 客戶端,注冊(cè)到 Eureka,端口 8081,代碼目錄“codes\08\8.4\spring-producer”。
整個(gè)集群加上消息代理,結(jié)構(gòu)如圖 8 -10 所示。
圖 8 -10 程序結(jié)構(gòu)
由于 Spring Cloud Stream 幫我實(shí)現(xiàn)了與消息代者交互的功能,因此對(duì)于集群中的生產(chǎn)者與消費(fèi)者來(lái)說(shuō),不需要關(guān)心外部使用的是哪一個(gè)消息框架,本小節(jié)的案例,默認(rèn)使用 RabbitMQ,默認(rèn)情況下,會(huì)連接本地的 5762 端口,如果需要在微服務(wù)中修改 RabbitMQ 的連接信息,可使用以下配置:
spring:
application:
name: spring-producer
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
編寫生產(chǎn)者
在“spring-producer”項(xiàng)目中,加入以下依賴:
dependency
groupId org.springframework.cloud /groupId
artifactId spring-cloud-starter-config /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-stream-rabbit /artifactId
/dependency
主要引入“spring-coud-starter-stream-rabbit”依賴,該依賴會(huì)自動(dòng)幫我們的項(xiàng)目引入“spring-cloud-stream”以及“spring-cloud-stream-binder”。
接下來(lái),編寫發(fā)送服務(wù),請(qǐng)見(jiàn)代碼清單 8 -5。
代碼清單 8 -5:codes\08\8.4\spring-producer\src\main\java\org\crazyit\cloud\SendService.java
public interface SendService { @Output( myInput)
SubscribableChannel sendOrder();}
新建一個(gè) SendService 接口,添加 sendOrder 方法,該方法使用 @Output 注解進(jìn)行修飾。使用該注解,表示會(huì)創(chuàng)建“myInput”的消息通道,調(diào)用該方法后,會(huì)向“myInput”通道投遞消息,如果 @Output 注解不提供參數(shù),則使用方法名作為通道名稱。接下來(lái),需要讓 Spring 容器開(kāi)啟綁定的功能,在 Application 類中,加入 @EnableBinding 注解,請(qǐng)見(jiàn)代碼清單 8 -6。
代碼清單 8 -6:
codes\08\8.4\spring-producer\src\main\java\org\crazyit\cloud\ProducerApplication.java
@SpringBootApplication
@EnableEurekaClient
@EnableBinding(SendService.class)
public class ProducerApplication { public static void main(String[] args) { SpringApplication.run(ProducerApplication.class, args);
}
}
@EnableBinding 注解中,以 SendService.class 作為參數(shù),Spring 容器在啟動(dòng)時(shí),會(huì)自動(dòng)綁定 SendService 接口中定義的通道。編寫控制器,調(diào)用 SendService 的發(fā)送方法,往服務(wù)器發(fā)送消息,請(qǐng)見(jiàn)代碼清單 8 -7。
代碼清單 8 -7:
codes\08\8.4\spring-producer\src\main\java\org\crazyit\cloud\ProducerController.java
@RestController
public class ProducerController {
@Autowired
SendService sendService;
@RequestMapping(value = /send , method = RequestMethod.GET)
public String sendRequest() {
// 創(chuàng)建消息
Message msg = MessageBuilder.withPayload(Hello World .getBytes()).build();
// 發(fā)送消息
sendService.sendOrder().send(msg);
return SUCCESS
}
}
在控制器中,通過(guò) @Autowired 自動(dòng)注入 SendService,調(diào)用 sendOrder 方法得到 SubscribableChannel(通道)實(shí)例,再調(diào)用 send 方法,將“Hello World”字符串發(fā)送至“消息代理”中,本例默認(rèn)的消息代理為 RabbitMQ。下面,先實(shí)現(xiàn)消息者,再一起整合測(cè)試。
編寫消費(fèi)者
消費(fèi)者項(xiàng)目(spring-consumer)所使用的依賴與生產(chǎn)者一致,先編寫接收消息的通道接口,請(qǐng)見(jiàn)代碼清單 8 -8。
代碼清單 8 -8:
codes\08\8.4\spring-consumer\src\main\java\org\crazyit\cloud\ReceiveService.java
public interface ReceiveService { @Input( myInput)
SubscribableChannel myInput();}
在 ReceiveService 中,定義了一個(gè)“myInput”的消息輸入通道,接下來(lái),與生產(chǎn)者一樣,在啟動(dòng)類中綁定消息通道,請(qǐng)見(jiàn)代碼清單 8 -9。
代碼清單 8 -9:
codes\08\8.4\spring-consumer\src\main\java\org\crazyit\cloud\ReceiverApplication.java
@SpringBootApplication
@EnableBinding(ReceiveService.class)
public class ReceiverApplication {
public static void main(String[] args) { SpringApplication.run(ReceiverApplication.class, args);
}
@StreamListener(myInput)
public void receive(byte[] msg) { System.out.println( 接收到的消息: + new String(msg));
}
}
在啟動(dòng)類中,同樣使用了 @EnableBinding 來(lái)開(kāi)啟綁定,并聲明了通道的接口類。新建了一個(gè) receive 方法,使用 @StreamListener 注解進(jìn)行修飾,聲明了訂閱“myInput”通道的消息。
依次啟動(dòng) spring-server(8761 端口)、spring-producer(8081 端口)、spring-consumer(8080 端口),訪問(wèn):http://localhost:8081/send,再打開(kāi)消息者控制臺(tái),可以看到“Hello World”字符串的輸出,證明消費(fèi)者已經(jīng)可以從消息代理中獲取到消息。
更換綁定器
前面的例子中,使用了 RabbitMQ 作為消息代理,如果想使用 Kafka,可以更換 Maven 依賴來(lái)實(shí)現(xiàn)。在生產(chǎn)者與消費(fèi)者的 pom.xml 中,將 spring-cloud-starter-stream-rabbit 的依賴,修改為 spring-cloud-starter-stream-kafka,請(qǐng)見(jiàn)以下配置:
dependency
groupId org.springframework.cloud /groupId
artifactId spring-cloud-starter-stream-kafka /artifactId
/dependency
Spring Cloud 提供了綁定器的 API,目前實(shí)現(xiàn)了 RabbitMQ 與 Kafka 的綁定器。在筆者看來(lái),綁定器更像適配器,對(duì)于我們的消息程序來(lái)說(shuō),并不關(guān)心使用了哪個(gè)消息代理,這些都由綁定器去實(shí)現(xiàn)。
感謝各位的閱讀!關(guān)于“Spring Cloud 如何開(kāi)發(fā)消息微服務(wù)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!