【问题标题】:How can I get the client IP address and user-agent in Golang gRPC?如何在 Golang gRPC 中获取客户端 IP 地址和用户代理?
【发布时间】:2019-01-16 02:50:59
【问题描述】:

我设置了一系列 gRPC 请求和响应,它们都可以正常工作,但是当我尝试获取调用我的 gRPC API 的客户端 IP 地址和用户代理时,我被卡住了。

我阅读了 Go gRPC 文档和其他资源,但没有找到太多有价值的信息。他们中很少有人在 Golang 中谈论 gRPC。

在设置 gRPC API 时,我是否应该设置一个键值来将 IP 地址存储在上下文中?

【问题讨论】:

标签: go grpc grpc-go


【解决方案1】:

在 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"

【讨论】:

  • 很好的答案。它总是一个 IP 地址吗?
  • 是的,是@Yang
【解决方案2】:

在 Golang GRPC 中,上下文有 3 个值

  1. 权威

  2. 内容类型

  3. 用户代理

    md,ok:=metadata.FromIncomingContext(ctx)
    fmt.Printf("%+v%+v",md,ok)
    

【讨论】:

    【解决方案3】:

    对于grpc-gateway,可以通过x-forwarded-for获取clientIp

    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]
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 2012-03-14
      • 2012-02-16
      • 2019-01-14
      • 2019-07-12
      • 2014-12-29
      相关资源
      最近更新 更多