使用go-kit 构建一个简单的加法,对方暴露一个请求接口

开始

  • 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一起讨论

完整代码地址

联系 QQ: 3355168235