预期目标
- 运行examples下面的 http服务
- 学习文档,结合divde插件,发起http请求soul网关,体验http代理
- 记录心得并总结
http服务的发现与注册
demo
启动soul-admin以及soul-bootstrap后打开控制台,发现divide插件默认开启,但是selectorList和pluginList是空。但是如果启动soul-examples-http
下的测试实例,会发现selectorList和pluginList会自动添加配置好的selector和rule, 结果如下:
那么新启动的http服务是如何被soul-admin发现并注册呢?
源码追踪
我们可以看到SoulTestHttpApplication
控制台中打印出的日志如下:
说明在启动阶段会http client会自动注册相关的服务到soul-admin, 通过打断点我们发现其实在RegisterUtils
中通过doRegister
方法调用OkHttpClient向http://localhost:9095/soul-client/springmvc-register
post相应的selector和rule,同时在soul-admin中调用soulClientRegisterService
将要注册服务的元数据存储在本地mysql数据库。如果我们查看rule_condition
表会发现以下数据:
说明soul-admin已经将http服务中的相关信息已经持久化到数据库。
但是doRegister
方法是如何被调用已经相关服务方法是如何被soul-admin感知呢?
我们在示例项目中的controller中会发现这样的注解@SoulSpringMvcClient
,这就意味着soul网关会自动扫描该注解,并将其添加到我们的规则中:
@SoulSpringMvcClient(path = "/test/**")
@SoulSpringMvcClient(path = "/order")
@SoulSpringMvcClient(path = "/save" , desc = "Save order")
....
同时在实例项目的application.yml中写上相应的配置:
soul:
http:
adminUrl: http://localhost:9095 //目标soul-admin的url
port: 8188 // 本应用的端口号
contextPath: /http // 路由前缀名
appName: http // 本应用的名称
full: false
这样就能保证相关http服务能够被soul-admin感知并发现。
如果我们接着追踪,会发现在org.dromara.soul.client.springmvc.init
包下的SpringMvcClientBeanPostProcessor
覆写了postProcessAfterInitialization
并调用doRegister
方法
同时在buildJsonParams
方法中对路由进行拼接并转换成json String, 最后被post到soul-admin的soul-client/springmvc-register
endpoint.
测试网关
我们使用示例方法中的findByUserId
对网关进行测试。使用网关访问http://127.0.0.1:9195/http/test/findByUserId?userId=123456
, 在SoulBootstrapApplication控制台看到以下日志:
根据日志我们可以定位到org.dromara.soul.plugin.httpclient
包中的execute
方法,将路由进行拆解,提取并转发到对应的http服务。
总结
- http服务的发现与注册:
- 如果http服务是SpringWeb,SpringBoot, 或者SpringCloud项目, 可以通过
@SoulSpringMvcClient
注解并且在配置文件中配置soul网关的相关信息即可实现服务的发现与注册,并且在soul-admin中显示出来。 - 如果是非java项目,可以直接在soul-admin中手动天界selector以及相关的rule
- 如果http服务是SpringWeb,SpringBoot, 或者SpringCloud项目, 可以通过
- selector,rule的匹配以及路由转发
- 目前是由
WebClientPlugin
来handle路由转发,但具体soul网关是如何调用AbstractSoulPlugin
以及SoulPluginChain
是如何被handle需要进一步探索。
- 目前是由