go micro 中间件
- func WrapClient(w ...client.Wrapper) Option 用一些中间件组件包装client,包装器以相反的顺序应用,最后一个先执行
- func WrapCall(w ..client.CallWrapper) Option 方便包装client CallFun
- func WrapHandler(w ...server.HandlerWrapper) Option 将一些类handler中间件传给server 并初始化
- func WrapSubscriber(w ...server.SubscriberWrapper) Option 将一些类subscriber中间件传给server 并初始化
单独测试micro中间件
- client中增加wrapper文件夹
- warpper下增加login文件夹 模拟登陆中间件
- 修改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
}