go micro 中间件

  1. func WrapClient(w ...client.Wrapper) Option 用一些中间件组件包装client,包装器以相反的顺序应用,最后一个先执行
  2. func WrapCall(w ..client.CallWrapper) Option 方便包装client CallFun
  3. func WrapHandler(w ...server.HandlerWrapper) Option 将一些类handler中间件传给server 并初始化
  4. func WrapSubscriber(w ...server.SubscriberWrapper) Option 将一些类subscriber中间件传给server 并初始化

单独测试micro中间件

  1. client中增加wrapper文件夹
  2. warpper下增加login文件夹 模拟登陆中间件
  3. 修改rpc下的goods.go

login.go

package login

import (
    "context"
    "fmt"

    "github.com/micro/go-micro/v2/client"
)

type clientWrapper struct {
    client.Client
}

// 中间件方法
func (c *clientWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error {
    //这里为中间件要执行的内容
    fmt.Println("前置中间件执行")

    err := c.Client.Call(ctx, req, rsp, opts...) // 这里相当于next

    fmt.Println("后置中间件执行")

    return err
}

// 创建中间件对象
func NewClientWrapper() client.Wrapper {
    return func(c client.Client) client.Client {
        return &clientWrapper{c}
    }

}

rpc.go

package rpc

import (
    proto "client/proto"
    "context"
    "fmt"
    "client/wrapper/login"

    micro "github.com/micro/go-micro/v2"
)

var goodsCli proto.GoodsService

// 所有rpc调用都需要基于这个区调用,先初始化
func init() {
    microWra := micro.NewService(
        micro.Name("goods.client"), // 定义服务名
        micro.WrapClient(login.NewClientWrapper()), // 定义中间件
    )

    // 使用中间件重新生成rpc的客户端
    goodsCli = proto.NewGoodsService("goods.client", microWra.Client())

}

// rpc调用GetGoodDetails
func GetGoodsDetails(goodsId int) (*proto.ResponseGoods, error) {
    fmt.Println("rpc  goodsid ", goodsId)
    res, err := goodsCli.GetGoodsDetails(context.Background(), &proto.RequestGoods{
        GoodsId: int32(goodsId),
    })

    return res, err
}