springcloud集成kafka
项目名称:布控预警 水平拆分出来的项目,作为一个单独的可以对外提供服务的项目
项目设计:springcloud,可以集成各个不同平台的一个作为对外提供的微服务项目
项目功能:实现各个平台和本平台之间的布控(对人员和摄像头进行和厂商对接可以进行实时抓拍)和预警(厂商抓拍到之后实时通知给本平台)业务。
先说明一下我的kafka在项目中的应用场景:
由于有多个平台对接本平台,中间有一些消息机制,比如摄像头抓拍到某个人员之后会由视频厂商进行通知到本平台,然后本平台根据业务来源和平台来源分别组建不同的消息进行分平台分+业务形式实现消息分发。
实现方式:
1、pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-kafka</artifactId>
</dependency>
2、application.yml
cloud:
stream:
kafka:
binder:
brokers: 127.0.0.1:9092 # kafka服务地址和端口
zk-nodes: 127.0.0.1:2181 # ZK的集群配置地址和端口
3、可以根据表中的topic名称自动初始化topic到kafka,后续如果有新增的平台和业务可以动态根据代码自动生成topic
package com.tianque.xueliang.controlalarm.config; import com.tianque.xueliang.controlalarm.domain.vo.TopicConfigVo;
import com.tianque.xueliang.controlalarm.service.TopicConfigService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.binding.BinderAwareChannelResolver;
import org.springframework.messaging.MessageChannel;
import org.springframework.stereotype.Component; import javax.annotation.PostConstruct;
import java.util.List; /**
* @Title: TopicConfig
* @Description: 项目启动动态读取kafka的topic配置并创建topic,创建完成回写表状态已在kafka生成topic
* @author: sxs@hztianque.com
* @date: Created in 10:25 2019/8/5
* @Modifired by:
*/
@Component
public class KafkaTopicConfig { private static final Logger logger = LoggerFactory.getLogger(KafkaTopicConfig.class); @Autowired
private TopicConfigService topicConfigService; @Autowired
private BinderAwareChannelResolver resolver; @PostConstruct
public void initKafkaTopic() {
// 获取本地数据表中的topic,只获取kafka中没有的topic
List<TopicConfigVo> list = topicConfigService.getTopicList();
try{
// 循环去生成topic,生成完毕将表中的状态更新为kafka已存在
for (TopicConfigVo topicConfigVo: list) {
String topicName = topicConfigVo.getPlatformId() + topicConfigVo.getWorkName();
// 这行代码是动态去生成topic的,先检查kafka中有没有传入的topic,有就直接返回topic,没有则新建
MessageChannel messageChannel = resolver.resolveDestination(topicName);
if (null != messageChannel) {
// 更新表中的状态为kafka中已存在改topic
topicConfigService.updateTopicStatusById(topicConfigVo.getTopicId());
}
}
}catch (Exception e) {
logger.error("kafka.topic初始化创建失败..", e);
}
}
}
@PostConstruct注解:作用在方法上,表示项目启动自动加载该方法
4、发送消息代码:
package com.tianque.xueliang.controlalarm.stream; import com.tianque.xueliang.controlalarm.domain.msg.Msg;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.binding.BinderAwareChannelResolver;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;
import org.springframework.util.MimeTypeUtils; /**
* Created with IntelliJ IDEA.
* @author : sunxuesong
* Date: 2019/3/12
* Time: 上午11:16
* To change this template use File | Settings | File Templates.
* Description:
*/
@Service
public class WarningService {
private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired
private BinderAwareChannelResolver resolver; /**
* 发送预警消息到指定topic,这里的topic是由平台编码+平台名称组成
* 若发现kafka中没有该topic,它会自动创建一个由平台编码+平台名称组成的topic
* @param warnings
* @param topic
* @return
*/
public String sendWarning(final Msg warnings, String topic) {
logger.info("Sending warnings {}", warnings); // 获取预警的topic,然后发送预警消息到kafka的topic
MessageChannel messageChannel = resolver.resolveDestination(topic);
messageChannel.send(MessageBuilder
.withPayload(warnings)
.setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON)
.build()); return "send msg ok";
} /**
* 发送布控消息到指定topic,这里的topic是由平台编码+平台名称组成
* 若发现kafka中没有该topic,它会自动创建一个由平台编码+平台名称组成的topic
* @param msg
* @param topic
* @return
*/
public String sendControl(final Msg msg, String topic) {
logger.info("Sending controlMsg {}", msg);
// 获取布控的topic,然后发送布控消息到kafka的topic
MessageChannel messageChannel = resolver.resolveDestination(topic);
messageChannel.send(MessageBuilder
.withPayload(msg)
.setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON)
.build()); return "send msg ok";
}
}
说明一下:springcloud和springboot集成kafka的方式不一样,虽然都是通过application.yml去做配置,但是jar包和配置还是有区别的。
如有不清楚欢迎留言..
springcloud集成kafka的更多相关文章
- springcloud 集成kafka问题记录,发消息报错:ERROR o.s.kafka.support.LoggingProducerListener - Exception thrown when sending a message with key='null' and payload='{-1,
在springcloud集成kafka,发送消息时报错: 2018-08-15 16:01:34.159 [http-nio-8081-exec-1] INFO org.apache.kafka.c ...
- SpringCloud学习之SpringCloudStream&集成kafka
一.关于Spring-Cloud-Stream Spring Cloud Stream本质上就是整合了Spring Boot和Spring Integration,实现了一套轻量级的消息驱动的微服务框 ...
- Storm集成Kafka应用的开发
我们知道storm的作用主要是进行流式计算,对于源源不断的均匀数据流流入处理是非常有效的,而现实生活中大部分场景并不是均匀的数据流,而是时而多时而少的数据流入,这种情况下显然用批量处理是不合适的,如果 ...
- springcloud集成zookeeper,并使用configserver作为服务的配置中心
1.springcloud集成zookeeper: 做法: 出现问题: 版本不一致导致出现keepError: 解决:服务器的zookeeper要与客户端的zookeeper一致,才可以. 2.使用c ...
- spark streaming集成kafka
Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Clouder ...
- storm集成kafka的应用,从kafka读取,写入kafka
storm集成kafka的应用,从kafka读取,写入kafka by 小闪电 0前言 storm的主要作用是进行流式的实时计算,对于一直产生的数据流处理是非常迅速的,然而大部分数据并不是均匀的数据流 ...
- Storm集成Kafka的Trident实现
原本打算将storm直接与flume直连,发现相应组件支持比较弱,topology任务对应的supervisor也不一定在哪个节点上,只能采用统一的分布式消息服务Kafka. 原本打算将结构设 ...
- 微服务学习三:springboot与springcloud集成之Eurake的使用(server端,client端)
这个多亏了网站上的一个大神的博客: http://blog.csdn.net/forezp/article/details/70148833 强烈推荐学习: 1.springcloud是什么,这个大家 ...
- Storm应用系列之——集成Kafka
本文系原创系列,转载请注明. 原帖地址:http://blog.csdn.net/xeseo 前言 在前面Storm系列之——基本概念一文中,提到过Storm的Spout应该是源源不断的取数据,不能间 ...
随机推荐
- 『图论』有向图强连通分量的Tarjan算法
在图论中,一个有向图被成为是强连通的(strongly connected)当且仅当每一对不相同结点u和v间既存在从u到v的路径也存在从v到u的路径.有向图的极大强连通子图(这里指点数极大)被称为强连 ...
- dubbo中出现can not be invoked any more
具体错误示例如下 从错误看,是客户方发起调用时,dubbo会去检查本地的invoker instance,如果发现invoker已经是destroy status,则直接抛出上面的异常,下面先来说下平 ...
- hdu 1251 统计难题 (字典树(Trie)<PS:C++提交不得爆内存>)
统计难题Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submis ...
- nyoj 61-传纸条(一)(双向dp)
61-传纸条(一) 内存限制:64MB 时间限制:2000ms Special Judge: No accepted:8 submit:37 题目描述: 小渊和小轩是好朋友也是同班同学,他们在一起总有 ...
- nyoj 82-迷宫寻宝(一) (多重BFS)
82-迷宫寻宝(一) 内存限制:64MB 时间限制:1000ms 特判: No 通过数:3 提交数:5 难度:4 题目描述: 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个 ...
- mysql 索引笔记
MyISAM引擎的B+Tree的索引 通过上图可以直接的看出, 在MyISAM对B+树的运用中明显的特点如下: 所有的非叶子节点中存储的全部是索引信息 在叶子节点中存储的 value值其实是 数据库中 ...
- raid10配置流程(5块磁盘)
1.添加5块磁盘 (1)先添加一块磁盘 (2)在此基础上,再添加4块磁盘 2.使用mdadm命令创建RAID10,名称为“/dev/md0” -C 代表创建操作 -v 显示创建过程 ...
- python:类2——有关类和对象的BIF内置函数
1.检查.判断 判断一个类是不是另一个类的子类 issubclass(class, classinfo)如果第一个参数是第二个参数的子类.子子类等,返回true 非严格(自己可以认为是自己的子类): ...
- linux文件时间
Linux 查看文件修改时间(精确到秒)(简单) ls --full-time 查看文件时间戳命令:stat test.txt linux 下查看文件修改时间 等(详细) 查看文件时间戳命令:stat ...
- MySQL 备份数据那点事
mysqldump 什么是 mysqldump ? mysqldump 是 MySQL 用于执行逻辑备份的一款工具,可以根据原始数据库对象以及表的定义和数据来生成一系列可以被执行的 SQL 语句. 通 ...