在 go-kit 中创建端点时我们如何传递上下文

问题描述 投票:0回答:1
func MakeGetEndpoint(srv Service) endpoint.Endpoint {
    return func(ctx context.Context, request interface{}) (interface{}, error) {
        _ = request.(getRequest) // we really just need the request, we don't use any value from it
        d, err := srv.Get(ctx)
        if err != nil {
            return getResponse{d, err.Error()}, nil
        }
        return getResponse{d, ""}, nil
    }
}
    // mapping endpoints
    endpoints := napodate.Endpoints{
        GetEndpoint:      napodate.MakeGetEndpoint(srv)
    }
func (e Endpoints) Get(ctx context.Context) (string, error) {
    req := getRequest{}
    resp, err := e.GetEndpoint(ctx, req)
    if err != nil {
        return "", err
    }
    getResp := resp.(getResponse)
    if getResp.Err != "" {
        return "", errors.New(getResp.Err)
    }
    return getResp.Date, nil
}

我们如何确保 e.GetEndpoint(ctx, req) 期间使用的 ctx 与 MakeEndpoint 中使用的 ctx 相同。我知道它们是映射的,但这个映射实际上意味着什么,因为 MakeGetEndpoint 只接受 srv 参数,但 GetEndpoint 传递 ctx 和 req。另外,MakeEndpoint 何时实际执行以及它如何访问 srv、ctx 和 request。

rest go microservices closures
1个回答
0
投票

你不知道,实际上他们应该是不同的。

A Go kit 端点“代表单个 RPC 方法”。当执行时,它会在单个请求的上下文中执行。然后意味着当单个请求被取消时(例如由于超时),该单个执行上下文也被取消。

端点是在程序初始化上下文创建的。这与请求执行不同,可能只有在初始化失败时才会取消。

ctx

request
 是端点函数的参数,对于每个请求都是
不同srv
 是从您传递给 
MakeGetEndpoint函数文字捕获
,因此对于所有请求它都保持不变。

© www.soinside.com 2019 - 2024. All rights reserved.