首先介绍以下go-kit组件的大致结构
按照调用的顺序进行介绍
- transport:进行主要负责网络传传输,进行编码和解码
- endpoint:主要负责request和response的格式的转换。
- service:进行业务逻辑的开发
调用顺序的介绍:
首先,transport获得参数,将所获得的参数转化为结构体类型的值,并返回request的结构体
第二,使用endpoint接受到的参数为transport的反回的request结构体,并进行调用service业务逻辑函数,只不过,endpoint接收到的参数为接口类型的变量,需要进行断言。调用service业务逻辑之后,返回的就是response类型的值。
第三,使用 transport进行解码,将返回的response类型的值进行解码。
服务注册
config:=consulapi.DefaultConfig()
config.Address="127.0.0.1:8500"//注册到的地址
reg:=consulapi.AgentServiceRegistration{}
reg.Address="127.0.0.1"//注册服务的地址
reg.Port=8080//注册服务的端口号
reg.Name="testname"//注册服务的名称,如果两个服务相同,则服务名相同,进行负载均衡
reg.ID="111111"//服务id
check:=consulapi.AgentServiceCheck{Interval: "5s",HTTP: "http://127.0.0.1:8080/health"}//服务检查,间隔时长,检查的接口
reg.Check=&check
Client,_=consulapi.NewClient(config)//consul-client端注册
Client.Agent().ServiceRegister(®)//服务service端注册
服务发现
我们需要通过consul进行服务发现和调用,所以还需要进行调用consulapi
func f(instance string) (endpoint.Endpoint, io.Closer, error){
tart,_:=url.Parse("http://"+instance)
return
//注意:getuser是编码函数,get是解码函数 httptransport.NewClient("GET",tart,service.Getuser,service.Get).Endpoint(),nil,nil
}
//开头相同,都是进行consul客户端的注册
config := consulapi.DefaultConfig()//consul配置信息
config.Address = "127.0.0.1:8500" //register address
api_client, _ := consulapi.NewClient(config)//以client端注册node节点
client := consul.NewClient(api_client)//与注册服务不同的是,这里是客户端,需要访问的是服务端
var logger log.Logger//log组件
logger = log.NewLogfmtLogger(os.Stdout)//初始化log组件
//
instancer := consul.NewInstancer(client, logger, "testname",[]string{}, true)
endpointer := sd.NewEndpointer(instancer, f, logger)
//查询节点信息,进行查找,注意tag标签一定要写对,没有就是没有,有就写上
endpoints,_:=endpointer.Endpoints()//获得节点
res,_:=endpoints[0](context.Background(),service.UserRequest{Uid: 100})
//进行调用服务节点
userifo:=res.(service.UserResponse)//将返回的数据进行断言
fmt.Println(userifo)