springboot2.0 快速集成kafka
一、kafka搭建
二、版本
springboot版本
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
kafka版本
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
三、基本的配置application.yml
实际上只有bootstrap-servers是必须配置的。
kafka:
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
bootstrap-servers: 192.168.31.10:9092,192.168.31.10:9093,192.168.31.10:9094
bootstrap-servers: 192.168.31.10:9092,192.168.31.10:9093,192.168.31.10:9094
topic:
Name: home.bus.log #自定义topic名称
numPartitions: 2 #自定义分区
replicationFactor: 2 #自定义副本
consumer:
group-id: home.bus.log.group.1
auto-offset-reset: latest
enable-auto-commit: true
auto-commit-interval: 20000
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
四、自定义topic
如果不配置topic属性,系统会用缺省的,当然名字得需要配置,也可以在生产者中直接使用常量
@Configuration
@EnableKafka
public class KafkaTopicConfig {
@Value("${spring.kafka.bootstrap-servers}")
private String bootstrapServer; @Value("${spring.kafka.topic.Name}")
private String topicName; @Value("${spring.kafka.topic.numPartitions}")
private int numPartitions; @Value("${spring.kafka.topic.replicationFactor}")
private int replicationFactor;
@Bean
public KafkaAdmin kafkaAdmin() {
Map<String, Object> configs = new HashMap<>();
configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServer);
return new KafkaAdmin(configs);
} @Bean
public NewTopic myTopic() {
//第三个参数是副本数量,确保集群中配置的数目大于等于副本数量
return new NewTopic(topicName, numPartitions, (short) replicationFactor);
} }
通过配置,如果kafka服务器上没有创建topic,则会按照自定义属性来创建,如果topic名称已经创建了,那么NewTopic将不会创建新的topic,无论topic其他分区和副本属性是否相同
五、自定义的producer和consumer
简单的使用,不需要自定义,yml文件也进行了基本的配置,如果需要自定义在参照如下额配置:
//@Configuration
//@EnableKafka
public class KafkaProducerConfig {
@Value("${spring.kafka.producer.bootstrap-servers}")
private String bootstrapServer; /* --------------producer configuration-----------------**/
@Bean
public Map<String, Object> producerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServer);
props.put(ProducerConfig.RETRIES_CONFIG, 0);
props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
props.put(ProducerConfig.LINGER_MS_CONFIG, 1);
props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
return props;
} @Bean
public ProducerFactory<String, String> producerFactory() {
return new DefaultKafkaProducerFactory<>(producerConfigs());
} /* --------------kafka template configuration-----------------**/
@Bean
public KafkaTemplate<String, String> kafkaTemplate() {
KafkaTemplate<String, String> kafkaTemplate = new KafkaTemplate<>(producerFactory());
return kafkaTemplate;
}
}
//@Configuration
//@EnableKafka
public class KafkaConsumerConfig {
@Value("${spring.kafka.bootstrap-servers}")
private String bootstrapServer; @Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServer);
props.put(ConsumerConfig.GROUP_ID_CONFIG, "0");
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true);
props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, 100);
props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "15000");
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
return props;
} @Bean
ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
} @Bean
public ConsumerFactory<String, String> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(consumerConfigs());
}
}
六、创建生产者producer
根据需要直接调用就可以。
@Service
public class KafkaServiceImpl implements MQService { @Value("${spring.mqconfig.mq-enable}")
private boolean mqEnable; @Value("${spring.kafka.topic.Name}")
private String topicName; private Logger logger = LoggerFactory.getLogger(KafkaServiceImpl.class); @Resource
private KafkaTemplate<String, String> kafkaTemplate; public boolean isMqEnable() {
return mqEnable;
} public void setMqEnable(boolean mqEnable) {
this.mqEnable = mqEnable;
} @Override
@Async("logThread") //异步,可以注销,除非网络出问题,否则发送消息到kafka服务器非常的快
public void sendMessage(String msg) {
if(!isMqEnable()) return;
long start = System.currentTimeMillis();
kafkaTemplate.send(topicName,msg);
long end = System.currentTimeMillis();
logger.info("写入kafka,耗时:"+(end-start)+"毫秒");
} }
七、创建消费者consumer
因为生产消息的时候进行了json封装,获取消息的时候对应进行反序列化
@Service
public class MQConsumerServiceImpl implements MQConsumerService {
private ObjectMapper objectMapper;
private List<MQMessage> mqMessageList;
private long maxMessageCount=100; @Override
public List<MQMessage> getMessage() { return mqMessageList;
} @KafkaListener(topics = "${spring.kafka.topic.Name}")
private void consumer(ConsumerRecord<?, ?> record)
{
if(objectMapper==null) objectMapper = new ObjectMapper();
if(mqMessageList==null) mqMessageList = new ArrayList<>();
Optional<?> mqMessage = Optional.ofNullable(record.value());
if (mqMessage.isPresent()) {
Object message = mqMessage.get();
try {
if(mqMessageList.size()>maxMessageCount)
{
mqMessageList.remove(0);
}
MQMessage mq = objectMapper.readValue((String)message, MQMessage.class);//反序列化
mqMessageList.add(mq);
}catch (Exception e)
{
e.printStackTrace();
}
}
}
}
八、显示到页面上
大部分场景,我们并不需要把消息取出来显示,这里为了顺便测试一下消费者,也可以在kafka服务器上用命令查看
bin/kafka-console-consumer.sh --bootstrap-server 192.168.31.10:9092 --topic home.bus.log --from-beginning
@Controller
@RequestMapping(value = "/mq")
public class mqController { @Resource(name = "MQConsumerServiceImpl")
private MQConsumerService mqConsumerService; @RequestMapping(value = "/list")
public String list() {
return "/mq/mqList";
} @RequestMapping(value = "/getMsgList")
@ResponseBody
public Object getMsgList(HttpServletRequest request) { int pageSize = 50;
try {
pageSize = Integer.parseInt(request.getParameter("pageSize"));
} catch (Exception e) {
e.printStackTrace();
} int pageNumber = 0;
try {
pageNumber = Integer.parseInt(request.getParameter("pageNumber")) - 1;
} catch (Exception e) {
e.printStackTrace();
} Map<String, Object> map = new HashMap<>(); String sortName = request.getParameter("sortName") == null ? "roleId" : request.getParameter("sortName");
String sortOrder = request.getParameter("sortOrder") == null ? "asc" : request.getParameter("sortOrder"); Sort sortLocal = new Sort(sortOrder.equalsIgnoreCase("asc") ? Sort.Direction.ASC : Sort.Direction.DESC, sortName);
Pageable pageable = PageRequest.of(pageNumber, pageSize, sortLocal); Page<MQMessage> mqMessagePage = new PageImpl<MQMessage>(mqConsumerService.getMessage(),pageable,this.mqConsumerService.getMessage().size());
map.put("total", mqMessagePage.getTotalElements());
map.put("rows", mqMessagePage.getContent()); return map;
} }

springboot2.0 快速集成kafka的更多相关文章
- springboot2.0+websocket集成【群发消息+单对单】(二)
https://blog.csdn.net/qq_21019419/article/details/82804921 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上 ...
- Spring Boot 2.0 快速集成整合消息中间件 Kafka
欢迎关注个人微信公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site ...
- SpringBoot2.0之整合Kafka
maven依赖: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www. ...
- Spring Boot 2.x 快速集成Kafka
1 Kafka Kafka是一个开源分布式的流处理平台,一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据.Kafka由Scala和Java编写,2012年成为Apache ...
- springboot2.0+swagger集成
场景:项目中添加Swagger配置,可以加速项目的开发,在快速开发项目中十分重要. 1.pom.xml添加swagger <!--swagger --> <dependency> ...
- SpringBoot2.0整合fastjson的正确姿势
SpringBoot2.0如何集成fastjson?在网上查了一堆资料,但是各文章的说法不一,有些还是错的,可能只是简单测试一下就认为ok了,最后有没生效都不知道.恰逢公司项目需要将J ...
- Spring Boot 2.0 教程 | 快速集成整合消息中间件 Kafka
欢迎关注个人微信公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site ...
- kolla快速集成openstack-ocata和opencontrail-4.0.1.0单节点
参考链接: kolla快速集成openstack-ocata和opencontrail-4.0.1.0单节点 https://github.com/Juniper/contrail-docker/wi ...
- spring-boot-2.0.3之quartz集成,不是你想的那样哦!
前言 开心一刻 晚上回家,爸妈正在吵架,见我回来就都不说话了,看见我妈坐在那里瞪着我爸,我就问老爸“你干什么了惹我妈生这么大气?” 我爸说“没有什么啊,倒是你,这么大了还没有媳妇,要是你有媳妇给我们 ...
随机推荐
- 2 进程multiprocessing [mʌltɪ'prəʊsesɪŋ] time模块
1.multiprocessing模块 multiprocessing模块就是跨平台版本的多进程模块. multiprocessing模块提供了一个Process类来代表一个进程对象, 2.Proce ...
- mavn打外部配置jar包依赖
https://blog.csdn.net/pei19890521/article/details/80984707
- C#调用大漠插件,发送QQ和微信消息
大漠插件就不过多介绍了,不知道的请查下百度.主要是讲解C#怎么调用大漠插件. 大漠插件提供了COM版本,C#直接点击引用,添加即可.然后注册下大漠插件到系统文件夹,注册代码如下: static str ...
- VueJs 学习笔记
VueJs学习笔记 参考资料:https://cn.vuejs.org/ 特效库:TweenJS(补间动画库) VelocityJS(轻量级JS动画库) Animate.css(CSS预设动画库) ...
- 怎么设计好移动APP测试用例
软件测试工作中我们需要不断的储备和总结自己的知识和经验,怎么设计好移动APP测试用例?如:手机.平板.智能设备,并在特定网络环境下. 我们需要关注的功能点,容易出错的位置,这将对我们整个测试过程起着至 ...
- 【SpringCloud】第七篇: 高可用的分布式配置中心(Spring Cloud Config)
前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...
- 关于Python 中的 if 语句
学习Python,最开始我们都是先从函数学起,Python教程中有很多函数,if算是其中之一. 可能最为人所熟知的编程语句就是 if 语句了.例如: >>> >>> ...
- RSA算法笔记+理解
明天网络安全考试了,看了一下午,还没理解透,持续更新... 质数: 除了1和它本身以外不再有其他因素的数互质关系: 两个正整数,除了1以外,没有其他公因子RSA实现了非对称加密DES实现了对称加密** ...
- LeetCode 109——有序链表转化二叉搜索树
1. 题目 2. 解答 2.1. 方法一 在 LeetCode 108--将有序数组转化为二叉搜索树 中,我们已经实现了将有序数组转化为二叉搜索树.因此,这里,我们可以先遍历一遍链表,将节点的数据存入 ...
- openstack对接VMware浅析
前言 本文是对openstack对接vmware的浅析,所以本文重点是以下两点: 先了解它的整体架构,搞清楚为什么要用这样的架构: 然后再了解架构中的各个组件,组件提供的主要功能与各个组件之间的交互 ...