前面我们分别介绍了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包:
    <dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.10.2.0</version>
</dependency>

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

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

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

  ProducerSync.java:

 package com.unionpay.producer;

 import java.util.Properties;

 import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord; public class ProducerSync { private static final String TOPIC = "my-replicated-topic";
public static void main(String[] args) {
// TODO Auto-generated method stub Properties properties = new Properties();
//客户端用于建立与kafka集群连接的host:port组,如果有多个broker,则用“,”隔开
// "host1:port1,host2:port2,host3,post3"
properties.put("bootstrap.servers", "127.0.0.1:9092"); // producer在向servers发送信息后,是否需要serveres向客户端(producer)反馈接受消息状态用此参数配置
// acks=0:表示producer不需要等待集群服务器发送的确认消息;acks=1:表示producer需要等到topic对应的leader发送的消息确认;
// acks=all:表示producer需要等到leader以及所有followers的消息确认,这是最安全的消息保障机制
properties.put("acks", "all");
properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
properties.put("buffer.memory", "33554432"); Producer<String,String> producer = new KafkaProducer<String,String>(properties); for(int i=0;i<100;i++){ String message = "Sync : this is the " + i + "th message for test!";
ProducerRecord<String, String> producerRecord = new ProducerRecord<String, String>(TOPIC, message);
producer.send(producerRecord); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} producer.close(); } }

  然后编写异步ProducerAsync代码。

  ProducerAsync.java:

 package com.unionpay.producer;

 import java.util.Properties;

 import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord; public class ProducerAsync { private static final String TOPIC = "my-replicated-topic";
public static void main(String[] args) {
// TODO Auto-generated method stub Properties props = new Properties();
props.put("bootstrap.servers", "127.0.0.1:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("producer.type", "async");
props.put("batch.size", "16384"); Producer<String,String> producer = new KafkaProducer<String,String>(props); for(int i=0;i<100;i++){ String message = "Async : this is the " + i + "th message for test!"; ProducerRecord producerRecord = new ProducerRecord(TOPIC, message);
producer.send(producerRecord); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} producer.close();
}
}

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

  然后编写consumer端代码

  GroupConsumer.java:

 package com.unionpay.consumer;

 import java.util.Arrays;
import java.util.Properties; import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer; public class GroupConsumer { private static final String BROKER = "127.0.0.1:9092";
private static final String TOPIC = "my-replicated-topic"; public static void main(String[] args) {
// TODO Auto-generated method stub Properties props = new Properties();
props.put("bootstrap.servers",BROKER);
// 用来唯一标识consumer进程所在组的字符串,如果设置同样的group id,表示这些processes都是属于同一个consumer group
props.put("group.id", "group1");
// 如果为真,consumer所fetch的消息的offset将会自动的同步到zookeeper。这项提交的offset将在进程挂掉时,由新的consumer使用
props.put("enable.auto.commit", "true");
// consumer向zookeeper提交offset的频率
props.put("auto.commit.interval.ms", "1000");
props.put("session.timeout.ms", "30000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props); // 订阅topic,可以为多个用,隔开Arrays.asList("topic1","topic2");
consumer.subscribe(Arrays.asList(TOPIC)); while(true){
ConsumerRecords<String,String> consumerRecords = consumer.poll(100); for(ConsumerRecord<String,String> consumerRecord : consumerRecords){
System.out.println(consumerRecord.value());
}
}
}
}

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

//启动zookeeper集群服务器
cd ~/DevelopEnvironment/zookeeper-3.4.9-kafka/bin
./zkServer.sh start //启动kafka集群服务器
cd ~/DevelopEnvironment/kafka_2.10-0.10.2.0/bin
./kafka-server-start.sh ../config/server.properties
./kafka-server-start.sh ../config/server-1.properties
./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. Sql server注入简单认识

    登录界面常常会涉及到敏感关键字的注入 为了对应面试,再看一下 怎样防止注入, 可以过滤SQL需要参数中的敏感字符(忽略大小写) public static string Split(string in ...

  2. store.js 跨浏览器的localStorage

    store.js 跨浏览器的localStorage 我们总是想要储存一些数据在浏览器端,却对复杂的兼容性头疼,store.js很好的解决了这些问题. store.js ☍ 使用它相当简单: // 储 ...

  3. Python 实int型和list相互转换 现把float型列表转换为int型列表 把列表中的数字由float转换为int型

    第一种方法:使用map方法 >>> list = [, ] #带有float型的列表 >>> int_list = map(int,list) #使用map转换 & ...

  4. struts2开发流程及配置,域对象对数据存储的3种方式

    一.开发流程 1)引入 jar 包,其中必须引入的有(我是用的struts是2.3.32) commons-fileupload-1.3.2.jar     |文件上传下载commons-io-2.2 ...

  5. 从pdf 文件中抽取特定的页面

    前段时间买了一个kindle 电子书阅读器.我想用它来读的pdf文档.当然最主要是用来读python标准库&mysql的官方文档. 问题就来了.这两个都是大头书.之前用mac看还好.用kind ...

  6. 【打CF,学算法——二星级】Codeforces Round #313 (Div. 2) B. Gerald is into Art(水题)

    [CF简单介绍] 提交链接:http://codeforces.com/contest/560/problem/B 题面: B. Gerald is into Art time limit per t ...

  7. 判断是否是IE浏览器和是否是IE11

    判断是否是IE浏览器用下面这个函数, function isIE() { //ie? 是ie返回true,否则返回false if (!!window.ActiveXObject || "A ...

  8. basic_string

    // Components for manipulating sequences of characters -*- C++ -*- // Copyright (C) 1997, 1998, 1999 ...

  9. CSS(七):浮动

    一.float属性取值:left:左浮动right:右浮动none:不浮动 先看下面的一个例子: <!DOCTYPE html> <html lang="en"& ...

  10. 除去Scala的糖衣(13) -- Default Parameter Value

    欢迎关注我的新博客地址:http://cuipengfei.me/ 好久没有写博客了,上一次更新竟然是一月份. 说工作忙都是借口,咋有空看美剧呢. 这半年荒废掉博客说到底就是懒,惯性的懒惰.写博客这事 ...