场景
今天有位朋友问了个问题,在本地IDE开发工具调试代码的时候,怎么不动代码的情况只针对部分API走proxy
,因为他们的代码只需要在本地调试的时候才要用到Proxy
,而平时都是部署在云上,是用不到Proxy
的,所以他们老大不让他们代码里出现任何用到代理的代码入侵逻辑,只能通过外置配置代理。
大概案例如下:
当Service A 调用 https://storage.googleapis.com/storage/v1/b/bucket
时才需要走代理,而调用serviceb.hk.com/xxx
时自动绕过代理。
解决方案
Oracle官方文档就有介绍如何通过VM
启动参数去进行Proxy
设置,相信大家平时也用过,大概参数如下:
- http.proxyHost (默认值:)
代理服务器的主机名或地址 - http.proxyPort(默认值:80)
代理服务器的端口号 - https.proxyHost(默认值:)
代理服务器的主机名或地址 - https.proxyPort(默认值:443)
代理服务器的端口号
但是如何针对某些API
绕过代理,Oracle官网文档还提供了另一个启动参数:
http.nonProxyHosts(默认值:localhost|127.|[::1])
表示无需通过代理即可访问的主机,这里http
和https
使用相同参数。通常这定义了内部主机。此属性的值是主机列表,由“|”分隔 特点。此外,通配符“”可用于模式匹配。例如 -Dhttp.nonProxyHosts=”*.foo.com|localhost”
将指示即使指定了代理服务器,也应直接访问 foo.com
域中的每个主机和本地主机。
因此针对上面的案例,可以在JVM启动参数加入以下配置即可:
假设代理服务器是:test.proxy.com:8080
-Dhttps.proxyHost=test.proxy.com -Dhttps.proxyPort=8080 -Dhttp.nonProxyHosts=serviceb.hk.com
还有更多其他JVM网络参数,可以参考官网文档:https://docs.oracle.com/javase/8/docs/api/java/net/doc-files/net-properties.html