我设置了一系列 gRPC 请求和响应,它们都可以正常工作,但是当我尝试获取调用我的 gRPC API 的客户端 IP 地址和用户代理时,我被卡住了。
我阅读了 Go gRPC 文档和其他资源,但没有找到太多有价值的信息。他们中很少有人在 Golang 中谈论 gRPC。
在设置 gRPC API 时,我是否应该设置一个键值来将 IP 地址存储在上下文中?
在 Golang GRPC 中,您可以使用
func (UserServicesServer) Login(ctx context.Context, request *sso.LoginRequest) (*sso.LoginResponse, error) {
p, _ := peer.FromContext(ctx)
request.Frontendip = p.Addr.String()
.
.
}
但是,不要忘记导入"google.golang.org/grpc/peer"
在 Golang GRPC 中,上下文有 3 个值
权威
内容类型
用户代理
md,ok:=metadata.FromIncomingContext(ctx)
fmt.Printf("%+v%+v",md,ok)
使用grpc-gateway时,clientIp 可以通过x-forwarded-for
if headers, ok := metadata.FromIncomingContext(ctx); ok {
xForwardFor := headers.Get("x-forwarded-for")
if len(xForwardFor) > 0 && xForwardFor[0] != "" {
ips := strings.Split(xForwardFor[0], ",")
if len(ips) > 0 {
clientIp = ips[0]
}
}
}