消息服务-stream-kafka
Spring Cloud Stream本质上就是整合了Spring Boot和Spring Integration,
实现了一套轻量级的消息驱动的微服务框架。通过使用Spring Cloud Stream,
可以有效地简化开发人员对消息中间件的使用复杂度,
让系统开发人员可以有更多的精力关注于核心业务逻辑的处理。
安装kafka
创建消费者项目
springcloud-kafka-consumer
pom 文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringCloud-demo</artifactId>
<groupId>SpringCloud-demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>SpringCloud-demo</groupId>
<artifactId>springcloud-stream-kafka</artifactId>
<packaging>pom</packaging>
<modules>
<module>springcloud-kafka-provider</module>
<module>springcloud-kafka-consumer</module>
</modules>
<dependencies>
<!-- 消息队列kafka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>
<!-- 服务发现客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- spring-boot-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
创建输入接受通道
public interface InputChannel {
// test 通道协议字段
String INPUT = "kd";
@Input(InputChannel.INPUT)
public SubscribableChannel input();
}
创建消息监听类加粗样式
@EnableBinding(value = {InputChannel.class})
public class MyReceiver {
@StreamListener(InputChannel.INPUT)
public void messageListen(String message) {
System.out.println("收到信息:" + message);
}
}
消费者启动类
@SpringBootApplication
@EnableDiscoveryClient
public class KafkaConsumerRun {
public static void main(String[] args) {
SpringApplication.run(KafkaConsumerRun.class, args);
}
}
启动消费者,监听生产者发送过来的消息
创建生成者项目
springcloud-kafka-provider
pom 文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringCloud-demo</artifactId>
<groupId>SpringCloud-demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>SpringCloud-demo</groupId>
<artifactId>springcloud-stream-kafka</artifactId>
<packaging>pom</packaging>
<modules>
<module>springcloud-kafka-provider</module>
<module>springcloud-kafka-consumer</module>
</modules>
<dependencies>
<!-- 消息队列kafka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>
<!-- 服务发现客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- spring-boot-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
配置application.yml
#将服务注册到注册中心
eureka:
client:
serviceUrl:
defaultZone: http://localhost:9000/eureka/
#healthcheck:
#enabled: true #开启自定义健康检查
instance:
#eureka服务器在接收到最后一个心跳之后等待的时间,然后才能从列表中删除此实例 默认90s(开发环境)
lease-expiration-duration-in-seconds: 10
#eureka客户端需要向eureka服务器发送心跳的频率 默认30s (开发环境)
lease-renewal-interval-in-seconds: 1
#配置服务名称及端口
server:
port: 9014
spring:
application:
name: springcloud-provider
---
# provider 生产者
spring:
cloud:
stream:
kafka:
binder:
brokers: 127.0.0.1:9092
zkNodes: 127.0.0.1:2181
bindings:
# 通道协议字段
kd:
# 生产者和消费者要一样
destination: topic-test
# 传输格式
#content-type: application/json
创建provider发送通道
public interface OutChannel {
String OUTPUT = "kd";
@Output(OutChannel.OUTPUT)
MessageChannel output();
}
绑定发送通道
@EnableBinding(OutChannel.class)
public class KafkaSend {
@Autowired
private OutChannel outChannel;
/*
* 发送消息
* */
public void sendMessage(String msg) {
try {
outChannel.output().send(MessageBuilder.withPayload(msg).build());
} catch (Exception e) {
e.printStackTrace();
}
}
}
编写页面controller测试类
@RestController
public class SendController {
@Autowired
KafkaSend kafkaSend;
@RequestMapping("/")
public String test (){
kafkaSend.sendMessage("===================我是一条消息的小尾巴=========================");
return "发送测试";
}
}
生产者启动类
@SpringBootApplication
@EnableDiscoveryClient
public class KafkaProviderRun {
public static void main(String[] args) {
SpringApplication.run(KafkaProviderRun.class, args);
}
}
启动生产者,并测试
http://localhost:9014/
消费者监听到消息