Commit 6d3d0973837fc8602c3211f61f39857d9265b913

Authored by YunaiV
1 parent 93dd97af

feat: 增加 IoT Kafka 消息总线实现

- 新增 IotKafkaMessageBus,支持 IoT gateway 与 yudao-server 通过 Kafka 通信
- 增加 type=kafka 自动配置,并补充消息总线类型说明
- 为 iot-gateway 补充 spring-kafka 依赖和 Kafka 连接配置
- 将 iot-gateway 与 yudao-server 的 IoT message-bus 默认切换为 kafka
yudao-module-iot/yudao-module-iot-core/src/main/java/cn/iocoder/yudao/module/iot/core/messagebus/config/IotMessageBusAutoConfiguration.java
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.mq.redis.core.job.RedisStreamMessageCleanupJob @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.mq.redis.core.job.RedisStreamMessageCleanupJob
6 import cn.iocoder.yudao.framework.mq.redis.core.stream.AbstractRedisStreamMessage; 6 import cn.iocoder.yudao.framework.mq.redis.core.stream.AbstractRedisStreamMessage;
7 import cn.iocoder.yudao.framework.mq.redis.core.stream.AbstractRedisStreamMessageListener; 7 import cn.iocoder.yudao.framework.mq.redis.core.stream.AbstractRedisStreamMessageListener;
8 import cn.iocoder.yudao.module.iot.core.messagebus.core.IotMessageBus; 8 import cn.iocoder.yudao.module.iot.core.messagebus.core.IotMessageBus;
  9 +import cn.iocoder.yudao.module.iot.core.messagebus.core.kafka.IotKafkaMessageBus;
9 import cn.iocoder.yudao.module.iot.core.messagebus.core.local.IotLocalMessageBus; 10 import cn.iocoder.yudao.module.iot.core.messagebus.core.local.IotLocalMessageBus;
10 import cn.iocoder.yudao.module.iot.core.messagebus.core.rabbitmq.IotRabbitMQMessageBus; 11 import cn.iocoder.yudao.module.iot.core.messagebus.core.rabbitmq.IotRabbitMQMessageBus;
11 import cn.iocoder.yudao.module.iot.core.messagebus.core.redis.IotRedisMessageBus; 12 import cn.iocoder.yudao.module.iot.core.messagebus.core.redis.IotRedisMessageBus;
@@ -18,6 +19,7 @@ import org.redisson.api.RedissonClient; @@ -18,6 +19,7 @@ import org.redisson.api.RedissonClient;
18 import org.springframework.amqp.rabbit.core.RabbitAdmin; 19 import org.springframework.amqp.rabbit.core.RabbitAdmin;
19 import org.springframework.amqp.rabbit.core.RabbitTemplate; 20 import org.springframework.amqp.rabbit.core.RabbitTemplate;
20 import org.springframework.boot.autoconfigure.AutoConfiguration; 21 import org.springframework.boot.autoconfigure.AutoConfiguration;
  22 +import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
21 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 23 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
22 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 24 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
23 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 25 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -27,6 +29,7 @@ import org.springframework.context.annotation.Bean; @@ -27,6 +29,7 @@ import org.springframework.context.annotation.Bean;
27 import org.springframework.context.annotation.Configuration; 29 import org.springframework.context.annotation.Configuration;
28 import org.springframework.data.redis.core.RedisTemplate; 30 import org.springframework.data.redis.core.RedisTemplate;
29 import org.springframework.data.redis.core.StringRedisTemplate; 31 import org.springframework.data.redis.core.StringRedisTemplate;
  32 +import org.springframework.kafka.core.KafkaTemplate;
30 33
31 import java.util.List; 34 import java.util.List;
32 35
@@ -77,6 +80,21 @@ public class IotMessageBusAutoConfiguration { @@ -77,6 +80,21 @@ public class IotMessageBusAutoConfiguration {
77 80
78 } 81 }
79 82
  83 + // ==================== Kafka 实现 ====================
  84 +
  85 + @Configuration
  86 + @ConditionalOnProperty(prefix = "yudao.iot.message-bus", name = "type", havingValue = "kafka")
  87 + @ConditionalOnClass(KafkaTemplate.class)
  88 + public static class IotKafkaMessageBusConfiguration {
  89 +
  90 + @Bean
  91 + public IotKafkaMessageBus iotKafkaMessageBus(KafkaProperties kafkaProperties) {
  92 + log.info("[iotKafkaMessageBus][创建 IoT Kafka 消息总线]");
  93 + return new IotKafkaMessageBus(kafkaProperties);
  94 + }
  95 +
  96 + }
  97 +
80 // ==================== Redis 实现 ==================== 98 // ==================== Redis 实现 ====================
81 99
82 /** 100 /**
yudao-module-iot/yudao-module-iot-core/src/main/java/cn/iocoder/yudao/module/iot/core/messagebus/config/IotMessageBusProperties.java
@@ -20,9 +20,9 @@ public class IotMessageBusProperties { @@ -20,9 +20,9 @@ public class IotMessageBusProperties {
20 /** 20 /**
21 * 消息总线类型 21 * 消息总线类型
22 * 22 *
23 - * 可选值:local、redis、rocketmq、rabbitmq 23 + * 可选值:local、redis、rocketmq、kafka、rabbitmq
24 */ 24 */
25 @NotNull(message = "IoT 消息总线类型不能为空") 25 @NotNull(message = "IoT 消息总线类型不能为空")
26 private String type = "local"; 26 private String type = "local";
27 27
28 -}  
29 \ No newline at end of file 28 \ No newline at end of file
  29 +}
yudao-module-iot/yudao-module-iot-gateway/pom.xml
@@ -30,9 +30,13 @@ @@ -30,9 +30,13 @@
30 30
31 <!-- 消息队列相关 --> 31 <!-- 消息队列相关 -->
32 <dependency> 32 <dependency>
  33 + <groupId>org.springframework.kafka</groupId>
  34 + <artifactId>spring-kafka</artifactId>
  35 + <optional>true</optional>
  36 + </dependency>
  37 + <dependency>
33 <groupId>org.apache.rocketmq</groupId> 38 <groupId>org.apache.rocketmq</groupId>
34 <artifactId>rocketmq-spring-boot-starter</artifactId> 39 <artifactId>rocketmq-spring-boot-starter</artifactId>
35 - <!-- TODO @芋艿:消息队列,后续可能去掉,默认不使用 rocketmq -->  
36 <optional>true</optional> 40 <optional>true</optional>
37 </dependency> 41 </dependency>
38 42
yudao-module-iot/yudao-module-iot-gateway/src/main/resources/application.yaml
@@ -12,6 +12,9 @@ spring: @@ -12,6 +12,9 @@ spring:
12 database: 0 # Redis 数据库索引 12 database: 0 # Redis 数据库索引
13 # password: # Redis 密码,如果有的话 13 # password: # Redis 密码,如果有的话
14 timeout: 30000ms # 连接超时时间 14 timeout: 30000ms # 连接超时时间
  15 + # Kafka 配置项,对应 KafkaProperties 配置类
  16 + kafka:
  17 + bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
15 18
16 --- #################### 消息队列相关 #################### 19 --- #################### 消息队列相关 ####################
17 20