Go 关于 kafka 的生产者、消费者实例
zookeeper + kafka
首先要在 apche 官网下载 kafka 的程序包(linux版本),然后放到服务器上解压,得到以下目录
bin 目录下包含了服务的启动脚本

启动 zookeeper
./bin/zookeeper-server-start.sh config/zookeeper.properties
启动 kafka server
./bin/kafka-server-start.sh config/server.properties
创建一个主题
./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic cctv1(主题名)
启动生产者
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic cctv1
启动消费者
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic cctv1
如果要消费前面的数据,在启动时添加 --from-beginning 参数
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic cctv1 --from-beginning
查看 kafka 进程命令:
jps

producer
安装 Sarama 包
go get github.com/Shopify/sarama
demo:创建生产者,往单节点的 kafka 上发送数据
package main
import (
"fmt"
"github.com/Shopify/sarama"
"time"
) //消息写入kafka
func main() {
//初始化配置
config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.WaitForAll
config.Producer.Partitioner = sarama.NewRandomPartitioner
config.Producer.Return.Successes = true
//生产者
client, err := sarama.NewSyncProducer([]string{"10.10.4.35:9092"}, config)
if err != nil {
fmt.Println("producer close,err:", err)
return
}
defer client.Close() for i:=0; i<5; i++ {
//创建消息
msg := &sarama.ProducerMessage{}
msg.Topic = "cctv1"
msg.Value = sarama.StringEncoder("this is a good test,hello kai")
//发送消息
pid, offset, err := client.SendMessage(msg)
if err != nil {
fmt.Println("send message failed,", err)
return
}
fmt.Printf("pid:%v offset:%v\n", pid, offset)
time.Sleep(time.Second)
}
}
运行结果:(上述代码执行一下,就会往 kafka 中 cctv1 的主题发布 5 条消息)

然后通过 kafka 自带的消费者终端查看发送的数据
./bin/kafka-console-consumer.sh --bootstrap-server 10.10.4.35:9092 --topic cctv1 --from-beginning

consumer
demo:创建消费者,从单节点的 kafka 中消费数据
package main
import (
"fmt"
"github.com/Shopify/sarama"
"sync"
) var wg sync.WaitGroup func main() {
consumer, err := sarama.NewConsumer([]string{"10.10.4.35:9092"}, nil)
if err != nil {
fmt.Println("consumer connect err:", err)
return
}
defer consumer.Close() //获取 kafka 主题
partitions, err := consumer.Partitions("cctv1")
if err != nil {
fmt.Println("get partitions failed, err:", err)
return
} for _, p := range partitions {
//sarama.OffsetNewest:从当前的偏移量开始消费,sarama.OffsetOldest:从最老的偏移量开始消费
partitionConsumer, err := consumer.ConsumePartition("cctv1", p, sarama.OffsetNewest)
if err != nil {
fmt.Println("partitionConsumer err:", err)
continue
}
wg.Add(1)
go func(){
for m := range partitionConsumer.Messages() {
fmt.Printf("key: %s, text: %s, offset: %d\n", string(m.Key), string(m.Value), m.Offset)
}
wg.Done()
}()
}
wg.Wait()
}
consumer 版本2
package kafkaPlugin
import (
"fmt"
"github.com/Shopify/sarama"
) type KafkaConsumer struct {
Node string
Topic string
//Message string
MessageQueue chan string
} func (this KafkaConsumer) Consume(){
consumer, err := sarama.NewConsumer([]string{this.Node}, nil)
if err != nil {
fmt.Printf("kafka connnet failed, error[%v]", err.Error())
return
}
defer consumer.Close() partitions, err := consumer.Partitions(this.Topic)
if err != nil {
fmt.Printf("get topic failed, error[%v]", err.Error())
return
}
for _, p := range partitions {
partitionConsumer, err := consumer.ConsumePartition(this.Topic, p, sarama.OffsetNewest)
if err != nil {
fmt.Printf("get partition consumer failed, error[%v]", err.Error())
continue
} for message := range partitionConsumer.Messages() {
fmt.Printf("message:[%v], key:[%v], offset:[%v]\n", string(message.Value), string(message.Key), string(message.Offset))
this.MessageQueue <- string(message.Value)
}
}
} func main(){
var kafkaConsumer = KafkaConsumer{
Node: "10.10.4.35:9092",
Topic: "cctv1",
}
kafkaConsumer.Consume()
}
上述代码执行起来,就会开启 kafka 消费者持续监听,然后通过 kafka 自带的生产者终端发送 2 条测试数据,消费结果如下:

windows 环境,运行编译错误:exec: "gcc": executable file not found in %PATH%
问题处理请参考下面的链接:
https://blog.csdn.net/myBarbara/article/details/95358694
https://www.cnblogs.com/ggg-327931457/p/9694516.html
ending ~
Go 关于 kafka 的生产者、消费者实例的更多相关文章
- Linux 进程间通信(包含一个经典的生产者消费者实例代码)
前言:编写多进程程序时,有时不可避免的需要在多个进程之间传递数据,我们知道,进程的用户的地址空间是独立,父进程中对数据的修改并不会反映到子进程中,但内核是共享的,大多数进程间通信方式都是在内核中建立一 ...
- Go语言协程并发---生产者消费者实例
package main import ( "fmt" "strconv" "time" ) /* 改进生产者消费者模型 ·生产者每秒生产一 ...
- 基于Kafka的生产者消费者消息处理本地调试
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/68174111冷血之心的博客) Kafka下载地址:http://d ...
- Hadoop生态圈-Kafka的旧API实现生产者-消费者
Hadoop生态圈-Kafka的旧API实现生产者-消费者 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.旧API实现生产者-消费者 1>.开启kafka集群 [yinz ...
- Java实现Kafka的生产者和消费者例子
Kafka的结构与RabbitMQ类似,消息生产者向Kafka服务器发送消息,Kafka接收消息后,再投递给消费者.生产者的消费会被发送到Topic中,Topic中保存着各类数据,每一条数据都使用键. ...
- Scala调用Kafka的生产者和消费者Demo,以及一些配置参数整理
kafka简介 Kafka是apache开源的一款用Scala编写的消息队列中间件,具有高吞吐量,低延时等特性. Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受 ...
- Python 使用python-kafka类库开发kafka生产者&消费者&客户端
使用python-kafka类库开发kafka生产者&消费者&客户端 By: 授客 QQ:1033553122 1.测试环境 python 3.4 zookeeper- ...
- Hadoop生态圈-Kafka的新API实现生产者-消费者
Hadoop生态圈-Kafka的新API实现生产者-消费者 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Kafka 简单实验二(Python实现简单生产者消费者)
Apache Kafka 是什么? Kafka 是一个开源的分布式流处理平台,其简化了不同数据系统的集成.流指的是一个数据管道,应用能够通过流不断地接收数据.Kafka 作为流处理系统主要有两个用处: ...
- centos7单机安装kafka,进行生产者消费者测试
[转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11364852.html 作者:jstarseven 码字挺辛苦的..... 一.k ...
随机推荐
- flutter 页面布局 Paddiing Row Column Expanded 组件
Flutter Paddiing 组件 在 html 中常见的布局标签都有 padding 属性,但是 Flutter 中很多 Widget 是没有 padding 属 性.这个时候我们可以用 Pad ...
- Python3基础 str : 字符串的逆序
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- linux部署php网页
liunx环境下运行php和传统的Java web程序不一样.我直接放在tomcat下竟然不行. 安装了php的一些环境,还是访问不了,原因是不支持https访问.没办法,还是得用tomcat,同时我 ...
- libfacedetection环境配置
E:\Opencv\libfacedetection_install1\include E:\Opencv\libfacedetection_install1\lib libfacedetect-x6 ...
- 5-1 嵌套while循环应用
package com.imooc; public class forDemo { public static void main(String[] args) { ;//外重循环的循环变量: ;// ...
- synchronized 同步对象概念
解决上述问题之前,先理解synchronized关键字的意义如下代码: Object someObject =new Object(); synchronized (someObject){ // ...
- 使用wkhtmltopdf将多个html批量转成pdf
相关工具:wkhtmltopdf 场景:比如笔者有 ognl中文文档,全部是html,现在想把它转成pdf,放到ipad阅读,文件如下: 下载好wkhtmltox(本地安装目录 D:\develop\ ...
- 【Leetcode_easy】994. Rotting Oranges
problem 994. Rotting Oranges 参考 1. Leetcode_easy_994. Rotting Oranges; 完
- Xpath定位和CSS定位(***重)
1.XPath是一种在XML文档中定位元素的语言.因为HTML可以看作XML的一种实现, 所以Selenium用户可以使用这种强大的语言在Web应用中定位元素. 1.1 绝对路径定位 参考baidu. ...
- PHP使用glob方法遍历文件夹下所有文件
PHP使用glob方法遍历文件夹下所有文件 遍历文件夹下所有文件,一般可以使用opendir 与 readdir 方法来遍历.<pre><?php$path = dirname(__ ...