1. 包装器

前言: 包装器是 Go Micro 的中间件

2. 概述

包装器是 Go Micro 的中间件. 我们希望创建一个可扩展的框架, 其中包含钩子, 以添加非核心要求的额外功能. 很多时候, 你需要执行的东西, 如验证, 跟踪等, 所以这提供了这样做的能力.

为此我们使用了 "修饰器模式".

2.1. 使用

这里有一些示例用法和真实代码 examples/wrapper.

你可以在这里 go-plugins/wrapper 中找到一系列的包装器.

2.1.1. 处理器

下面是一个示例服务处理程序包装器, 它记录传入的请求

// 实现 server.HandlerWrapper
func logWrapper(fn server.HandlerFunc) server.HandlerFunc {
    return func(ctx context.Context, req server.Request, rsp interface{}) error {
        fmt.Printf("[%v] server request: %s", time.Now(), req.Endpoint())
        return fn(ctx, req, rsp)
    }
}

创建服务时可以初始化

service := micro.NewService(
    micro.Name("greeter"),
    // wrap the handler
    micro.WrapHandler(logWrapper),
)

2.1.2. 客户端

下面是客户端包装器的示例, 该包装器记录发出的请求

type logWrapper struct {
    client.Client
}

func (l *logWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error {
    fmt.Printf("[wrapper] client request to service: %s endpoint: %s\n", req.Service(), req.Endpoint())
    return l.Client.Call(ctx, req, rsp)
}

// 实现 client.Wrapper 作为日志包装器 logWrapper
func logWrap(c client.Client) client.Client {
    return &logWrapper{c}
}

创建服务时可以初始化

service := micro.NewService(
    micro.Name("greeter"),
    // wrap the client
    micro.WrapClient(logWrap),
)

results matching ""

    No results matching ""