Soul(shenyu)網關-探活機制


 探活模塊

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方式同步數據


 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM