背景

如同在走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
}

参考资料

grpc issue #479

文章目录