上篇,我们介绍了一些微服务开发调试的技巧,但是并未覆盖所有应用场景。
当环境隔离较为严重时,往往服务器上的微服务注册到nacos的地址,本机是访问不到的。
例如:微服务在docker容器中,并未暴露端口到宿主机。

【解决思路】让java程序的所有网络请求都走代理,而这个代理服务器是可以访问到其他微服务的。

安装socks代理服务

yum install 3proxy

编辑配置文件,清空后,填写以下内容
vim /etc/3proxy.cfg

#nserver 8.8.8.8
#nserver 8.8.4.4
nscache 65536
maxconn 1000
log /var/log/3proxy-%y%m%d.log D
rotate 7
external 0.0.0.0
internal 0.0.0.0
auth none
allow *
proxy -a -p6666
socks -p6667

启动
nohup 3proxy /etc/3proxy.cfg > /var/log/proxy.log 2>&1 &

测试是否成功
curl --proxy socks5://localhost:6667 https://baidu.com

修改JVM参数

给本机服务添加以下启动参数:

-DsocksProxyHost=192.168.0.66 -DsocksProxyPort=6667

将ip修改为上文搭建3proxy的可访问的服务器ip

  • 如果有openVPN,则填对应的虚拟局域网ip
  • 如果没有其他连通方式,则通过内网穿透,将6667端口穿透出来

idea启动项目添加jvm参数的方法,自行搜索,此文不赘述。

进化版

无需服务端安装代理服务,一般本地连通服务器是通过ssh,我们可以将ssh隧道转换成socks代理。

  1. 使用 SSH 创建 SOCKS 代理
    ssh -p 22 -D <local_port> <username>@<remote_host>

  2. 保持隧道连接
    如果你希望SSH隧道在后台运行并保持连接,可以加上-f(后台运行)和-N(不执行命令)选项:
    ssh -p 22 -D 1080 -f -N user@example.com
    -f:使SSH在后台运行。
    -N:表示不执行远程命令,仅建立隧道连接。
    -p: 指定ssh连接的端口

对比:
ssh的方式,优点是不需要额外的端口,服务器不需要安装其他软件。缺点是每个客户端都需要自行开启socks代理。服务端安装代理服务的方式则恰恰相反,优点是无需每个客户端的额外操作,缺点是需要安装软件和暴露额外端口