Golang gRPC在拦截器Interceptor中获取请求和响应数据的方法

gRPC在服务端和客户端都可以定义并使用拦截器(Interceptor)。

服务端拦截器是RPC方法执行前调用的的函数,可以在拦截器中做很多事情,例如日志记录、链路跟踪、流量控制、鉴权等。

客户端拦截器是发出RPC调用之前调用的函数,用途和服务端的类似。

本文只讲服务端拦截器,拦截器要实现不同的功能一般都需要获取到请求和响应的一些数据。下面就使用代码演示各种数据的获取方法:

package main

import (
	"context"
	"fmt"
	"net"
	"time"

	"google.golang.org/grpc"
	"google.golang.org/grpc/metadata"
	"google.golang.org/grpc/peer"
	"google.golang.org/grpc/status"
)

funcUnaryTest()grpc.UnaryServerInterceptor {
	returnfunc(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler)(resp interface{}, err error) {
		start := time.Now()
		// 请求日期
		requestDate := start.Format(time.RFC3339)
		var res interface{}
		deferfunc() {
			// metadata
			md, _ := metadata.FromIncomingContext(ctx)
			// User Agent 和 host
			ua, host := extractFromMD(md)
			// 请求IP
			clientIp := getPeerAddr(ctx)
			// 请求耗时
			delay := time.Since(start).Milliseconds()
			// 请求调用的rpc方法 i.e., /package.service/method.
			fullMethod := info.FullMethod
			// 请求内容
			requestBody := req
			// 响应的状态码
			responseStatus := int(status.Code(err))
			// 响应数据
			responseBody := res
		}()
		res, err = handler(ctx, req)
		return res, err
	}
}

funcextractFromMD(md metadata.MD)(ua string, host string) {
	if v, ok := md["x-forwarded-user-agent"]; ok {
		ua = fmt.Sprintf("%v", v)
	} else {
		ua = fmt.Sprintf("%v", md["user-agent"])
	}
	if v, ok := md[":authority"]; ok && len(v) > 0 {
		host = fmt.Sprintf("%v", v[0])
	}
	return ua, host
}

funcgetPeerAddr(ctx context.Context)string {
	var addr string
	if pr, ok := peer.FromContext(ctx); ok {
		if tcpAddr, ok := pr.Addr.(*net.TCPAddr); ok {
			addr = tcpAddr.IP.String()
		} else {
			addr = pr.Addr.String()
		}
	}
	return addr
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路多辛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值