消息系统整合框架Spring Cloud Stream
简介
官网
【原文 】A lightweight event-driven microservices framework to quickly build applications that can connect to external systems. Simple declarative(声名式的) model to send and receive messages using Apache Kafka or RabbitMQ between Spring Boot apps. 【翻译 】一个轻量级的事件驱动微服务框架,用于快速构建可连接到外部系统的应用程序。在 Spring Boot 应用程序之间使用 Kafka 或 RabbitMQ 发送和接收消息的简单声明式模型。
综合
程序模型
应用程序的核心部分(Application Core)通过 inputs 与 outputs 管道,与中间件连接,而管道是通过绑定器 Binder 与中间件相绑定的。
stream kafka微服务
创建生产者工程 08-provider-stream-kafka
新建一个 spring boot 工程,命名为 08-provider-stream-kafka,添加一个 Spring Cloud Stream Kafka 依赖:
< dependency>
< groupId> org.springframework.cloud</ groupId>
< artifactId> spring-cloud-stream-binder-kafka</ artifactId>
</ dependency>
消息发送给一个主题
@EnableBinding ( Source . class )
@Component
public class SomeProducer {
@Autowired
@Qualifier ( Source . OUTPUT)
private MessageChannel channel;
public void sendMsg ( String message) {
channel. send ( MessageBuilder . withPayload ( message) . build ( ) ) ;
}
}
@RestController
public class SomeController {
@Autowired
private SomeProducer producer;
@PostMapping ( "/msg/send" )
public String sendMsg ( @RequestParam ( "message" ) String message) {
producer. sendMsg ( message) ;
return "send success" ;
}
}
server :
port : 8090
spring :
application :
name : msc- provider- stream- kafka
cloud :
stream :
kafka :
binder :
brokers : 192.168.254.128: 9092 , 192.168.254.130: 9092 , 192.168.254.132: 9092
auto-create-topics : true
bindings :
output :
destination : persons
content-type : text/plain
消息发送给多个主题
public interface CustomSource {
String CHANNEL_NAME = "xxx" ;
@Output ( CustomSource . CHANNEL_NAME)
MessageChannel output ( ) ;
}
测试
启动项目进行测试,通过 postman 调用接口发送消息,并用命令行启动一个kafka消费者客户端监听消息,命令如下
[ root@centos-host kafka]
[ root@centos-host kafka]
创建消费者工程 08-consumer-stream-kafka
复制 08-provider-stream-kafka 工程,重命名为 08-consumer-stream-kafka,在此基础上修改。 Spring Cloud Stream 提供了三种创建消费者的方式,这三种方式的都是在消费者类的“消费”方法上添加注解。只要有新的消息写入到了管道,该“消费”方法就会执行。只不过三种注解,其底层的实现方式不同。即当新消息到来后,触发“消费”方法去执行的实现方式不同。
@PostConstruct :以发布/订阅方式实现@ServiceActivator :新的消息激活服务方式实现@StreamListener :以监听方式实现
@PostConstruct方式
@Component
@EnableBinding ( Sink . class )
public class PostConstructConsumer {
@Autowired
@Qualifier ( Sink . INPUT)
private SubscribableChannel channel;
@PostConstruct
public void receiveMsg ( ) {
channel. subscribe ( new MessageHandler ( ) {
@Override
public void handleMessage ( Message < ? > message) throws MessagingException {
System . out. println ( "@PostConstruct --- " + message. getHeaders ( ) + ", " ) ;
byte [ ] payload = ( byte [ ] ) message. getPayload ( ) ;
System . out. println ( new String ( payload) ) ;
}
} ) ;
}
}
server :
port : 8080
spring :
application :
name : msc- stream- kafka
cloud :
stream :
kafka :
binder :
brokers : 192.168.254.128: 9092 , 192.168.254.130: 9092 , 192.168.254.132: 9092
auto-create-topics : true
bindings :
input :
destination : persons
启动工程,提供者工程调用接口发送消息,消费者可以正确接收消息:
@ServiceActivator方式
该注解所标注的方法是以服务的形式出现的,只要管道中的数据发生了变化就会激活该服务。 注释掉前面定义的消费者,然后重新创建消费者类:
@Component
@EnableBinding ( Sink . class )
public class ServiceActivatorConsumer {
@ServiceActivator ( inputChannel = Sink . INPUT)
public void receiveMsg ( Object message) {
System . out. println ( "@ServiceActivator --- " + message) ;
}
}
重启工程,提供者工程调用接口发送消息,消费者可以正确接收消息:
@StreamListener方式
该方式是以监听的方式实现,只要管道中的流数据发生变化,其就会触发该注解所标注的方法的执行。 注释掉前面定义的消费者,然后重新创建消费者类:
@Component
@EnableBinding ( Sink . class )
public class StreamListenerConsumer {
@StreamListener ( Sink . INPUT)
public void printMsg ( Object message) {
System . out. println ( message) ;
}
}
重启工程,提供者工程调用接口发送消息,消费者可以正确接收消息: