运行项目
依次启动soul-admin,soul-bootstrap,soul-examples-apache-dubbo-service三个服务,观察apache-dubbo的日志,启动的时候就会将配置的接口注册到网关中,项目中使用@SoulDubboClient注解定义了网关要代理的路径,注解本身,是利用Spring的beanPostProcesstor特性进行加工处理,当然也可以通过控制台在页面进行操作。
依次启动soul-admin,soul-bootstrap,soul-examples-apache-dubbo-service三个服务,观察apache-dubbo的日志,启动的时候就会将配置的接口注册到网关中,项目中使用@SoulDubboClient注解定义了网关要代理的路径,注解本身,是利用Spring的beanPostProcesstor特性进行加工处理,当然也可以通过控制台在页面进行操作。
在启动过程中遇到sofa注解的接口失败的问题,debug源码的时候发现,接口在注册的时候,整体流程如下
先说原因,是因为在bootstrap中,没有打开spring cloud的相关依赖导致的,具体分析如下。
本文介绍apache dubbo插件的具体实现,在看代码之前,介绍一下dubbo插件干的活,以及dubbo插件的关键数据结构,再具体看看doExecute方法实现
dubbo插件,主要作用是用来配合使用dubbo的项目,在使用dubbo协议进行调用时候,网关也可以拦截请求进行转发,相当于为了dubbo项目做了适配,而在dubbo里面,有一个元数据的概念,里面保存了使用dubbo进行rpc的时候,双方的接口信息,所以soul在实现dubbo协议的时候,也对其元数据做了适配,以此保证rpc的正确性。
1 |
|
可以看到,插件的主要部分是进行调用接口的相关参数做处理,核心的地方在处理完成之后使用泛化调用对真实后端服务进行调用的部分,看看soul与dubbo集成时,在泛化调用的时候都做了什么
1 | public Mono<Object> genericInvoker(final String body, final MetaData metaData, final ServerWebExchange exchange) throws SoulException { |
至此网关收到客户端请求后,使用dubbo进行一次远程调用的过程就结束了,大体流程相对比较简单,在调用之前先进行参数的校验,组合处理,之后直接使用泛化调用来拿到实际结果。
1 | protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) { |
webClientPlugin
,其他的比如divide,springCloud插件,都是对当前http请求进行加工处理,处理完成交给webClientP lugin
发送。UpstreamCacheManager
是上游后端服务的缓存,divide插件处理过程中要确保此次请求的服务是存在的,才能保证后面的转发插件能正确转发请求到实际服务,因此就需要本地保存目前真实存在的后端服务,不影响性能的情况下还能确保请求转发的正确性,同时还需要发送心跳检查后端服务健康情况。1 | private UpstreamCacheManager() { |
UPSTREAM_MAP
,一个UPSTREAM_MAP_TEMP
,后者是内部实时更新,对外提供健康服务地址的缓存,前者是作为一致性检查的缓存,在进行调度的时候,根据UPSTREAM_MAP
的内容,会对UPSTREAM_MAP_TEMP
进行更新,保证每次心跳检测时两个缓存内容一致。DividePluginDataHandler
中操作的,当admin更新了后端服务地址时,通过发布订阅机制,本地的缓存会收到消息进行更新。先看看注解在哪些地方被使用了
既然是数据同步的策略,那具体的实现就应该在soul-sync-data-center中,http长轮询就应该对应soul-sync-data-http模块(soul的项目结构本身就设计的很好,并且命名规范,按照功能进行模块拆分,具体的功能点可以在对应的模块中找到,在加上阅读源码时的‘假设性原则’,定位到核心代码处更是分分钟的事情,再不济也能猜到入口,一步步debug)
这次讲解soul中使用zookeeper网关同步数据的流程,照旧参考官方文档的说明。
依赖zookeeper的 watch 机制,soul-web会监听配置的节点,soul-admin在启动的时候,会将数据全量写入 zookeeper,后续数据发生变更时,会增量更新zookeeper的节点,与此同时,soul-web 会监听配置信息的节点,一旦有信息变更时,会更新本地缓存
在soul新版本中添加了nacos的数据同步策略,大致的同步流程如下
1 | graph LR |
因为目前版本admin中的nacos数据同步,没有在启动时将数据同步到nacos中,所以目前来说,nacos数据同步方案在启动的时候需要手动进行同步,关于nacos同步策略的使用以及可能遇到的坑,可以参考Soul网关源码阅读(十六)Nacos数据同步示例运行