go-kit
是一个分布式的开发工具集,在大型的组织(业务)中可以用来构建微服务。其解决了分布式系统中的大多数常见问题,因此,使用者可以将精力集中在业务逻辑上。
go-kit的架构如图分为三层结构:Transport层,Endpoint层,Service层。
Transport
层主要负责与传输协议HTTP,GRPC,THRIFT等相关的逻辑;
Endpoint
层主要负责request/response格式的转换,以及公用拦截器相关的逻辑;
Service
层则专注于业务逻辑,就是我们的业务类、接口等相关信息存放。
go-kit除了经典的分层架构外,还在endpoint层提供了很多公用的拦截器,如log,metric,tracing,circuitbreaker,rate-limiter等,来保障业务系统的可用性。
go-kit demo(一)基于http访问
目录结构
UserEndPoint.go
package myEndPoints
import (
"context"
"example.com/myServices"
"github.com/go-kit/kit/endpoint"
)
//定义Request、Response格式,并可以使用装饰器(闭包)包装函数,以此来实现各个中间件嵌套
type UserRequest struct {
Id int `json:"id"`
}
type UserResponse struct {
Name string `json:"name"`
}
func MakeServerEndPointGetName(s myServices.IUserService) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
r,ok := request.(UserRequest)
if !ok{
return response,nil
}
return UserResponse{Name: s.GetName(r.Id)},nil
}
}
UserService.go
package myServices
//这里就是我们的业务类、接口等相关信息存放
type IUserService interface {
GetName(userId int) string
}
type UserService struct {
}
func (s UserService) GetName(uid int) string {
if uid == 10{
return "wangqiang"
}
return "xiaoqiang"
}
UserTransport.go
package myTransports
import (
"context"
"encoding/json"
"errors"
"example.com/myEndPoints"
"net/http"
"strconv"
)
//Transport层主要负责与传输协议HTTP,GRPC,THRIFT等相关的逻辑;
func GetNameDecodeRequest (c context.Context,r *http.Request) (interface{}, error){
id := r.URL.Query().Get("id")
if id ==""{
return nil,errors.New("无效参数")
}
intid, err := strconv.Atoi(id)
if err != nil{
return nil,errors.New("无效参数")
}
return myEndPoints.UserRequest{Id: intid},nil
}
func GetNameEncodeResponse(c context.Context,w http.ResponseWriter,res interface{}) error {
w.Header().Set("Content-Type", "application/json;charset=utf-8")
return json.NewEncoder(w).Encode(res)
}
main.go
package main
import (
"example.com/myEndPoints"
"example.com/myServices"
"example.com/myTransports"
"github.com/go-kit/kit/transport/http"
"log"
sthttp "net/http"
)
func main() {
//业务接口服务
s := myServices.UserService{}
//使用myEndPoints创建业务服务
getName := myEndPoints.MakeServerEndPointGetName(s)
//使用 kit 创建 handler
// 固定格式
// 传入 业务服务 以及 定义的 加密解密方法
server := http.NewServer(getName, myTransports.GetNameDecodeRequest, myTransports.GetNameEncodeResponse)
//监听服务
log.Println(sthttp.ListenAndServe(":8080", server))
}
启动程序
作者:Feng_Sir
链接:https://www.jianshu.com/p/a4f81147f9ec
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。