在上一篇中,我介绍了soul框架的概述、罗列了支持的功能、使用到的技术,并通过启动soul-admin模块和soul-bootstrap模块,通过管理控制台中展示的功能直观的感受了soul网关自带的丰富功能,这一篇,我们通过运行soul自带的例子程序soul-example模块中的soul-example-http,从使用者的角度体验soul是如何处理并转发http请求的。
下面先来看看浏览器直接发起请求到后台,没使用soul的场景,如下图:
这个场景非常简单,就是我们平时经常使用的单体应用,下面实验开始,运行SoulTestHttpApplication类启动soul-examples-http,应用监听端口为8188,如下配置所示
server:
port: 8188
address: 0.0.0.0
下面用postman模拟浏览器发起get请求,通过HttpTestController可以看到,此springBoot应用HttpTestController的访问域为/test,如下图所示
以findByUserId接口为例,postman的请求地址为http://localhost:8188/test/findByUserId?userId=3,如下图所示,正常返回结果:
接下来实验加上soul网关转发后,这个get请求发生的变化,首先看看加上soul之后请求的链路发生的变化,如下图所示:
可以看到,加上soul后,预期会在启动Spring Boot应用时,会往Soul Admin中写入应用提供的服务的配置信息,同时,浏览器端的请求,将不会直接发送到后台应用,会经过soul进行转发后再到达后台服务,下面我们验证这个结论
一、先确保soul-examples-http应用是否已添加了soul的支持,包括以下两个配置:
soul:
http:
adminUrl: http://localhost:9095
port: 8188
contextPath: /http
appName: http
full: false
org.dromara
soul-spring-boot-starter-client-springmvc
${soul.version}
二、重新运行SoulTestHttpApplication类启动soul-examples-http应用,观察启动日志,如下:
2021-01-15 23:57:38.822 INFO 53228 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils : http client register success: {"appName":"http","context":"/http","path":"/http/test/**","pathDesc":"","rpcType":"http","host":"192.168.137.1","port":8188,"ruleName":"/http/test/**","enabled":true,"registerMetaData":false}
2021-01-15 23:57:38.842 INFO 53228 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils : http client register success: {"appName":"http","context":"/http","path":"/http/order/save","pathDesc":"Save order","rpcType":"http","host":"192.168.137.1","port":8188,"ruleName":"/http/order/save","enabled":true,"registerMetaData":false}
2021-01-15 23:57:38.858 INFO 53228 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils : http client register success: {"appName":"http","context":"/http","path":"/http/order/path/**","pathDesc":"","rpcType":"http","host":"192.168.137.1","port":8188,"ruleName":"/http/order/path/**","enabled":true,"registerMetaData":false}
2021-01-15 23:57:38.874 INFO 53228 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils : http client register success: {"appName":"http","context":"/http","path":"/http/order/path/**/name","pathDesc":"","rpcType":"http","host":"192.168.137.1","port":8188,"ruleName":"/http/order/path/**/name","enabled":true,"registerMetaData":false}
2021-01-15 23:57:38.890 INFO 53228 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils : http client register success: {"appName":"http","context":"/http","path":"/http/order/findById","pathDesc":"Find by id","rpcType":"http","host":"192.168.137.1","port":8188,"ruleName":"/http/order/findById","enabled":true,"registerMetaData":false}
2021-01-15 23:57:40.876 INFO 53228 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port(s): 8188
从启动日志中“http client register success”的日志描述,可以看到应用启动时确实会将提供服务的接口信息进行注册,接下来登录管理控制台看看配置是否更新上去,访问http://localhost:9095/#/plug/divide地址,在“插件列表”-“divide”中确实看到此服务注册的接口信息,如下图所示:
下面我们再次访问findByUserId接口,这次我们改为通过soul转发的方式访问,那通过postman发起请求时,地址应该如何写呢,我们先回想一下启动soul-bootstrap时配置的端口,如下:
server:
port: 9195
address: 0.0.0.0
从中可以看出,soup的端口是9195,所以访问地址必然包括http://localhost:9195,再分析一下为了让soul-examples-http应用集成soul加上的配置,如下:
可以看到这里指定了后台8188端口提供的服务的命名空间为/http,故我们要访问后台服务的findByUserId接口,完整的url应该为http://localhost:9195/http/test/findByUserId?userId=3,请求结果如下图所示,可以看到,经过soul转发后的请求,得到了和直接访问后台同样的结果:
观察soul-bootstrap应用日志,看到有以下日志输出:
2021-01-16 01:17:57.128 INFO 46904 --- [-work-threads-8] o.d.soul.plugin.base.AbstractSoulPlugin : divide selector success match , selector name :/http
2021-01-16 01:17:57.128 INFO 46904 --- [-work-threads-8] o.d.soul.plugin.base.AbstractSoulPlugin : divide selector success match , selector name :/http/test/**
2021-01-16 01:17:57.128 INFO 46904 --- [-work-threads-8] o.d.s.plugin.httpclient.WebClientPlugin : The request urlPath is http://192.168.137.1:8188/test/findByUserId?userId=3, retryTimes is 0
从日志中可以看出,soul在收到请求报文后,根据管理控制台上配置的拦截规则,对请求的url做了处理,并将请求的url处理成访问后台系统的url http://192.168.137.1:8188/test/findByUserId?userId=3转发到后台系统
总结
soul官方介绍
芋道soul极简入门
极客时间Java进阶训练营Soul网关介绍