使用go-kit 构建一个简单的加法,对方暴露一个请求接口
- URL格式为:http://127.0.0.1:8888/sum?a=参数&b=参数 请求方法为 GET
开始
- go-kit 安装:go get github.com/go-kit/kit
创建Service
定义接口
type Service interface {
TestAdd(ctx context.Context,in Add) AddAck
}
定义model
type Add struct {
A int `json:"a"`
B int `json:"b"`
}
type AddAck struct {
Res int `json:"res"`
}
创建结构体baseServer来实现Service接口
type baseServer struct {
}
func NewService() Service {
return &baseServer{}
}
func (s baseServer) TestAdd(ctx context.Context,in Add) AddAck {
return AddAck{Res:in.A+in.B}
}
创建Endpoint
把Service的方法封装到Endpoint中
把Service中的TestAdd,转换成endpoint.Endpoint
func MakeAddEndPoint(s v1_service.Service) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
req := request.(v1_service.Add)
res := s.TestAdd(ctx, req)
return res, nil
}
}
Endpoint方法集合
type EndPointServer struct {
AddEndPoint endpoint.Endpoint
}
func NewEndPointServer(svc v1_service.Service) EndPointServer {
var addEndPoint endpoint.Endpoint
{
addEndPoint = MakeAddEndPoint(svc)
}
return EndPointServer{AddEndPoint: addEndPoint}
}
func (s EndPointServer) Add(ctx context.Context, in v1_service.Add) v1_service.AddAck {
res, _ := s.AddEndPoint(ctx, in)
return res.(v1_service.AddAck)
}
创建Transport
Transport层用于接受用户请求并把数据转换为Endpoint使用的数据格式,并把Endpoint的返回值封装返回给用户,所以该层应该有以下方法
- 把请求转换为Server方法需要的格式(decodeHTTPADDRequest);
- 把函数返回值封装传回用户(encodeHTTPGenericResponse);
func decodeHTTPADDRequest(_ context.Context, r *http.Request) (interface{}, error) {
var (
in v1_service.Add
err error
)
in.A, err = strconv.Atoi(r.FormValue("a"))
in.B, err = strconv.Atoi(r.FormValue("b"))
if err != nil {
return in, err
}
return in, nil
}
func encodeHTTPGenericResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error {
if f, ok := response.(endpoint.Failer); ok && f.Failed() != nil {
errorEncoder(ctx, f.Failed(), w)
return nil
}
w.Header().Set("Content-Type", "application/json; charset=utf-8")
return json.NewEncoder(w).Encode(response)
}
创建http.Handler
func NewHttpHandler(endpoint v1_endpoint.EndPointServer) http.Handler {
options := []httptransport.ServerOption{
httptransport.ServerErrorEncoder(errorEncoder), //程序中的全部报错都会走这里面
}
m := http.NewServeMux()
m.Handle("/sum", httptransport.NewServer(
endpoint.AddEndPoint,
decodeHTTPADDRequest, //解析请求值
encodeHTTPGenericResponse, //返回值
options...,
))
return m
}
激动人心的时刻来了,运行代码
server := v1_service.NewService()
endpoints := v1_endpoint.NewEndPointServer(server)
httpHandler := v1_transport.NewHttpHandler(endpoints)
fmt.Println("server run 0.0.0.0:8888")
_ = http.ListenAndServe("0.0.0.0:8888", httpHandler)
访问 http://127.0.0.1:8888/sum?a=1&b=1
- 运行程序,了解go-kit的代码运行模式
- 欢迎添加QQ一起讨论