基于Eureka与RabbitMQ
一、生产者
1、引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
2、配置文件
server:
port: 8801
spring:
application:
name: cloud-stream-rabbitmq-provider
rabbitmq:
host: 192.168.10.128
port: 5672
username: admin
password: admin
cloud:
stream:
bindings: # 服务的整合处理
output: # 通道名称
destination: studyExchange # 交换机名称
content-type: application/json # 设置消息类型为json
binders: # 在此处配置要绑定的rabbitmq的服务信息
defaultRabbit: # 定义的名称,用于和binding整合
type: rabbit # 消息组件类型
environment: # 设置rabbitmq相关环境信息
spring:
rabbitmq:
host: 192.168.10.128
port: 5672
username: admin
password: admin
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka
instance:
lease-renewal-interval-in-seconds: 2 # 设置心跳间隔时间
lease-expiration-duration-in-seconds: 5 # 间隔时间
instance-id: cloud-stream-rabbitmq-provider-8801 # 在信息列表时显示主机名称
prefer-ip-address: true # 访问的路径变为IP地址
3、发送消息
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;
/**
* @Since 2021-02-02 23:07
*/
@EnableBinding(Source.class)
public class MessageProviderServiceServiceImpl implements MessageProviderService {
/**
* 消息发送管道
*/
@Resource
private MessageChannel output;
@Override
public String send() {
String serial = UUID.randomUUID().toString();
output.send(MessageBuilder.withPayload(serial).build());
return "发送成功-";
}
}
二、消费者
1、引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
2、配置文件
server:
port: 8802
spring:
application:
name: cloud-stream-rabbitmq-consumer
rabbitmq:
host: 192.168.10.128
port: 5672
username: admin
password: admin
cloud:
stream:
bindings: # 服务的整合处理
input: # 通道名称
destination: studyExchange # 交换机名称
content-type: application/json # 设置消息类型为json
group: test-consumer # 分组/队列
binders: # 在此处配置要绑定的rabbitmq的服务信息
defaultRabbit: # 定义的名称,用于和binding整合
type: rabbit # 消息组件类型
environment: # 设置rabbitmq相关环境信息
spring:
rabbitmq:
host: 192.168.10.128
port: 5672
username: admin
password: admin
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka
instance:
lease-renewal-interval-in-seconds: 2 # 设置心跳间隔时间
lease-expiration-duration-in-seconds: 5 # 间隔时间
instance-id: cloud-stream-rabbitmq-consumer-8802 # 在信息列表时显示主机名称
prefer-ip-address: true # 访问的路径变为IP地址
3、接收消息
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;
/**
* @Since 2021-02-02 23:07
*/
@EnableBinding(Sink.class)
public class MessageConsumerServiceService {
@StreamListener(Sink.INPUT)
public void input(Message<String> message) {
System.out.println("消费者8801 ======> 收到的消息:" + message.getPayload());
}
}
三、group配置
group配置用于消费者,对消费者进行分组配置(同一个组即使用同一个队列),
- 同一组内消息只会消费一次,所以一个集群应该放在一个组内,防止重复消费。
- 分组后可以实现持久化,即在宕机时未消费的消息在服务重启后可以继续消费,不会造成消息丢失。