Soul网关第3天:体验代理Dubbo服务

939 阅读4分钟

一、为什么 soul-admin 没有下掉已离线服务

在开始今天的学习之前,先弄明白昨天遗留的问题,为什么 ping 不通的IP或者socket拒接链接的IP和端口,soul-admin 却没有主动下掉,更不会去通知网关服务在本地缓存更新代理的 http 服务地址。

1、http 服务主动注册到 soul-admin

1)启动第二个 http 服务

启动步骤:

  1. 修改配置文件中的服务端口和注册端口 8189
  2. IDEA 项目系统配置修改为允许并行启动

soul-admin 后台管理系统的 PluginList -> divide -> SelectorList 中可以看到 8189 端口。 ps:这里可以去给 Soul 提个 issue 输入框太小了展示不全 ~_~。

2)下掉 8189 端口的服务

手动下掉 8189 端口服务后,会发现 soul-admin 打印了一条 error 日志。 ERROR 71493 --- [upstream-task-2] o.d.s.a.s.impl.UpstreamCheckService : check the url=192.168.31.178:8189 is fail,然后发现后台管理系统中注册的8189 http服务下掉了,只剩下一个 8188

GET http://localhost:9195/http/order/findById?id=3 也一直转发到 8188 端口上。

这说明 soul-admin 有对注册的服务(selector)进行健康检查,并主动下掉服务。根据日志找到类UpstreamCheckService,发现是一个10秒间隔的定时任务在检查服务健康,并更新数据库和通知网关服务更新本地缓存。

至此,我们学习到了 soul-admin 会检查接入服务的健康,并主动通知网关服务下掉有问题的代理服务。

3)什么样的服务下不掉

通过 2)的测试,发现soul-admin可以主动下掉服务,那么昨天产生的问题是什么原因,什么样的接入服务下不掉呢?

继续测试,在后台管理系统的 PluginList -> divide -> SelectorList 手动添加一个不存在的 http 服务

使用 GET http://localhost:9195/http/order/findById?id=3 测试

  • 转发到地址不存在时的报错结果和日志

  • 转发到不存在服务端口的报错结果和日志

  • 转发的正常服务

以上两种错误结合 soul-admin 的 SelectorList 中依然存在两个不存在服务的配置,可以推断 soul-admin 并不会主动下线掉手工配置的 Selector (翻译成服务代理?)

为什么 http 服务自己注册到soul-admin 的可以探活,下线配置通知网关更新缓存,而通过手动在 soul-admin 中配置的却不可以?

因为探活定时任务检查的是 UpstreamCheckService#UPSTREAM_MAP,而更新它的值的 UpstreamCheckService#submit 方法的调用者都是 soul 的客户端(要注册的服务),而soul-admin手动配置接口并没有调用submit方法去更新 UPSTREAM_MAP 值。

但是探活 UpstreamCheckService#check 方法的更新逻辑是,UPSTREAM_MAP中的待检查 == 存活数直接返回不做更新。不等于时,直接将存活的配置全量更新.这就存在一个有意思的情况。

例如,正常client注册服务A、正常client注册服务B、错误手工配置服务C,因为待检查数2等于存活数2,那么错误服务c不会被下掉,但是当B服务下掉了,待检查数2不等于存活数1,要全量更新存活配置(只有A),此时不单B下掉了,C配置也下掉了。

为什么手工配置不探活两种可能:

  • 猫大人(作者)这么设计的:毕竟是网关,不是服务治理框架
  • 漏了:那么机会来了,提 issue 和 pr ,成为 soul contributor ^_^ !!!

好的,就当漏了,试着按照client端调用 UpstreamCheckService#submit 代码葫芦画瓢在 soul-admin 的添加selector 接口 /selector/{id} 里补充更新 UpstreamCheckService#UPSTREAM_MAP 的值。

ps:一顿操作issue提了,pr提了,激动的心、颤抖的手、等待回复,这里以后可以再记一笔如何提pr。

二、体验 Dubbo 代理

终于到了今天的主题,Soul 插件化的设计太棒了,敏捷的架构方便各种扩展,

1、准备工作,启动zk

启动 dubbo 服务需要注册中心,使用 zookeeper,下载一个。解压注意在 conf 目录下拷贝 zoo.cfg 添加数据目录。

# zookeeper 启动命令,默认 2181 端口
./zkServer.sh start 

2、代理 Dubbo 服务

启动 dubbo 服务(soul-example中的例子)

dubbo 服务注册到了 Soul网关上,别忘了在插件管理中打开 dubbo 插件

使用 http 请求访问网关 curl -get http://localhost:9195/dubbo/findAll 转发成功