go-kit

126 阅读2分钟

kit三层结构

  • service :业务接口

  • endpoint: 定义request,response格式的转换,并用装饰器包装函数。以此来实现各种中间件嵌套

  • transport:负责与http,grpc等逻辑传输

使用开源gorilla/mux

使用开源mux注册路由,添加新的方法

docker部署单点consul

  • docker安装在虚拟机上
  • 使用xshell与虚拟机通信(虚拟机要开机)
  • docker相关命令
docker ps//查看运行的镜像
docker pull consul //拉去镜像
sudo gpasswd -a $USER docker //设置docker用户组
newgrp docker//刷新用户组
docker start name //重启已经退出的镜像

docker run -d --name=cs -p8500:8500 consul agent -server -bootstrap -ui -client 0.0.0.0 


  1. 首先在虚拟机上写一个p.json image.png

  2. 在json目录下执行curl --request PUT --data @p.json localhost:8500/v1/agent/service/register

image.png

  1. 删除服务

image.png

curl --request  PUT http://localhost:8500/v1/agent/service/deregister/userservice

image.png

  • consul本身就是go开发的库,我们现在尝试go在注册删除服务
go get github.com/hashicorp/consul
  1. 在consul.go里写一个RegService方法用于注册服务,主要是定义check参数,创建consul检查器,注册等等

image.png

  1. 反注册 通过协程加channel的方式,监听了信号终止以及http错误终止
errChan := make(chan error)

go func() {
   util.RegService() //注册服务

   err := http.ListenAndServe(":8080", r)
   //如果http出错,我们把错误上放到errchan里
   if err != nil {
      log.Println(err)
      errChan <- err
   }
}()

//对信号拦截
go func() {
   sig_c := make(chan os.Signal)
   signal.Notify(sig_c, syscall.SIGINT, syscall.SIGTERM) //一旦有后面的信号传入,会写到sigc这个channel里
   //将拦截到的信号以error的形式放到errchan里面
   errChan <- fmt.Errorf("%s", <-sig_c)
}()
//任意一种方式往errchan里些内容,都会调用一下函数,否则堵塞在这里
getChan := <-errChan
util.Unregservice()
log.Println(getChan)
  • 服务发现--客户端直连形式(不使用consul)
  1. 首先创建一个client,使用
httptransport.NewClient("GET", tgt, Services.GetUserInfoRequest, Services.GetUserInfoResponse)

  1. 构造请求函数,响应函数
  2. 使用goo-kit生成一个client,并生成一个endpoint,传入ctx,request
tgt, _ := url.Parse("http://ip:8080")
client := httptransport.NewClient("GET", tgt, Services.GetUserInfoRequest, Services.GetUserInfoResponse)
//通过这个拿到了定义在服务端的endpoint,也就是上面这段代码return的函数,直接在本地调用服务端代码
getUserInfo := client.Endpoint()

ctx := context.Background()
res, err := getUserInfo(ctx, Services.UserRequest{Uid: 102})
if err != nil {
   fmt.Println(err)
   os.Exit(1)
}
userinfo := res.(Services.UserResponse)
fmt.Println(userinfo.Result)
  • 服务发现--consul

20191222200111.png 2.

20191222201350.png 3.endpointer是一个切片

20191222201853.png