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集成,不是你想的那样哦!
前言 开心一刻 晚上回家,爸妈正在吵架,见我回来就都不说话了,看见我妈坐在那里瞪着我爸,我就问老爸“你干什么了惹我妈生这么大气?” 我爸说“没有什么啊,倒是你,这么大了还没有媳妇,要是你有媳妇给我们 ...
随机推荐
- 一种精准monkey测试的方法
WeTest 导读 相信大家都知道移动端应用的monkey测试吧,不知你们有没有为monkey测试的太过于随机性的特性有过困扰,至少在我们这种界面控件较少且控件位置较偏的app的使用上其测试有效性大打 ...
- jQuery实现“回到顶部”按钮功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Linux系统中ElasticSearch搜索引擎安装配置Head插件
近几篇ElasticSearch系列: 1.阿里云服务器Linux系统安装配置ElasticSearch搜索引擎 2.Linux系统中ElasticSearch搜索引擎安装配置Head插件 3.Ela ...
- OSG-OSG中的observer_ptr指针
看array大神的CookBook后一些感想,在代码上添加了一些注释,也对源码做了一些研读,记录下学习的过程. CookBook中第一个例子就是observer_ptr指针,这个指针和它的名字一样,就 ...
- Linux命令应用大词典-第33章 X Window
33.1 xhost:X服务器的访问控制程序 33.2 xinit:X Window系统初始化 33.3 Xlsclients:在显示器中列出正在运行的客户端应用程序 33.4 xlsfonts:显示 ...
- Visual Stdio Code编辑Mark Down
Visual Studio Code可以一边写Markdown一边预览了,而且不需要任何插件. 方法如下: 新建一个文件,以 .md 为后缀: Visual Studio Code 原生就支持高亮Ma ...
- 剑指offer-二叉树中和为某一值的路径24
题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...
- 实现Bidirectional LSTM Classifier----深度学习RNN
双向循环神经网络(Bidirectional Recurrent Neural Networks,Bi-RNN),Schuster.Paliwal,1997年首次提出,和LSTM同年.Bi-RNN,增 ...
- 聊聊、dubbo 找不到 dubbo.xsd 报错
平常在用 Dubbo 的时候,创建 xml 会提示 http://code.alibabatech.com/schema/dubbo/dubbo.xsd 找不到. 大家可以去 https://gith ...
- selenium实现文件上传方法汇总(AutoIt、win32GUI、sengkeys)---基于python
在使用selenium进行UI自动化测试时,经常会遇到一个关于本地文件上传的问题,解决此问题一般分两种情况: 1. 元素标签为input 2.非input型上传 下面我们分别对着两种情况进行实例分析 ...