在实际开发过程中,Webservice是实现各个编程语言和操作系统无障碍交互一种常用方式,Webservice采用Soap协议(HTTP+XML),可以通过SoapUI开源软件或者浏览器直接进行接口服务的测试。但是通常系统交互需要面临网络问题,内网开放的Webservice服务无法在外网环境下调试,Ngrok+Ngnix提供了一种针对Webservice的解决策略。
理解 Ngrok反向代理
Ngrok内网穿透,通过Ngrok反向代理可以把内网服务暴露给公网Ngrok服务端,从而实现局域网服务->Ngrok客户端->公网Ngrok服务端(vps域名)->请求客户端的服务隧道。Ngrok客户端机器需要内外双通,网络链路如下:
Ngrok配置
在已经搭建好的Ngrok服务端的前提下,我们需要起Ngrok的客户端服务,这里提供一个已经编辑好的Ngrok包:
我们可以通过ngrok.config配置我们的隧道,all.bat启动隧道(windows环境下)
ngrok.config内容如下:1
2
3
4
5
6
7
8server_addr: ngrok.yuantutech.com:9002 /**ngrok服务端IP端口公网**/
trust_host_root_certs: false
inspect_addr: disabled
tunnels:
guahao: /**定义隧道名**/
proto:
tcp: localhost:3389 /**内网服务IP端口**/
remote_port: 40010 /**ngrok服务端分配TCP连接端口**/
all.bat配置启动项内容如下:1
ngrok -config=ngrok.config start guahao /**启动对应的隧道,可叠加**/
Nginx subfilter替换规则
理解 Nginx
Nginx多用户负载均衡(正向代理)配置,在高并发场景下通过nginx负载到多个集群进行请求的分流,同时在多个集群节点的情况下可以灵活配置切换(灰度发布),保证服务的高可用。Nginx也可以用于反向代理,同时可以对转发接收的报文进行过滤处理,通常我们需要替换报文中某个特定的字段可以通过Nginx的subfilter组件进行过滤。
Ngnix subfilter配置
打开ngnix包中conf文件夹下的ngnix.conf文件编辑进行配置:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;/**设置ngnix响应超时时间**/
server {
listen 8002; /**nginx服务监听端口**/
server_name localhost; /**nginx服务IP**/
location / { /**理解为JAVA拦截器,对所有路由进行拦截处理**/
root html;
index index.html index.htm;
sub_filter '172.100.100.1' 'ngrok.yuantutech.com';
/**接收到的报文进行过滤处理,左边为需要被替换的部分**/
sub_filter_once off;
/**替换多次**/
sub_filter_types text/xml;
/**只替换文本文件,不替换二进制流**/
proxy_set_header Accept-Encoding "";
/**指定ngnix可以接收的类型,接收的二进制流可以转化为文本处理**/
proxy_pass http://ngrok.yuantutech.com;
/**反向代理的服务器**/
}
}
}
搭建Webservice服务隧道
Webservice搭建在内网的情况下需要建立外网到内网的服务隧道,在实际开发中还是尤为重要的。这里需要介绍一下Webservice在程序中的加载原理:
Webservice wsdl解释文件
这边是我在搭建完ngrok+nginx服务隧道之后本地访问到的Webservice解释文件,可以看到解释文件中server address是我们ngrok服务端的转发IP端口,是我们通过nginx subfilter替换的结果,这个解释文件可以在程序里正常加载。也是我们请求实际的目的地址,如果不进行替换,我们接收到的解释文件对应的局域网ip端口我们在公网是无法访问到的。
服务隧道请求流程图
总结:
程序中默认加载的是Webservice wsdl解释文件的目标地址,通过nginx的subfilter可以将其替换为ngrok代理出来的公网地址。其实这里也可以直接将xml作为静态文件发布到自己本地的tomcat下,将地址修改为任意想要的目标地址(还是很实用的)。程序是没有思维的,这里是不是应该赞一波程序员,人工智能慢慢来吧。