本文演示是的SpringCloud Stream的消息生產者,和RabbitMQ進行配合
1、構建生產者項目cloud-stream-rabbitmq-provider8801,添加pom文件依賴
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2、構建application.yml文件,添加rabbitmq和output配置
server:
port: 8801
spring:
application:
name: cloud-stream-rabbitmq-provider
cloud:
stream:
binders: # 在此處配置要綁定的rabbitmq的服務信息;
defaultRabbit: # 表示定義的名稱,用於於binding整合
type: rabbit # 消息組件類型
environment: # 設置rabbitmq的相關的環境配置
spring:
rabbitmq:
host: localhost
port: 5672
username: admin
password: admin
virtual-host: my_vhost
bindings: # 服務的整合處理
output: # 這個名字是一個通道的名稱
destination: studyExchange # 表示要使用的Exchange名稱定義
content-type: application/json # 設置消息類型,本次爲json,文本則設置“text/plain”
binder: defaultRabbit # 設置要綁定的消息服務的具體設置
eureka:
client:
#表示是否將自己註冊進EurekaServer默認爲true。
register-with-eureka: true
#是否從EurekaServer抓取已有的註冊信息,默認爲true。單節點無所謂,集羣必須設置爲true才能配合ribbon使用負載均衡
fetchRegistry: true
service-url:
#單機
defaultZone: http://localhost:7001/eureka
# 集羣
#defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
3、構建主啓動類
@SpringBootApplication
public class StreamRabbitProviderMain8801 {
public static void main(String[] args) {
SpringApplication.run(StreamRabbitProviderMain8801.class,args);
}
}
4、構建業務類,寫一個測試接口
/**
* created by king on 2020/4/28 1:22 下午
*/
public interface IMessageProviderService {
public String send();
}
5、實現此接口,並添加相關注解和構建消息,可參見官網配置springcloud stream producer官網配置書寫
package com.king.springcloud.service.impl;
import com.king.springcloud.service.IMessageProviderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.MessageChannel;
import javax.annotation.Resource;
import java.util.UUID;
/**
* created by king on 2020/4/28 1:23 下午
*/
@EnableBinding(Source.class)//定義消息的推送管道
@Slf4j
public class MessageProviderServiceImpl implements IMessageProviderService {
@Resource
private MessageChannel output; //消息發送管道
@Override
public String send() {
String serial = UUID.randomUUID().toString();
output.send(MessageBuilder.withPayload(serial).build());
log.info("*******serial:"+serial);
return null;
}
}
6、提供接口,共外部訪問生產消息
/**
* created by king on 2020/4/28 1:39 下午
*/
@RestController
public class StreamSendMessageController {
@Resource
private IMessageProviderService messageProviderService;
@GetMapping(value = "/sendMsg")
public String sendMsg(){
return messageProviderService.send();
}
}
7、啓動RabbitMQ服務,啓動eureka7001,啓動provider8801項目,進行測試 http://localhost:8801/sendMsg
結果:
後臺打印出日誌信息 顯示隨機字符串
RabbitMQ的web端,也能看到消息響應波峯
表示提供者能發送消息到RabbitMQ了~
!!~~~~~~!!!!!!!!!!!!!!!!!!
此處其實還有個問題,就是我8801項目雖然啓動了,消息也生產到RabbitMQ了,但是我的8801項目後臺是報錯的,報:ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN 錯誤
網上搜索是說 賬戶和密碼不對,但是我用同樣的賬戶和密碼 admin/admin都能登錄web頁面,而且前邊用SpringCloud Bus的時候,也是使用的同樣的RabbitMQ,都沒有問題,到這兒裏就報這個錯誤了,也不知道是哪兒的問題~~先記錄下吧~~!
如果有朋友能知道原因,請留言~~