利用内网穿透解决nacos内网问题

背景 Link to heading

技术栈 Link to heading

  • java
  • spring-cloud
  • nacos

办公地点 Link to heading

  • 3个不同的省市自治区

问题 Link to heading

由于开发环境部署在A市的机房中,于是其他市的开发就无法接入开发环境进行联调,特别是遇到B市的后端与C市的前端共同开发需求的情况。

核心问题其实就两个:

  1. A市外的机器要访问nacos把服务注册到nacos中
  2. 开发环境中gateway需要访问到外部的机器

解决方案 Link to heading

最后解决的时候发现,上面两个问题其实总结下来,依旧是内网穿透的问题,所以需要一个公网机器中转即可

注册nacos Link to heading

这一部分其实相对简单,因为开发过程中总要看看数据库什么的,所以很早就使用了frp进行内网穿透

frps配制,其实frps本身并没有什么特殊需要配制的东西,主要就是port和token注意一下就好

主要还是frpc部分

...
#frpc的基础部分,ip啊port啊这些就直接省略了
#增加ssh映射
[nacos]
type = tcp
local_ip = 192.168.0.15	#内网的ip地址,由于内网存在多台机器,我只需要将frpc安装在一台机器上,由此机器进行内网中转即可
local_port = 2222				#内网机器端口
use_encryption = false	
use_compression = false
# remote port listen by frps
remote_port = 150			#公网机器开发的端口

这样设置好之后,访问公网的150端口就可以访问到 192.168.0.15就可以访问15机器了

ssh -p150 root@111.111.111.111

此处可以使用 ssh -D 参数命令打开socks代理端口,由于我没有通过此方案,就没有拿到命令参数了

这里抛砖引玉一下,其实可以使用现有的一些软件,进行规则分流,比如我要访问 192.168.0.15 的时候,通过xx线路走

gateway访问外网服务 Link to heading

这个确实困扰我了好久,可以说好几个月了,主要还是以前我们这里负责的需求都是从mq里获取数据,正好不用通过gateway来转发,所以也一直没怎么上心

最近接的需求各种支付宝/微信的http异步通知,调试起来太痛苦了,前两天在看 goproxy 文档的时候,突然意识到一个问题,gateway访问我不也是一个内网穿透么?我是内网,他访问我罢了,于是反向做一个内网穿透做一个就好了

goproxy详细文档

在这里我使用了高级用法一的方案

  1. 公网机器执行
proxy bridge -p ":33080" -C proxy.crt -K proxy.key
  1. A市内网192.168.0.15机器上执行
proxy server -r ":19551@:9551" -P "111.111.111.111:33080" -C proxy.crt -K proxy.key
  1. 开发机器上执行
proxy client -P "111.111.111.111:33080" -C proxy.crt -K proxy.key
  1. 设置spring-cloud微服务启动参数
java  ... -Dspring.cloud.nacos.discovery.ip=192.168.0.15 -Dspring.cloud.nacos.discovery.port=19551 -Dspring.cloud.nacos.discovery.metadata.version=test ...
# 此处主要是修改在nacos注册时的ip/port/version
# 修改启动命令而不是配置文件,主要原因还是这个配制过于本地化了,并不通用免得不小心提交了
# idea可以直接设置vm参数来进行
# 这里的version也说明一下,主要用于与前端联调,在gateway收到请求后,会通过version向nacos获取实例,让前端与你联调时,指定verion,这样可以保证请求只会打到你个人的机器上

工作原理 Link to heading

  1. nacos上注册服务的ip/port为 192.168.0.15:19551
  2. gateway需要转发时,问nacos拿到的ip/port为192.168.0.15:19551
  3. 由于已经架设了proxy于是向192.168.0.15:19551地址发送的请求,都被proxy转发到了111.111.111.111:33080地址
  4. 111.111.111.111上的proxy bridge会看有哪些的client
  5. 111.111.111.111将内网的请求转发到client
  6. client收到请求后,由于设置了":19551@:9551",于是client把请求转发到本地9551接口上

至此功能完成