使用正向代理从客户端到服务器的 GRPC
GRPC from client to server with forward proxy
从 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"
从 grpc-java 1.0.3 开始,您可以使用 host:port
形式的值指定环境变量 GRPC_PROXY_EXP
。 "EXP" 表示实验性的,因为它将在 grpc-java 观察到正常的 Java 设置(如 https.proxyHost
)后被删除。
在以后的版本中(我认为从 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");
如果您不想使用全局 https.proxyHost
、https.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);
从 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"
从 grpc-java 1.0.3 开始,您可以使用 host:port
形式的值指定环境变量 GRPC_PROXY_EXP
。 "EXP" 表示实验性的,因为它将在 grpc-java 观察到正常的 Java 设置(如 https.proxyHost
)后被删除。
在以后的版本中(我认为从 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");
如果您不想使用全局 https.proxyHost
、https.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);