前面我们分别介绍了kafka的相关基本原理,kafka的集群服务器搭建以及kafka相关的配置,本文综合前面的理论知识,运用kafka Java API实现一个简单的客户端Demo。

开发环境

  • 操作系统:MacOS 10.12.3
  • 开发平台:Eclipse Neon.2 Release (4.6.2)
  • JDK: java version 1.8.0_121
  • zookeeper: zookeeper-3.4.9
  • kafka: kafka-2.10-0.10.2.0

项目的建立与实现

  首先为大家展示一下项目最终的结构图,如下:

  下面开始建立项目:

  • 首先建立一个基本的Maven Java Project 项目框架,项目名称为 kafkaDemo,建立项目流程参考:maven 基本框架搭建
  • 然后修改pom.xml文件内容,为项目引入kafka 客户端jar包:
  1. <dependency>
  2. <groupId>org.apache.kafka</groupId>
  3. <artifactId>kafka-clients</artifactId>
  4. <version>0.10.2.0</version>
  5. </dependency>

  添加完成后保存pom.xml,然后maven update project。当update完成后,maven依赖包里的jar包应该如上图所示。

  下面分别添加producer和consumer客户端代码。

  在src/main/java目录下新建package,命名为 com.unionpay.producer。由于kafka producer端有同步发送和异步发送之分,本项目将两个示例都进行展示,首先编写同步发送ProducerSync代码。

  ProducerSync.java:

  1. package com.unionpay.producer;
  2.  
  3. import java.util.Properties;
  4.  
  5. import org.apache.kafka.clients.producer.KafkaProducer;
  6. import org.apache.kafka.clients.producer.Producer;
  7. import org.apache.kafka.clients.producer.ProducerRecord;
  8.  
  9. public class ProducerSync {
  10.  
  11. private static final String TOPIC = "my-replicated-topic";
  12. public static void main(String[] args) {
  13. // TODO Auto-generated method stub
  14.  
  15. Properties properties = new Properties();
  16. //客户端用于建立与kafka集群连接的host:port组,如果有多个broker,则用“,”隔开
  17. // "host1:port1,host2:port2,host3,post3"
  18. properties.put("bootstrap.servers", "127.0.0.1:9092");
  19.  
  20. // producer在向servers发送信息后,是否需要serveres向客户端(producer)反馈接受消息状态用此参数配置
  21. // acks=0:表示producer不需要等待集群服务器发送的确认消息;acks=1:表示producer需要等到topic对应的leader发送的消息确认;
  22. // acks=all:表示producer需要等到leader以及所有followers的消息确认,这是最安全的消息保障机制
  23. properties.put("acks", "all");
  24. properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
  25. properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
  26. properties.put("buffer.memory", "33554432");
  27.  
  28. Producer<String,String> producer = new KafkaProducer<String,String>(properties);
  29.  
  30. for(int i=0;i<100;i++){
  31.  
  32. String message = "Sync : this is the " + i + "th message for test!";
  33. ProducerRecord<String, String> producerRecord = new ProducerRecord<String, String>(TOPIC, message);
  34. producer.send(producerRecord);
  35.  
  36. try {
  37. Thread.sleep(1000);
  38. } catch (InterruptedException e) {
  39. // TODO Auto-generated catch block
  40. e.printStackTrace();
  41. }
  42. }
  43.  
  44. producer.close();
  45.  
  46. }
  47.  
  48. }

  然后编写异步ProducerAsync代码。

  ProducerAsync.java:

  1. package com.unionpay.producer;
  2.  
  3. import java.util.Properties;
  4.  
  5. import org.apache.kafka.clients.producer.KafkaProducer;
  6. import org.apache.kafka.clients.producer.Producer;
  7. import org.apache.kafka.clients.producer.ProducerRecord;
  8.  
  9. public class ProducerAsync {
  10.  
  11. private static final String TOPIC = "my-replicated-topic";
  12. public static void main(String[] args) {
  13. // TODO Auto-generated method stub
  14.  
  15. Properties props = new Properties();
  16. props.put("bootstrap.servers", "127.0.0.1:9092");
  17. props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
  18. props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
  19. props.put("producer.type", "async");
  20. props.put("batch.size", "16384");
  21.  
  22. Producer<String,String> producer = new KafkaProducer<String,String>(props);
  23.  
  24. for(int i=0;i<100;i++){
  25.  
  26. String message = "Async : this is the " + i + "th message for test!";
  27.  
  28. ProducerRecord producerRecord = new ProducerRecord(TOPIC, message);
  29. producer.send(producerRecord);
  30.  
  31. try {
  32. Thread.sleep(1000);
  33. } catch (InterruptedException e) {
  34. // TODO Auto-generated catch block
  35. e.printStackTrace();
  36. }
  37. }
  38.  
  39. producer.close();
  40. }
  41. }

  从两个代码文件比对来看,异步中多了一句配置语句props.put("producer.type", "async");

  然后编写consumer端代码

  GroupConsumer.java:

  1. package com.unionpay.consumer;
  2.  
  3. import java.util.Arrays;
  4. import java.util.Properties;
  5.  
  6. import org.apache.kafka.clients.consumer.ConsumerRecord;
  7. import org.apache.kafka.clients.consumer.ConsumerRecords;
  8. import org.apache.kafka.clients.consumer.KafkaConsumer;
  9.  
  10. public class GroupConsumer {
  11.  
  12. private static final String BROKER = "127.0.0.1:9092";
  13. private static final String TOPIC = "my-replicated-topic";
  14.  
  15. public static void main(String[] args) {
  16. // TODO Auto-generated method stub
  17.  
  18. Properties props = new Properties();
  19. props.put("bootstrap.servers",BROKER);
  20. // 用来唯一标识consumer进程所在组的字符串,如果设置同样的group id,表示这些processes都是属于同一个consumer group
  21. props.put("group.id", "group1");
  22. // 如果为真,consumer所fetch的消息的offset将会自动的同步到zookeeper。这项提交的offset将在进程挂掉时,由新的consumer使用
  23. props.put("enable.auto.commit", "true");
  24. // consumer向zookeeper提交offset的频率
  25. props.put("auto.commit.interval.ms", "1000");
  26. props.put("session.timeout.ms", "30000");
  27. props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
  28. props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
  29.  
  30. KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
  31.  
  32. // 订阅topic,可以为多个用,隔开Arrays.asList("topic1","topic2");
  33. consumer.subscribe(Arrays.asList(TOPIC));
  34.  
  35. while(true){
  36. ConsumerRecords<String,String> consumerRecords = consumer.poll(100);
  37.  
  38. for(ConsumerRecord<String,String> consumerRecord : consumerRecords){
  39. System.out.println(consumerRecord.value());
  40. }
  41. }
  42. }
  43. }

  到目前为止,我们的项目建立完成啦,下面启动zookeeper集群服务器,启动kafka集群服务器:

  1. //启动zookeeper集群服务器
  2. cd ~/DevelopEnvironment/zookeeper-3.4.9-kafka/bin
  3. ./zkServer.sh start
  4.  
  5. //启动kafka集群服务器
  6. cd ~/DevelopEnvironment/kafka_2.10-0.10.2.0/bin
  7. ./kafka-server-start.sh ../config/server.properties
  8. ./kafka-server-start.sh ../config/server-1.properties
  9. ./kafka-server-start.sh ../config/server-2.properties

  当zookeeper集群服务器和kafka集群服务器启动成功后,然后分别运行GroupConsumer.java和ProducerAsync.java,客户端获取如下信息:

  然后运行ProducerSync.java,客户端获取如下信息:

  到此,游戏结束,我们的kafka API 使用demo介绍到此结束。

  

kafka "HelloWorld"实践的更多相关文章

  1. 【译】Kafka最佳实践 / Kafka Best Practices

    本文来自于DataWorks Summit/Hadoop Summit上的<Apache Kafka最佳实践>分享,里面给出了很多关于Kafka的使用心得,非常值得一看,今推荐给大家. 硬 ...

  2. Kafka应用实践与生态集成

    1.前言 Apache Kafka发展至今,已经是一个很成熟的消息队列组件了,也是大数据生态圈中不可或缺的一员.Apache Kafka社区非常的活跃,通过社区成员不断的贡献代码和迭代项目,使得Apa ...

  3. Spark Streaming与kafka整合实践之WordCount

    本次实践使用kafka console作为消息的生产者,Spark Streaming作为消息的消费者,具体实践代码如下 首先启动kafka server .\bin\windows\kafka-se ...

  4. Kafka项目实践

    用户日志上报实时统计之编码实践 1.概述 本课程的视频教程地址:<Kafka实战项目之编码实践>  该课程我以用户实时上报日志案例为基础,带着大家去完成各个KPI的编码工作,实现生产模块. ...

  5. Kafka最佳实践

    一.硬件考量 1.1.内存 不建议为kafka分配超过5g的heap,因为会消耗28-30g的文件系统缓存,而是考虑为kafka的读写预留充足的buffer.Buffer大小的快速计算方法是平均磁盘写 ...

  6. window下Kafka最佳实践

    Kafka的介绍和入门请看这里kafka入门:简介.使用场景.设计原理.主要配置及集群搭建(转) 当前文章从实践的角度为大家规避window下使用的坑. 1.要求: java 6+ 2.下载kafka ...

  7. HP下kafka的实践

    kafka 简介 Kafka 是一种高吞吐量的分布式发布订阅消息系统 kafka角色必知 producer:生产者. consumer:消费者. topic: 消息以topic为类别记录,Kafka将 ...

  8. Kafka~HelloWorld得来不易

    今天连搭了zookeeper和kafka的环境,并部署成功,但在.net驱动的操作下,没有消费成功,原因何在? 防火墙 zookeeper没运行? kafka没有公开IP? 第一感觉也就是这向个原因了 ...

  9. StatefulSet在ZooKeeper和Kafka的实践

    K8s的版本是1.7.6 采用nfs的nas存储模式 NFS的问题 建立zk集群的时候总是发现myid绑定一个id,先describe pod确认每个绑定不同的pvc,然后就确认是pv创建的问题,pv ...

随机推荐

  1. Django URL中r的意思

    例如: urlpatterns = patterns('', # ... (r'^time/plus/\d+/$', hours_ahead), # ... ) 正则表达式字符串的开头字母“r”. 它 ...

  2. vue $http请求服务

    vue中的$http服务  需要引入一个叫vue-resource.js的文件,因为vue.js中没有$http服务.如果需要使用这个服务去百度下载vue-resource.js 然后引进项目即可. ...

  3. HttpOperater

    using System; using System.IO; using System.Linq; using System.Net; using System.Text; using System. ...

  4. 常用maven 仓库地址

    maven下载jar的时候会去寻国外的地址,因此造成了下载jar很缓慢,影响开发效率,于是就出现maven镜像地址,可以使我们开发人员迅速下载相关的jar. 在maven的config的setting ...

  5. 【Android】14.0 第14章 内部存储与外部SD卡存储—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 Android使用的文件系统是基于Linux的文件系统,在Android应用程序中,开发人员既可以建立和访问程序自 ...

  6. Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论

    我们使用Linux作为服务器操作系统时,为了达到高并发处理能力,充分利用机器性能,经常会进行一些内核参数的调整优化,但不合理的调整常常也会引起意想不到的其他问题,本文就一次Linux服务器丢包故障的处 ...

  7. # mysqlbinlog mysql-bin.000004 mysqlbinlog: unknown variable 'default-character-set=utf8'

    # mysqlbinlog mysql-bin.000004 mysqlbinlog: unknown variable 'default-character-set=utf8' 加上--no-def ...

  8. JAVA多线程之Synchronized、wait、notify实例讲解

    一.Synchronized synchronized中文解释是同步,那么什么是同步呢,解释就是程序中用于控制不同线程间操作发生相对顺序的机制,通俗来讲就是2点,第一要有多线程,第二当多个线程同时竞争 ...

  9. JVM基础学习之基本概念、可见性与同步

    开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的 架构 .对 ...

  10. 网页尺寸scrollHeight

    http://www.imooc.com/code/1703 网页尺寸scrollHeight scrollHeight和scrollWidth,获取网页内容高度和宽度. 一.针对IE.Opera: ...