【问题标题】:GRPC from client to server with forward proxy使用转发代理从客户端到服务器的 GRPC
【发布时间】:2017-09-18 21:04:46
【问题描述】:

使用 nodejs 或 java 中的 grpc,让 grpc 客户端通过代理连接到服务器所需的属性或配置是什么?

我找不到解释设置的示例或文档。我需要在代码本身中做些什么吗?

我使用代理,我不确定问题是我的设置不正确还是我的代理不支持 grpc。它支持 http/2 作为协议升级。

我在 java 中的代理设置是:

-Dhttp.proxyHost=xxx.xxx.xxx
-Dhttp.proxyPort=8888 
-Dhttp.nonProxyHosts="*.nowhere.nothing"
-Dhttps.proxyHost=xxx.xxx.com
-Dhttps.proxyPort=8888
-Dhttps.nonProxyHosts="*.nowhere.nothing"
-Dsocks.proxyHost=xxx.xxx.xxx
-Dsocks.proxyPort=8888
-Dsocks.nonProxyHosts="*.nowhere.nothing"

【问题讨论】:

    标签: java node.js proxy grpc


    【解决方案1】:

    从 grpc-java 1.0.3 开始,您可以使用 host:port 形式的值指定环境变量 GRPC_PROXY_EXP。 “EXP”表示实验性的,因为它将在 grpc-java 观察到正常的 Java 设置(如 https.proxyHost)后被删除。

    【讨论】:

      【解决方案2】:

      如果您不想使用全局https.proxyHosthttps.proxyPort 属性,您可以使用客户端的StubSettings 来指定ChannelConfigurator。它可能看起来像这样:

      InetSocketAddress proxyAddress = new InetSocketAddress("my.proxy.local", 8080);
      InstantiatingGrpcChannelProvider transportProvider = SessionsStubSettings.defaultGrpcTransportProviderBuilder()
          .setChannelConfigurator(new ApiFunction<ManagedChannelBuilder, ManagedChannelBuilder>() {
              @Override
              public ManagedChannelBuilder apply(ManagedChannelBuilder input) {
                  return input.proxyDetector(new ProxyDetector() {
                      @Override
                      public ProxiedSocketAddress proxyFor(SocketAddress targetServerAddress) throws IOException {
                          if (!(targetServerAddress instanceof InetSocketAddress) || targetServerAddress == null) {
                              return null;
                          } 
                          return HttpConnectProxiedSocketAddress.newBuilder()
                              .setTargetAddress((InetSocketAddress) targetServerAddress)
                              .setProxyAddress(proxyAddress)
                              .build();
                          }
                      });
                  }
          })
          .build();
      

      然后您可以使用下面的stubSettings 创建您的 GRPC 客户端:

      
      stubSettings = XYZStubSettings.newBuilder().setTransportChannelProvider(transportProvider);
      
      

      【讨论】:

      • 我如何知道代理是否正常工作?检查代理服务器中的日志?有没有在客户端检查这个?
      【解决方案3】:

      在以后的版本中(我认为自 1.8.0+ 起)你需要:

      System.setProperty("http.proxyHost", "http-ip-address-hostname");
      System.setProperty("http.proxyPort", "http-port-value");    
      System.setProperty("https.proxyHost", "https-ip-address-hostname");
      System.setProperty("https.proxyPort", "https-port-value");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-09
        • 2013-10-08
        • 2020-10-13
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 2017-04-21
        • 1970-01-01
        相关资源
        最近更新 更多