【go】Grpc-获取请求地址
背景
如同在走HTTP开发,在用grpc做服务时候也会有遇到需要获得请求端地址做统计或计算的需求,现有的api没有能像net/http
库封装那样直接获得请求IP,需要我们自己处理一下。
解决方法
从ISSUE,可以了解到.在metadata中包含有我们需要的请求地址,我们可以通过grpc/peer包进行获取。
如果client和server在同台机器的话,返回的地址会变成[::1]:port
,对此我做一下处理变成localhost
。
代码如下:
import (
"fmt"
"net"
"strings"
"golang.org/x/net/context"
"google.golang.org/grpc/peer"
)
//获取请求客户端的远程地址
//
//通过从metadata中获取远程地址信息
func GetClientIP(ctx context.Context) (string, error) {
pr, ok := peer.FromContext(ctx)
if !ok {
return "", fmt.Errorf("[getClinetIP] invoke FromContext() failed")
}
if pr.Addr == net.Addr(nil) {
return "", fmt.Errorf("[getClientIP] peer.Addr is nil")
}
addSlice := strings.Split(pr.Addr.String(), ":")
if addSlice[0] == "[" {
//本机地址
return "localhost", nil
}
return addSlice[0], nil
}