首先安装jdk zookeeper是java写的 需要运行在java环境下先安装jdk 安装完之后加入环境变量
在cmd下运行zookeeper cmd必须是要要在管理员下运行
第二步:
bin\windows\zookeeper-server-start.bat config\zookeeper.properties
bin\windows\kafka-server-start.bat config\server.properties
第三步:
package main
import (
"fmt"
"github.com/Shopify/sarama"
// "time"
)
func main() {
producer_test()
}
func producer_test() {
fmt.Printf("producer_test\n")
config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.WaitForAll // leader 和follow都确认
config.Producer.Partitioner = sarama.NewRandomPartitioner // 新选出一个partitioner
config.Producer.Return.Successes = true // 成功交付的消息将在success channel返回
config.Producer.Return.Errors = true // 失败通过Errors channel 返回
config.Version = sarama.V0_11_0_2 // V0_10_0_0
// 链接kafka
// producer, err := sarama.NewAsyncProducer([]string{"localhost:9092"}, config) // 异步
producer, err := sarama.NewSyncProducer([]string{"localhost:9092"}, config) // 同步
if err != nil {
fmt.Printf("producer_test create producer error :%s\n", err.Error())
return
}
// defer producer.AsyncClose() // 异步关闭
defer producer.Close() // 同步关闭
fmt.Println("链接kafka成功!!!")
// 构造一个消息
msg := &sarama.ProducerMessage{
Topic: "web_log1",
Key: sarama.StringEncoder("this"),
Value: sarama.StringEncoder("this is a test log"),
}
// 构造一个消息 第二种写法
// msg := &sarama.ProducerMessage{}
// msg.Topic = "web_log"
// msg.Value = "sarama,StringEncoder("this is a test log")"
pid, offset, err := producer.SendMessage(msg)
if err != nil {
fmt.Println("send msg fail err:", err)
return
}
fmt.Printf("pid:%v offset:%v \n", pid, offset)
// 异步读取
// value := "this is message"
// for {
// fmt.Scanln(&value)
// msg.Value = sarama.ByteEncoder(value)
// fmt.Printf("input [%s]\n", value)
// // send to chain
// producer.Input() <- msg
// select {
// case suc := <-producer.Successes():
// fmt.Printf("offset: %d, timestamp: %s", suc.Offset, suc.Timestamp.String())
// case fail := <-producer.Errors():
// fmt.Printf("err: %s\n", fail.Err.Error())
// }
// }
}
运行在go mod模式下 windows下 samara必须要在1.19版本 否则编译不过去
第四步:
bin\windows\kafka-console-consumer.bat --bootstrap-server=localhost:9092 --topic=web_log1
运行代码的同时在cmd打开上面的命令 就能看见写入kafka的数据
以下是整合tail模块的代码 直接在E:\kafka_logs\my.log的文件里写入日志 tail包会监听这个文件每添加一行tail就会读取到然后写入kafka中
package main
import (
"fmt"
"github.com/hpcloud/tail"
"github.com/Shopify/sarama"
"time"
)
func main() {
producer_test()
}
func producer_test() {
//初始化kafka
fmt.Printf("producer_test\n")
config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.WaitForAll // leader 和follow都确认
config.Producer.Partitioner = sarama.NewRandomPartitioner // 新选出一个partitioner
config.Producer.Return.Successes = true // 成功交付的消息将在success channel返回
config.Producer.Return.Errors = true // 失败通过Errors channel 返回
config.Version = sarama.V0_11_0_2 // V0_10_0_0
// 链接kafka
// producer, err := sarama.NewAsyncProducer([]string{"localhost:9092"}, config) // 异步
producer, err := sarama.NewSyncProducer([]string{"localhost:9092"}, config) // 同步
if err != nil {
fmt.Printf("producer_test create producer error :%s\n", err.Error())
return
}
// defer producer.AsyncClose() // 异步关闭
defer producer.Close() // 同步关闭
fmt.Println("链接kafka成功!!!")
// 初始化taillog
filename := "E:\\kafka-logs\\my.log"
tails, err := tail.TailFile(filename, tail.Config{
ReOpen: true, // 重新打开
Follow: true, // 是否跟随
Location: &tail.SeekInfo{Offset: 0, Whence: 2}, // 如果程序出现异常,保存上次读取的位置,避免重新读取。
MustExist: false, // 文件必须存在
Poll: true, //
})
if err != nil {
fmt.Println("tail file err:", err)
return
}
// 开始往kafka写入消息
var msg *tail.Line
var ok bool
for {
msg, ok = <-tails.Lines
if !ok {
fmt.Printf("tail file close reopen, filename:%s\n", tails.Filename)
time.Sleep(100 * time.Millisecond)
continue
}
fmt.Println("msg:", msg.Text)
// 构造一个消息
msg := &sarama.ProducerMessage{
Topic: "web_log1",
Key: sarama.StringEncoder("this"),
Value: sarama.StringEncoder(msg.Text),
}
// 往kafka内发送消息
pid, offset, err := producer.SendMessage(msg)
if err != nil {
fmt.Println("send msg fail err:", err)
return
}
fmt.Printf("pid:%v offset:%v \n", pid, offset)
}
// 构造一个消息
// msg := &sarama.ProducerMessage{
// Topic: "web_log1",
// Key: sarama.StringEncoder("this"),
// Value: sarama.StringEncoder("this is a test log"),
// }
// 构造一个消息 第二种写法
// msg := &sarama.ProducerMessage{}
// msg.Topic = "web_log"
// msg.Value = "sarama,StringEncoder("this is a test log")"
// 发送消息
// pid, offset, err := producer.SendMessage(msg)
// if err != nil {
// fmt.Println("send msg fail err:", err)
// return
// }
// fmt.Printf("pid:%v offset:%v \n", pid, offset)
// 异步读取
// value := "this is message"
// for {
// fmt.Scanln(&value)
// msg.Value = sarama.ByteEncoder(value)
// fmt.Printf("input [%s]\n", value)
// // send to chain
// producer.Input() <- msg
// select {
// case suc := <-producer.Successes():
// fmt.Printf("offset: %d, timestamp: %s", suc.Offset, suc.Timestamp.String())
// case fail := <-producer.Errors():
// fmt.Printf("err: %s\n", fail.Err.Error())
// }
// }
}