当前位置:首页 > 文章列表 > Golang > Go教程 > golang连接kafka消费进ES操作

golang连接kafka消费进ES操作

来源:脚本之家 2023-01-01 11:16:50 0浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《golang连接kafka消费进ES操作》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

1.首先初始化conf配置把kafka和ES的地址配置好还有一个日志方便查看

配置信息如下 用到的库是

github.com/astaxie/beego/config
[logs]
log_level = debug
log_path = "./logs/log_transfer.log"
[kafka]
server_addr = 192.168.0.134:9092
topic = nginx_log
[ES]
addr = http://192.168.0.134:9200/

2.读取conf配置存取进结构体

type LogConfig struct {
  kafkaAddr string
  ESAddr string
  LogPath string
  LogLevel string
  Topic string
}
var (
   logConfig *LogConfig
)

3.读取conf配置代码如下

func initConfig(conftype string,filename string)(err error) {
   conf, err := config. NewConfig(conftype,filename)
   if err != nil {
    fmt. Println( "new config faild,err:",err)
     return
  }
   logConfig = &LogConfig{}
   logConfig.LogLevel = conf. String( "logs::log_level")
   if len(logConfig.LogLevel) == 0 {
     logConfig.LogLevel = "debug"
  }
   logConfig.LogPath = conf. String( "logs::log_path")
   if len(logConfig.LogPath) == 0 {
     logConfig.LogPath = "./logs"
  }
   logConfig.kafkaAddr = conf. String( "kafka::server_addr")
   if len(logConfig.kafkaAddr) == 0 {
     err = fmt. Errorf( "invalid kafka addr err")
     return
  }
   logConfig.ESAddr = conf. String( "ES::addr")
   if len(logConfig.ESAddr) == 0 {
     err = fmt. Errorf( "invalid ES addr err")
     return
  }
   logConfig.Topic = conf. String( "kafka::topic")
   if len(logConfig.Topic) == 0 {
     err = fmt. Errorf( "invalid topic addr err")
     return
  }
   return
}

4.完成了initConfig的初始化

5.初始化initLogger

func convertLogLevel(level string) int {
   switch(level) {
     case "debug":
       return logs.LevelDebug
     case "warn":
       return logs.LevelWarn
     case "info":
       return logs.LevelInfo
     case "trace":
       return logs.LevelTrace
  }
   return logs.LevelDebug
}
func initLogger(logpath string, logLevel string) (err error) {
   config := make( map[ string] interface{})
  config[ "filename"] = logpath
  config[ "level"] = convertLogLevel(logLevel)
   configStr, err := json. Marshal(config)
   if err!= nil {
    fmt. Println( "marshal failed,err:",err)
     return
  }
  logs. SetLogger(logs.AdapterFile, string(configStr))
   return
}

6.初始化kafka

type KafkaClient struct {
  client sarama.Consumer
  addr string
  topic string
  wg sync.WaitGroup
}
var (
   kafkaClient *KafkaClient
)
func initKafKa(addr string,topic string)(err error) {
   kafkaClient = &KafkaClient{}
   consumer, err := sarama. NewConsumer(strings. Split(addr, ","), nil)
   if err != nil {
    logs. Error( "Failed to strat consumer :",err)
     return 
  }
   kafkaClient.client = consumer
   kafkaClient.addr = addr
   kafkaClient.topic = topic
   return
}

7.初始化ES

gopkg.in/olivere/elastic.v2 // 这个是操作ES的库

type LogMessage struct {
  App string
  Topic string
  Message string
}
var (
   esClient *elastic.Client
)
func initES(addr string)(err error) {
  
   client, err := elastic. NewClient(elastic. SetSniff( false),elastic. SetURL(addr))
   if err != nil {
    fmt. Println( "connect es error",err)
     return
  }
   esClient = client
   return
}

8.干活把kafka的数据写入ES

github.com/Shopify/sarama 这个是操作kafka的驱动库

func run()(err error) {
  fmt. Println( "run")
   partitionList, err := kafkaClient.client. Partitions(kafkaClient.topic)
   if err != nil {
    logs. Error( "ini failed ,err:%v",err)
    fmt. Printf( "ini failed ,err:%v",err)
     return
  }
   for partition := range partitionList {
    fmt. Println( "for进入")
     pc, errRet := kafkaClient.client. ConsumePartition(kafkaClient.topic, int32(partition),sarama.OffsetNewest)
     if errRet != nil {
       err = errRet
      logs. Error( "Failed to start consumer for partition %d: %s \n ",partition,err)
      fmt. Printf( "Failed to start consumer for partition %d: %s \n ",partition,err)
       return
    }
     defer pc. AsyncClose()
    fmt. Println( "马上进入协程")
    kafkaClient.wg. Add( 1)
     go func(pc sarama.PartitionConsumer){
      fmt. Println( "进来了")
      
       for msg := range pc. Messages() {
        fmt. Println( "func执行")
        logs. Debug( "Partition:%d,Offset:%d,key:%s,value:%s",msg.Partition,msg.Offset, string(msg.Key), string(msg.Value))
         //fmt.Println()
         err = sendToES(kafkaClient.topic,msg.Value)
         if err != nil {
          logs. Warn( "send to es failed,err:%v",err)
        }
      }
      kafkaClient.wg. Done()
    }(pc)    
  }
  kafkaClient.wg. Wait()
  fmt. Println( "协程执行完毕")
   return
}

上面代码是读kafka消费数据通过sendToES这个函数发送至ES里面

sendToES代码如下

func sendToES(topic string,data [] byte) (err error) {
   msg := &LogMessage{}
   msg.Topic = topic
   msg.Message = string(data)
   _, err = esClient. Index().
       Index(topic).
       Type(topic).
       BodyJson(msg).
       Do()
     if err != nil {
      
       return
    }
   return
}

Index就是索引名称

index().type().bodyjson().do()这样的写法是链式执行操作

9.写完了基本操作后 再写一个模拟写入数据进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{ "127.0.0.1:9092"}, config)
if err != nil {
fmt. Println( "producer close,err:", err)
return
}
defer client. Close()
var n int= 0
for {
n++
msg := &sarama.ProducerMessage{}
msg.Topic = "nginx_log"
msg.Value = sarama. StringEncoder( "this is a good test,hello maomaoChong!!," + strconv. Itoa(n))
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 * 2)
}
}

这个就是生产者往kafka里面写入数据进去消费

10.我们启动我们的kafka 注意kafka依赖于zookeeper 先启动ZK然后启动kafka

我这里用的是zookeeper-3.4.12网上有下载

启动ZK

ZK已经成功启动

11.启动kafka 我这里是kafka_2.11-1.1.0

.\bin\windows\kafka-server-start.bat .\config\server.properties

kafka已经跑起来了

12.把kafka消费测试端也启动

.\bin\windows\kafka-console-consumer.bat --topic nginx_log --zookeeper 127.0.0.1 2181

消费端启动成功 一直等待数据进来消费

13.然后我们把ES 和Kib 都启动了

这是我们的ES版本是5.5.1的 已经跑起来了 接着启动我们的kib

kib里面有个配置config下面的叫kibana.yml里面设置好ES的地址和端口就处于监听ES状态

启动kib有点慢 稍微等一下就好

此时启动好了kib

14.测试kib是否启动

默认地址是http://localhost:5601

进入成功 确定没问题

15.编译我们的代码 写数据进kafka

从上面看我们知道一个再写 一个再消费

16.编译运行我们把kafka写入进ES里面的代码

运行了 这里就把kafka消费的数据 写入进ES里面

17.我们看一下数据是否有 进入kib

我们看到有数据了 已经成功了~

以上为个人经验,希望能给大家一个参考,也希望大家多多支持golang学习网。如有错误或未考虑完全的地方,望不吝赐教。

今天关于《golang连接kafka消费进ES操作》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于golang的内容请关注golang学习网公众号!

版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
浅谈golang结构体偷懒初始化浅谈golang结构体偷懒初始化
上一篇
浅谈golang结构体偷懒初始化
go语言的初始化顺序,包,变量,init详解
下一篇
go语言的初始化顺序,包,变量,init详解
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 笔灵AI生成答辩PPT:高效制作学术与职场PPT的利器
    笔灵AI生成答辩PPT
    探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
    16次使用
  • 知网AIGC检测服务系统:精准识别学术文本中的AI生成内容
    知网AIGC检测服务系统
    知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
    24次使用
  • AIGC检测服务:AIbiye助力确保论文原创性
    AIGC检测-Aibiye
    AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
    30次使用
  • 易笔AI论文平台:快速生成高质量学术论文的利器
    易笔AI论文
    易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
    42次使用
  • 笔启AI论文写作平台:多类型论文生成与多语言支持
    笔启AI论文写作平台
    笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
    35次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码