Go实现海量日志收集系统(三)

 再次整理了一下这个日志收集系统的框,如下图

这次要实现的代码的整体逻辑为:

完整代码地址为: https://github.com/pythonsite/logagent

etcd介绍

高可用的分布式key-value存储,可以用于配置共享和服务发现

类似的项目:zookeeper和consul

开发语言:go

接口:提供restful的接口,使用简单

实现算法:基于raft算法的强一致性,高可用的服务存储目录

etcd的应用场景:

  • 服务发现和服务注册
  • 配置中心(我们实现的日志收集客户端需要用到)
  • 分布式锁
  • master选举

官网对etcd的有一个非常简明的介绍:

etcd搭建:
下载地址:https://github.com/coreos/etcd/releases/
根据自己的环境下载对应的版本然后启动起来就可以了

启动之后可以通过如下命令验证一下:

复制代码
[root@localhost etcd-v3.2.18-linux-amd64]# ./etcdctl set name zhaofan  zhaofan [root@localhost etcd-v3.2.18-linux-amd64]# ./etcdctl get namezhaofan [root@localhost etcd-v3.2.18-linux-amd64]# 
复制代码

context 介绍和使用

其实这个东西翻译过来就是上下文管理,那么context的作用是做什么,主要有如下两个作用:

  • 控制goroutine的超时
  • 保存上下文数据

通过下面一个简单的例子进行理解:

 

复制代码
package main  import (     "fmt"    "time"    "net/http"    "context"    "io/ioutil" )   type Result struct{     r *http.Response     err error }  func process(){     ctx,cancel := context.WithTimeout(context.Background(),2*time.Second)     defer cancel()     tr := &http.Transport{}     client := &http.Client{Transport:tr}     c := make(chan Result,1)     req,err := http.NewRequest("GET","http://www.google.com",nil)     if err != nil{         fmt.Println("http request failed,err:",err)         return     }     // 如果请求成功了会将数据存入到管道中     go func(){         resp,err := client.Do(req)         pack := Result{resp,err}         c <- pack     }()      select{     case <- ctx.Done():         tr.CancelRequest(req)         fmt.Println("timeout!")     case res := <-c:         defer res.r.Body.Close()         out,_:= ioutil.ReadAll(res.r.Body)         fmt.Printf("server response:%s",out)     }     return  }  func main() {     process() }
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信