首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >go-微包装器即服务

go-微包装器即服务
EN

Stack Overflow用户
提问于 2018-04-23 11:57:05
回答 1查看 1.1K关注 0票数 0

问题是如何使用go-micro作为一个单独的服务-如果有人知道如何正确使用它,请让我知道。我的例子- authWrapper,所以所有api服务都应该能够使用它,它应该通过标准服务发现来发现,要对authWrapper进行任何更改,只有1个服务应该重新构建(我没有找到一种方法通过rpc调用将context.Context从api服务正确地传递到authWrapper )。

go-micro docs

go-micro wrapper examples

调用authWrapper的接口代码:

代码语言:javascript
复制
func main() {
    service := micro.NewService(
        micro.Name("go.micro.api.account"),
        micro.WrapHandler(AuthWrapper),
    )
    fmt.Println("service created")
    service.Init()
    account.RegisterAccountHandler(service.Server(),
        &handler.Account{
            ProfileServiceClient: profile.NewProfileServiceClient("go.micro.srv.profile", service.Client()),
            AuthServiceClient:    auth.NewAuthServiceClient("go.micro.srv.auth", service.Client()),
        })

    if err := service.Run(); err != nil {
        log.Fatal(err)
    }
}

和authWrapper:

代码语言:javascript
复制
var methodsWithoutAuth = map[string]bool{"Account.Auth": true, "Account.Create": true}

func AuthWrapper(fn server.HandlerFunc) server.HandlerFunc {
    return func(ctx context.Context, req server.Request, resp interface{}) error {
        fmt.Printf("AuthWrapper, req: %+v", req)

        method := req.Method()
        fmt.Printf("checking if method allowed, method: %+v", method)
        if _, ok := methodsWithoutAuth[method]; ok {
            return fn(ctx, req, resp)
        }

        fmt.Printf("validating token")

        authClient := auth.NewAuthServiceClient("go.micro.srv.auth", client.DefaultClient)

        meta, ok := metadata.FromContext(ctx)
        if !ok {
            return errors.New("no auth meta-data found in request")
        }

        token := meta["Token"]
        log.Println("Authenticating with token: ", token)

        newCtx := context.WithValue(ctx, "Method", req.Method())

        _, err := authClient.ValidateToken(newCtx, &auth.Token{Token: token})
        if err != nil {
            return err
        }

        prof, err := authClient.Decode(newCtx, &auth.Token{Token: token})
        if err != nil {
            return err
        }

        newCtxWithProf := context.WithValue(newCtx, "Profile", prof.Profile)

        return fn(newCtxWithProf, req, resp)
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-06-20 04:23:10

您可以通过将go-micro客户端合并到包装器代码中来编写服务包装器。你可以在github上找到很多如何编写go-micro客户端的例子,我相信在go-micro存储库的欢迎示例中就有一个。

通过使用客户端样板,我使用包装器向rest服务包装器公开了grpc接口。

通过这种方式,您几乎可以为任何目的编写微服务的包装器。

不要担心客户端代码需要寻址的端口,Consul可以很好地为您处理这些问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49973189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档