本文演示是的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,都没有问题,到这儿里就报这个错误了,也不知道是哪儿的问题~~先记录下吧~~!
如果有朋友能知道原因,请留言~~