网络代理
yue-library提供对Java全局网络代理的便捷配置,与代理服务器信息获取,优雅解决内网服务器环境的服务通信难题。
知识提要
代理服务器推荐使用:squid或socks代理服务器
Java全局代理配置对部分SDK不生效,已知需要单独处理的jar包有:
- aliyun-java-sdk-core(阿里云短信等)
代理服务器配置
重要说明:yue-library提供的是代理服务器配置,而非代理协议配置。
- 配置HTTP代理服务器可代理HTTP协议
- 配置HTTPS代理服务器可代理HTTPS协议
- 配置FTP代理服务器可代理FTP协议
- 配置SOCKS代理服务器可代理HTTP、HTTPS、FTP、SOCKET协议
yue:
net:
proxy:
enabled: true # 启用Java全局网络代理自动配置(此项值为true,下面的配置才会生效)
# 配置HTTP代理服务器
http-server-enabled: true # 启用HTTP代理服务器进行HTTP请求代理访问
http-server-host: 127.0.0.1 # HTTP代理服务器Host
http-server-port: 80 # HTTP代理服务器Port
# 配置HTTPS代理服务器
https-server-enabled: true # 启用HTTPS代理服务器进行HTTPS请求代理访问
https-server-host: 127.0.0.1 # HTTPS代理服务器Host
https-server-port: 443 # HTTPS代理服务器Port
# 配置FTP代理服务器
ftp-server-enabled: true # 启用FTP代理服务器进行FTP请求代理访问
ftp-server-host: 127.0.0.1 # FTP代理服务器Port
ftp-server-port: 80 # FTP代理服务器Port
# 配置SOCKS代理服务器
socks-server-enabled: true # 启用SOCKS代理服务器进行HTTP、HTTPS、FTP、SOCKET请求代理访问
socks-server-host: 127.0.0.1 # SOCKS代理服务器Host
socks-server-port: 1080 # SOCKS代理服务器Port
socks-proxy-version: 5 # SOCKS代理协议版本
# 更多配置
non-proxy-hosts: localhost|127.*|[::1]|0.0.0.0|[::0] # 忽略代理地址,适用于发起HTTP、HTTPS、FTP、SOCKET请求时不进行代理访问(优先级高于其它配置)
non-proxy-hosts-additional: ai.ylyue.cn|*.ylyue.cn # 额外忽略地址(适用于不想覆盖默认值进行配置)
basic-authenticator-username: ylyue # 使用Basic认证方式,连接代理服务器的username
basic-authenticator-password: ylyue # 使用Basic认证方式,连接代理服务器的password
更多功能
参考上述示例对代理服务器进行配置之后,即可实现Java全局网络代理,但如果还有更多特殊需求,可以结合下面提供的方法实现需求。
使用系统代理: 在Windows系统、macOS系统和Gnome系统上,可以告诉java.net堆栈,将该属性设置为true,以使用系统代理设置(这两个系统都允许通过它们的用户界面全局设置代理)。注意,此属性只在启动时检查一次。
public static void main(String[] args) throws Exception {
NetProxy.useSystemProxies();// 使用系统代理需要在项目启动之前进行设置
SpringApplication.run(TestApplication.class, args);
}
动态开启与关闭全局代理
@Autowired
NetProxy netProxy;
public void use() {
netProxy.httpServerEnable();
netProxy.httpServerClose();
netProxy.socksServerEnable();
netProxy.socksServerClose();
// https、ftp ...
}
获取代理配置
@Autowired
NetProxyProperties netProxyProperties;
public void getProxyConfig() {
netProxyProperties.getSocksServerHost();
netProxyProperties.getSocksServerPort();
netProxyProperties.getSocksProxyVersion();
netProxyProperties.getNonProxyHosts();
netProxyProperties.getNonProxyHostsAdditional();
netProxyProperties.getBasicAuthenticatorUsername();
netProxyProperties.getBasicAuthenticatorPassword();
// http、https、ftp ...
}
帮助
Java全局网络代理知识
Java Networking and Proxies
Networking Properties
ProxySelector
阿里云代理配置
HttpClientConfig config = HttpClientConfig.getDefault();
config.setHttpProxy("http://ylyue:80");
config.setHttpsProxy("http://ylyue:80");
profile.setHttpClientConfig(config);
aliyun-spring-boot SMS Example
代理配置参考1
代理配置参考2
Docker网络代理
docker网络代理分为 docker自身网络代理配置 和 docker容器内部网络代理配置,这两点很容易让人混淆,区别如下:
docker自身网络代理
- 如:
docker pull
命令
docker容器内部网络代理
- 如:
docker exec
进入容器内部之后使用curl
命令(curl
命令默认开启系统代理,即配置docker容器网络代理) - 如:容器内部运行的
java -jar
程序(Java程序默认不使用系统代理,需手动开启)
Linux网络代理
环境变量 | 描述 | 值示例 |
---|---|---|
http_proxy | 为http变量设置代理,不填开头默认以http协议传输 | 10.20.56.32:8000 user:pass@192.168.31.10:8080 socks5://10.20.48.254:1080 |
https_proxy | 为http变量设置代理 | 同上 |
ftp_proxy | 为http变量设置代理 | 同上 |
socket_proxy | 为http变量设置代理 | 同上 |
all_proxy | 全局变量设置代理,配置了这个变量,上面的就不要设置了。 | 同上 |
no_proxy | 1、无需代理的主机名或域名; 2、不支持使用通配符 * 以及网络范围(CIDR)表示法;3、多个的时候,使用 , 号分割; | www.baidu.com,192.168.3.29,localhost,127.0.0.1,0.0.0.0 |
注意: no_proxy并不支持使用通配符
*
以及网络范围(CIDR)表示法,故此以下示例中采用穷举法列举IP。
vi /etc/profile
export all_proxy=192.168.0.2:3128 # 代理服务器地址及认证信息
no_proxy_local=localhost,127.0.0.1,0.0.0.0,10.0.0.0/8
no_proxy_1=192.168.3.1
no_proxy_2=$(echo 192.168.0.{65..69} | sed 's/ /,/g')
no_proxy_3=$(echo 10.15.65.{90..110} | sed 's/ /,/g')
export no_proxy=${no_proxy_local},${no_proxy_1},${no_proxy_2},${no_proxy_3} # 不需要代理的IP
source /etc/profile && curl www.baidu.com
结语
解决自身项目中的Java网络代理问题,可以选择按照上面介绍的使用方式依赖yue-library-base
模块,或者参考yue-library的实现把相关代码搬运到自身项目中,解决网络代理问题。注意不代理配置一定要配置哦,减少不必要的网络开销。