首页 > 技术文章 > Soul(shenyu)网关-探活机制

sewell 2021-08-31 21:14 原文

 探活模块

shenyu网关对服务的活跃探测,避免将请求转发到失活的机器上面,并在给定次数的失败探测时候,将服务下线。

shenyu网关包含的活体探测点

  • SoulAdmin对服务机的活体检测

 

SoulAdmin对下游服务探活

在websocket的时候,进行服务数据的注册,并将服务器的数据ip等放置在各个selector当中,保存在数据库。之后在类UpstreamCheckService当中,对这些注册的服务器进行探活。

启动

  • 参数初始化

    • 在初始化组件UpstreamCheckService时,会初始化几个探活参数,checked:是否进行探活,zombieCheckTimes:僵尸服务检测次数(在一次探测失败后,判定为僵尸服务,再进行四次探测,如果依旧失败,则从服务器列表移除) scheduledTime:探测间隔时间:默认10s  调用setup()方法,进行定时探活的开启
  • 启动定时线程

    • 转存失败重新上传取消
      判断如果开启探活的话,则查找出所有组件下的selector,并且获取其中所有的服务信息,将服务信息按照,selectorname为key,服务列表为value的map中,此时开启一个核心线程数为souladmin所在服务器的处理器核数,线程前缀为scheduled-upstream-task,延时10s且每10s执行一次scheduled()方法的定时线程池

定时任务

  • scheduled()方法


    ZOMBIE_SET:僵尸服务列表
    UPSTREAM_MAP:服务列表
    checkZombie:检查僵尸服务
    check:检查所有服务
    首次进入时,僵尸服务列表为空,所以先看check()方法

  • 遍历所有服务,进行连通性检查,使用方法checkUrl()


    这里判断,如果使用http或者https的话,获取ip+端口,如果没有端口,则根据协议判断443或者80
    checkIP检验ip的格式,isHostConnector和isHostReachable检查联通


    InetAddress.getByName:在给定主机名的情况下确定主机的IP地址,如果参数为null,获得的是本机的IP地址
    isReachable:发送及监听ICMP包
  • 如果连通成功,则回到check方法,修改服务状态,如果连通失败,修改服务状态,并且添加到僵尸服务Set集合当中
  • 更新处理器updateHandler



    重新设置UPSTREAM_MAP,只将连通的放置进去,并且更新数据库,并通过publishEvent发布到各个监听服务当中

 

SoulBootstrap-websocket同步,探测同步对象(对soul-admin群探活)

soulbootstrap启用websocket向souladmin同步数据,会启动探活程序


  • 在配置文件中配置websocket方式同步数据时,配置urls,spring启动时调用WebsocketSyncDataService的构造器


  • 将会开启一个以urls的服务数量为大小的定时线程
    在启动websocket连接后,将所有的soul-admin的websocket连接添加到clients集合当中
    遍历clients,各开启一条线程,进行活跃性的探测,如果client的状态为关闭,则进行重连,并打印日志,如果为未关闭,则发送ping,进行探测,每10s执行一次。

 

 

 

Divide插件对下游服务的探活

divide插件用于对请求的分发,此处探活默认关闭,需要在启动参数设置开启,探活用于对下游服务的活跃性检测,减少分发到非活跃服务的次数

  • 在UpstreamCacheManager类的初始化时,会调用其构造器,在构造器中,开启对下游服务的探活


    开启核心线程数为1,延迟30s,并且每30s执行一次scheduled方法的定时线程池。
  • 调用scheduled方法


    对UPSTREAM_MAP里面所有的服务进行探活,并将所有活跃的服务放置到UPSTREAM_MAP_TEMP当中。


其他使用到探活机制的还有

Soul-admin:http长轮训,数据变化监听,更新本地缓存

consul方式同步数据


 


推荐阅读