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
- http://虚拟机ip:8500 查看consul运行情况
- 将我们的本地服务地址注册到consul里 (本都ip:端口)Service - Agent - HTTP API | Consul by HashiCorp
-
首先在虚拟机上写一个p.json
-
在json目录下执行curl --request PUT --data @p.json localhost:8500/v1/agent/service/register
- 删除服务
curl --request PUT http://localhost:8500/v1/agent/service/deregister/userservice
- consul本身就是go开发的库,我们现在尝试go在注册删除服务
go get github.com/hashicorp/consul
- 在consul.go里写一个RegService方法用于注册服务,主要是定义check参数,创建consul检查器,注册等等
- 反注册 通过协程加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)
- 首先创建一个client,使用
httptransport.NewClient("GET", tgt, Services.GetUserInfoRequest, Services.GetUserInfoResponse)
- 构造请求函数,响应函数
- 使用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
2.
3.endpointer是一个切片