Golang:使用sarama向kafka投递任务

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

[使用sarama向kafka投递任务]()
    [前言]()
    [sarama的下载]()
    [启动kafka环境]()
    [启动一个kafka消费者接受任务]()
    [go代码编写]()
    [步骤总览]()
    [完整代码]()
    [运行代码,查看效果]()
复制代码

使用sarama向kafka投递任务

前言

当了解我zookeeper和kafka,并且将它们成功启动后。可以尝试向kafka进程中投递任务了,这里使用的编程语言是golang,涉及的golang库是:github.com/Shopify/saramasarama是一个监听apache kafka的golang客户端库。

kafka-start-windows.png

sarama的下载

下载命令go get github.com/Shopify/sarama

如果出错,可以尝试换一下go代理,命令行中:

go env -W GOPROXY=https://goproxy.cn

如若是其他错误,尝试粘贴错误信息百度一下。

启动kafka环境

  1. zookeeper

    进入到zookeeper解压目录,运行系统对应的zkServer,win系统运行bin/zkServer.cmd,linux系统运行zkServer.sh。kafka启动需要依赖zookeeper,所以必须先启动了zookeeper

  2. kafka

同样进入到kafka的解压目录下,运行对应的服务指定服务配置文件。win下运行(在解压的根目录下):bin/windows/kafka-server-start.bat config/server.properties ,linux下的文件在bin/zookeeper-server-start.sh config/server.properties

启动一个kafka消费者接受任务

进入kafka的bin目录,根据系统运行对应的kafka-console-consumer文件,win在bin/windows/,linux在bin/。运行是需要带上连接地址topic号,如下例子,topic为shopping

kafka-consumer-start-windows.png

启动之后会阻塞,然后我们就可以去投递任务了。

go代码编写

步骤总览:

  1. 定义kafka配置
  2. 构建消息结构体
  3. 连接kafka
  4. 发送消息

定义kafka配置

配置类可以通过sarama.NewConfig()获取。初始化主要做的事情有两个,1. 选择分区、2.设置成功投递后channel的返回。记得引入sarama。

/*记得引入sarama。 import("github.com/Shopify/sarama") */
config := sarama.NewConfig()
// 1. 初始化生产者配置
config.Producer.RequiredAcks = sarama.WaitForAll
// 选择分区
config.Producer.Partitioner = sarama.NewRandomPartitioner
// 成功交付的信息
config.Producer.Return.Successes = true
复制代码

构建消息结构体

同样的sarama已经定义了结构体了,需要赋值的是Topic和Value(具体值),如下:

// 2. 构造一个消息,结构体类型
msg := &sarama.ProducerMessage{
    Topic: "shopping",
    Value: sarama.StringEncoder("20220411happy03"),
}
复制代码

连接kafka

使用sarama.NewSyncProducer将配置文件传入即可。打开连接和关闭连接必须成对

// 3. 连接kafka
client, err := sarama.NewSyncProducer([]string{"127.0.0.1:9092"}, config)
if err != nil {
    fmt.Println(err)
}
defer client.Close()
复制代码

发送消息(投递任务)

client.SendMessage(msg)返回值有3个,第一个是数据所在分区,第二个是数据的偏移量,第三个是错误信息,无错误返回nil

// 4. 发送消息
partition, offset, err := client.SendMessage(msg)
fmt.Println("所在分区:")
fmt.Println(partition)
fmt.Println("数据偏移量:")
fmt.Println(offset)
if err != nil {
    fmt.Println(err)
}
复制代码

完整代码

package main
​
import (
    "fmt"
    "github.com/Shopify/sarama"
)
​
func main() {
    config := sarama.NewConfig()
    // 1. 初始化生产者配置
    config.Producer.RequiredAcks = sarama.WaitForAll
    // 选择分区
    config.Producer.Partitioner = sarama.NewRandomPartitioner
    // 成功交付的信息
    config.Producer.Return.Successes = true
​
    // 2. 构造一个消息,结构体类型
    msg := &sarama.ProducerMessage{
        Topic: "shopping",
        Value: sarama.StringEncoder("20220411happy02"),
    }
​
    // 3. 连接kafka
    client, err := sarama.NewSyncProducer([]string{"127.0.0.1:9092"}, config)
    if err != nil {
        fmt.Println(err)
    }
    defer client.Close()
​
    // 4. 发送消息
    partition, offset, err := client.SendMessage(msg)
    fmt.Println("partition:")
    fmt.Println(partition)
    fmt.Println("offset:")
    fmt.Println(offset)
    if err != nil {
        fmt.Println(err)
    }
}
​
复制代码

运行代码,查看效果

go-kafka-run.png

end

猜你喜欢

转载自juejin.im/post/7085350908690857998