最近每个人都在家办公,公司项目是微服务的,一个人负责一个小服务,而且每个人都不在同一个局域网内,公司有一个云服务器(部署nacos),一开始大家都把自己负责的服务都注册到nacos上(作为服务注册和服务发现已经配置中心),大家都能注册,当前端人员来联调的时候出问题了,由于网关也是其中一个局域网注册上去的,前端人员需要通过网关来调取各个服务,但是网关是局域网,怎么办?这个简单,我们把注册网关的本地服务做一个内网穿透不就可以了,开始干。。。
通过一整捣鼓,注册网关的同事成功把他本地的网关端口映射到域名上面了,前端同事可以通过该域名成功访问到网关,但是很快新的问题出现了,当前端同事访问订单服务想获取订单信息时,访问不到,但是负责订单服务的同事已经把订单服务注册到云服务的nacos上去了,而且可以保证服务没有问题。
原来网关服务和订单服务不在同一个局域网内,网关服务和订单服务是不互通的,因为服务注册到nacos上面时是自动获取本地的内网ip作为服务发现的地址的,那么另一个服务去访问这个局域网地址肯定是不通的,那怎么办呢?想办法。。。
第一想法还是内网穿透,只有把所有局域网的服务都通过内网穿透的方式映射出去,让外网能够访问才可以。通过查看nacos官网的配置参数,终于找到了突破口。
在服务注册时配置服务发现的ip和port,也就是访问服务时的ip和端口,具体配置内容:
上图的ip和port就是我们重点需要配置的内容,服务发现是通过这个ip和端口访问我们服务的,如果这两项不配置,服务注册时会自动获取我们的局域网ip作为服务发现的ip。
既然知道怎么解决了,那就简单了,我们只要想办法让外网都能够访问到这个ip就可以了。
回过头来还是内网穿透。。。。。
在百度上上了很久,很多种内网穿透,都是将本地的某个端口映射到域名上面,但是我们需要的是一个外网能够访问的ip和端口,显然这样不满足我们的需求。当然用域名也可以,一开始没有找到frp时,我就考虑用域名的方式,配置如下即可:
weisn.4kb.cn 是我内网穿透的域名,域名映射的端口是我服务的端口7803
以上是我通过 ngrok 内网穿透将我的服务端口映射到我的域名上面去,这样其他服务访问我这个服务时,就可以通过这个域名访问到我了。
但是这样不好的一个地方就是每个服务都需要有一个内网穿透的域名,不过这个也是成本最低的,个人没有云服务器公网ip也能用。
接下来我们开始用frp内网穿透,通过一个公网ip 和端口的配置,映射到我们不同的局域网,使不同的局域网都在同一个公网ip内互通。
由于我的云服务是linux,我本地是Windows所以我要下载对应的两个版本。
不管是linux还是Windows都需要注意系统的位数。Windows怎么看位数我就不讲了,这是每个程序员都应该知道的。
getconf LONG_BIT
可以先下载到自己电脑,然后上传到linux系统上解压,或者使用linux命令直接在linux上下载:
可以通过右击复制连接加上命令 wget 下载
wget https://github.com/fatedier/frp/releases/download/v0.43.0/frp_0.43.0_linux_amd64.tar.gz
tar -xvf frp_0.43.0_linux_amd64.tar.gz
重命名为frp,然后cd 进frp目录
你会看见有frps 和frpc 两种文件,frps就是服务端文件,frpc 就是客户端的文件,因为我们这里是部署服务端,所以为了不混淆你可以把frpc相关的文件删了。下面是我删了之后剩余的服务端相关的文件。
可以进入frps.ini 文件看一下,新版本里面配置很简单,就两行代码。
7000 就是frp服务端的端口,客户端来连接时就是连接这个端口,可以任意改,这里我们就默认不改了。
nohup ./frps -c ./frps.ini &
nohup 是日志文件,frps是服务端的启动文件,frps.ini 是服务端的配置文件,& 代表后台运行
如上图说明启动成功,这里我已经配置几个客户端的监听端口
至此,linux服务端安装frp已经启动完成。
下载好之后直接解压,解压后的目录如下
其实文件和linux的一样,但是这里我们只是安装客户端,也就是frpc相关的文件,我们可以把服务端相关的文件删了,最后是这样的。
我们可以用记事本打开frpc.ini文件看一下
一开始是这样的,下面解读一下各个配置的含义
[common]
server_addr: 这个就是我们公网ip的地址,默认是127.0.0.1,我们需要换成我们公网ip一致,
server_port:这个是我们公网监听的端口,也就是我们linux上面启动frps时监听的端口,这里默认是7000,如果我们启动frp服务端时没有修改这里也就不用改了。
[ssh]
type:连接类型有tcp,http,https,udp等。
local_ip:本地ip
local_port:监听的本地端口
remote_port: 服务器的端口,ssh连接时的端口,例如:这里是6000,我们访问公网ip+6000,就会访问到我们本地的local_port端口上。
默认配置:
[common]
server_addr = 127.0.0.1
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
这里启动不能直接双击frpc.exe启动,而是通过cmd控制台进到这个目录下面,
这样我们Windows安装frp客户端和启动就好了。
这样我们访问公网ip+6000端口是不是就可以访问我们本地的22端口了呢?
答案是还不能,因为你服务器还没有放开相关的端口,我们只要进到服务器的控制台,放开相关的端口即可。
7000端口是一定要放开的,也就是你的frps启动监听的端口,如果你改了就放开对应的端口即可,同时还要放开你客户端监听的转发端口,也就是上面我们说的remote_port 配置的端口,默认是6000。
我这里放开我们本地服务所有的端口。
如果你服务器内有开防火墙的记得也放开相应的端口。
到这里,整个frp内网穿透就可以了。接下来我们就要配置我们nacos微服务的各个服务ip和地址了。
谁负责哪个服务,谁就启动frp客户端监听他本地的端口,我这里启动了下面这些服务
7800 是我的网关端口,我在服务器上面也放开了7800端口,
这样当前端的同事访问服务器的7800端口时,服务器就会转发到我们本地的7800端口,这样就可以进我的网关服务了,那么项目里面的网关服务注册配置怎么配置呢?
port配置的是frp的remote_port端口。
这样我们启动项目注册到nacos上面之后,服务的ip和端口就变成我们这是的公网ip和端口了,当其他服务或者前端同事访问这个公网ip和端口时就会访问到我们本地的服务了
好了,今天的内容就到了,有什么不懂的可以随时私我,有不对的地方欢迎指点修改。