You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shenyu.apache.org by Shi Jubo <je...@hotmail.com> on 2022/03/23 06:18:24 UTC

PR#3100说明

各位大佬好!

针对PR#3100(Fixes #3017<https://github.com/apache/incubator-shenyu/issues/3017> )说明如下,请抽空review代码。感谢!

现有服务注册及注销处理逻及存在的问题:

1、 对于使用注册中心,有服务启停时,注册处理时会从注册中心查询所有可用服务,发布事件消息进行服务注册。

2、 对于使用http注册,有服务启停时,只能对该服务发布事件消息进行注册处理。

3、 事件订阅方不确定服务注册方式。服务注册时,对事件消息中的服务列表进行处理,查询DB中服务列表,将事件消息中的服务列表与DB中的服务列表比较,将前者中不存在的服务添加到后者,达到服务注册的目的。但已停止的服务,没有从DB列表中移除,如果有服务下线,网关仍会将请求发往该节点。

4、 http注册方式,服务下线后,依赖心跳检查发现服务不可用,然后从上游服务列表中移除。存在移除不及时导致网关将请求发往已停机节点。

修改说明:
1、http服务停止时主动注销,EventType=DELETED。http注册和使用注册中心注册区分处理。
2、为上游服务设置有效状态,服务注册时,根据事件消息中的服务列表,设置DB中服务列表的状态,并记录服务状态变更时间。服务注销时设置服务状态不可用。服务变化、admin启动时,会移除超过1小时不可用的服务,避免僵尸服务一直存在于DB中。
3、将新增服务、状态发生变化的服务,交给http注册器处理。
4、如果是http注册方式,http注册器根据服务状态将服务添加到服务列表,或者从服务列表移除,然后更新DB并向服务列表缓存发起同步。服务注册处理结束。
5、非http注册方式继续处理。如果是服务注销,从DB服务列表中移除该服务做为可用服务列表(目前非http注册方式不存在此种情况,保留逻辑,可以去除),否则用事件消息中的服务做为可用服务列表。根据可用服列表和DB服务列表,生成最终服务列表,更新DB并向服务列表缓存发起同步。