美文网首页
golang 微服务开发(九)go micro中间件使用

golang 微服务开发(九)go micro中间件使用

作者: mafa1993 | 来源:发表于2022-05-11 21:03 被阅读0次

    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
    }
    
    

    相关文章

      网友评论

          本文标题:golang 微服务开发(九)go micro中间件使用

          本文链接:https://www.haomeiwen.com/subject/bwjjurtx.html