API網關如何實現對服務下線實時感知

上篇文章《Eureka 緩存機制》介紹了Eureka的緩存機制,相信大家對Eureka 有了進一步的了解,本文將詳細介紹API網關如何實現服務下線的實時感知。

一、前言

在基于云的微服務應用中,服務實例的網絡位置都是動態分配的。而且由于自動伸縮、故障和升級,服務實例會經常動態改變。因此,客戶端代碼需要使用更加復雜的服務發現機制。

目前服務發現主要有兩種模式:客戶端發現和服務端發現。

  • 服務端發現:客戶端通過負載均衡器向服務注冊中心發起請求,負載均衡器查詢服務注冊中心,將每個請求路由到可用的服務實例上。
  • 客戶端發現:客戶端負責決定可用服務實例的網絡地址,并且在集群中對請求負載均衡, 客戶端訪問服務登記表,也就是一個可用服務的數據庫,然后客戶端使用一種負載均衡算法選擇一個可用的服務實例然后發起請求。

客戶端發現相對于服務端發現最大的區別是:客戶端知道(緩存)可用服務注冊表信息。如果Client端緩存沒能從服務端及時更新的話,可能出現Client 與 服務端緩存數據不一致的情況。

二、網關與Eureka結合使用

Netflix OSS 提供了一個客戶端服務發現的好例子。Eureka Server 為注冊中心,Zuul 相對于Eureka Server來說是Eureka Client,Zuul 會把 Eureka Server 端服務列表緩存到本地,并以定時任務的形式更新服務列表,同時zuul通過本地列表發現其它服務,使用Ribbon實現客戶端負載均衡。

API網關如何實現對服務下線實時感知

正常情況下,調用方對網關發起請求即刻能得到響應。但是當對生產者做縮容、下線、升級的情況下,由于Eureka這種多級緩存的設計結構和定時更新的機制,LoadBalance 端的服務列表B存在更新不及時的情況(由上篇文章《Eureka 緩存機制》可知,服務消費者最長感知時間將無限趨近240s),如果這時消費者對網關發起請求,LoadBalance 會對一個已經不存在的服務發起請求,請求是會超時的。

三、解決方案

3.1 實現思路

生產者下線后,最先得到感知的是 Eureka Server 中的 readWriteCacheMap,最后得到感知的是網關核心中的 LoadBalance。但是 loadBalance 對生產者的發現是在 loadBalance 本地維護的列表中。

所以要想達到網關對生產者下線的實時感知,可以這樣做:首先生產者或者部署平臺主動通知 Eureka Server, 然后跳過 Eureka 多級緩存之間的更新時間,直接通知 Zuul 中的 Eureka Client,最后將 Eureka Client 中的服務列表更新到 Ribbon 中。

但是如果下線通知的邏輯代碼放在生產者中,會造成代碼污染、語言差異等問題。

借用一句名言:

“計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決”

API網關如何實現對服務下線實時感知

Gateway-SynchSpeed 相當于一個代理服務,它對外提供REST API來負責響應調用方的下線請求,同時會將生產者的狀態同步到 Eureka Server 和 網關核心,起著 狀態同步 和 軟事物 的作用。

思路:在生產者做 縮容、下線、升級 前,spider 平臺(spider為容器管理平臺)會主動通知 Gateway-SynchSpeed 某個生產者的某個實例要下線了,然后 Gateway-SynchSpeed 會通知 Eureka Server 生產者的某個實例下線了;如果Eureka Server 下線成功,Gateway-SynchSpeed 會直接通知 網關核心。

設計特點

  • 無侵入性、方便使用。不用關心調用方的基于何種語言實現,調用者只要對 Gateway-SynchSpeed 發起一個http rest請求即可,真正的實現邏輯不用侵入到調用方而是交給這個代理來實現。

  • 原子性。調用方先在Eureka Server下線,然后在所有相關網關核心中下線為最小工作執行單元,Gateway-SynchSpeed 相當于一個"軟事物",保證服務下線的某種程度上原子特性。

3.2 實現步驟

API網關如何實現對服務下線實時感知

步驟說明

  • 第一步:在生產者做 縮容、下線、升級 前,spider平臺會以http請求的形式通知到 Gateway-SynchSpeed 服務,通知的粒度為服務實例所在的容器IP。

  • 第二步:Gateway-SynchSpeed 接受到請求后,先校驗IP的可用性,然后通知Eureka Server。

  • 第三步:Eureka Server 將 Producer 置為失效狀態,并返回處理結果(Eureka 下線形式分為兩種,一種是直接從服務注冊列表直接剔除,第二種是狀態下線,即是將 Producer 的狀態置為OUT_OF_SERVICE。 如果是以第一種形式下線,Spider平臺發出下線請求后,不能保證Producer進程立刻被kill,如果這期間 Producer 還有心跳同步到 Eureka Server,服務會重新注冊到 Eureka Server)。

  • 第四步:Gateway-SynchSpeed 得到上一步結果,如果結果為成功,則執行下一步;反之,則停止。

  • 第五步:Gateway-SynchSpeed 為Eureka Client。Gateway-SynchSpeed 通過 IP 到本地服務注冊列表中得到 Producer 的 Application-Name。

  • 第六步:Gateway-SynchSpeed 通過 Application-Name 到網關核心庫中查詢所有與下線服務相關的 網關組名字

  • 第七步:Gateway-SynchSpeed 通過 網關組名字 到本地服務列表中查找網關組下所有的服務地址 ipAddress(ip : port)。

  • 第八步:Gateway-SynchSpeed 異步通知所有相關網關節點。

  • 第九步:Gateway-Core 收到通知后,對 Producer 做狀態下線,同時記錄所有狀態下線成功的實例信息到緩存 DownServiceCache 中。

  • 第十步:Gateway-Core 更新本地 Ribbon 服務列表。

四、補償機制

Eureka 提供了一種安全保護機制。Eureka Client 從 Eureka Server 更新服務列表前,會校驗相關Hash值是否改變( Client 服務列表被修改,hash值會改變),如果改變,更新方式會從增量更新變成全量更新,(由《Eureka 緩存機制》可知這30s內 readOnlyCacheMap 和 readWriteCacheMap 的數據可能存在差異),如果Client端緩存列表被readOnlyCacheMap 覆蓋,最終會導致 Ribbon 端服務列表與 readWriteCacheMap 數據不一致。

API網關如何實現對服務下線實時感知

針對 Eureka 這種機制,引入監聽器 EurekaEventListener 作為補償機制,它會監聽 Eureka Client 全量拉取事件,對于緩存中未超過30s的服務,將其狀態重新設置成 OUT_OF_SERVICE

五、API安全設計

考慮到系統的安全性問題,如果被人惡意訪問,可能會使生產者在Eureka Server中無故下線,導致消費者無法通過 Eureka Server 來發現生產者。

使用黑白名單做安全過濾,基本流程如下:

  • 對 Gateway-Synchspeed 中設置白名單網段(IP網段)

  • 在 Gateway-Synchspeed 加入過濾器,對下線請求方進行IP校驗,如果請求端IP在網段中,則放行;反之,過濾。

六、日志回溯

由于 Gateway-SynchSpeed 和 Gateway-Core 是部署在 Docker 容器中,如果容器重啟,會導致日志文件全部丟失。所以需要將 Gateway-SynchSpeed 和 Gateway-Core 中相關日志寫入到 Elasticsearch ,最終由 Kibana 負責查詢 Elasticsearch 的數據并以可視化的方式展現。

七、代碼片段展示

Gateway-SynchSpeed 做狀態同步

API網關如何實現對服務下線實時感知

EurekaEventListener 處理緩存數據

API網關如何實現對服務下線實時感知

八、 補充說明

目前網關實現對服務下線的實時感知中,使用的 Zuul 和 Eureka 版本為 Spring Cloud Zuul 1.3.6.RELEASE 、Spring Cloud Eureka 1.4.4.RELEASE。

目前網關實現的是對網關下游服務的實時感知,而且需滿足以下條件:

  • 生產者需部署在 kubernetes 容器管理平臺
  • 生產者做正常的下線、升級或者縮容操作。如果是由于容器資源不足,導致服務異常宕機等非正常下線,不支持。

網關服務下線實時感知是網關對業務方提供的一種可選的解決方案,在 spider 平臺中默認是沒有開啟此功能,是否開啟此功能由業務方根據本身系統要求決定,具體如何配置可參考 API網關接入指南 中 《網關實時感知在spider上配置文檔說明》。

作者:謝國輝

來源:宜信技術學院

轉載于:https://blog.51cto.com/14159827/2405120

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251697.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251697.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251697.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TCP為什么要三次握手和四次揮手

http://www.jellythink.com/archives/705 簡析TCP的三次握手與四次分手 https://zhuanlan.zhihu.com/p/24001696 計算機網絡面試題 https://www.zhihu.com/question/36930631 TCP四次分手中,主動關閉方最后為什么要等待2MSL之后才關閉連接? http://ww…

Java處理文件BOM頭的方式推薦

背景: java普通的文件讀取方式對于bom是無法正常識別的。 使用普通的InputStreamReader,如果采用的編碼正確,那么可以獲得正確的字符,但bom仍然附帶在結果中,很容易導致數據處理出錯。另外,對于存在BOM頭的…

封裝svg組件

如何封裝svg圖標組件 封裝svg圖標組件的方法有很多種,如果只是單純的想使用svg圖標,可以將svg導出fonts字體圖標使用,但這樣做會失去svg原有的樣式與尺寸,也可以當成img圖片或者背景引入,但這樣做非常繁瑣。 最近項目中…

RabbitMQ 延遲隊列,消息延遲推送

應用場景 目前常見的應用軟件都有消息的延遲推送的影子,應用也極為廣泛,例如: 淘寶七天自動確認收貨。在我們簽收商品后,物流系統會在七天后延時發送一個消息給支付系統,通知支付系統將款打給商家,這個過程…

windows Navicat Premium連接oracle

需要下載并指定Instant Client 下載地址:在oracle官網搜索Instant Client Downloads選擇自己需要的客戶端 //說明 //Navicat 版本 9 或以上捆綁了 instant client,但是捆綁的用不了,捆綁的10.2。因此下載高版本替換之 //版本有要求&#xff0…

關于arraylist的擴容機制

ArrayList會自動改變size的長度: 首先,ArrayList定義了一個私有的未被序列化的數組elementData,用來存儲ArrayList的對象列表(注意只定義未初始):private transient Object[] elementData;   其次&am…

不同級別UI設計師的區別有哪些?

不同等級的UI設計師在工作內容以及基本的薪資待遇方面也是有區別的,很多在UI培訓學校學習的小伙伴們并不知道各個等級的UI設計師工作內容有什么差別,那么合肥學碼思小編就給大家總結一下這些區別分別表現在哪些方面。 一、初級UI設計師 初級UI設計師的主…

Linux命令行參數前加--,-和不加杠

參數前“-”的表明后面的參數是字符形式。參數前“--”的則表明后面的參數是單詞形式。參數前有橫的是System V風格。 參數前沒有橫的是BSD風格。 轉載于:https://www.cnblogs.com/YYRise/p/9090476.html

反射筆記-----------------------------

1.反射基本概念: 01.定義: 反射是指在程序運行期間,能夠觀察和修改類或者類的對象的屬性和行為的特性! 02.作用: 001.在運行期間獲取類的修飾符,包名,類名,實現的接口,繼…

kubernetes 集群部署

kubernetes 集群部署 環境JiaoJiao_Centos7-1(152.112) 192.168.152.112JiaoJiao_Centos7-2(152.113) 192.168.152.113JiaoJiao_Centos7-3(152.114) 192.168.152.114已開通 4C8G80G 集群規劃 部署方式 環境準備:基于主機名稱通信,時間同步,關…

PHP學習筆記--抽象類和抽象方法的應用

抽象類** 什么是抽象方法?** 定義:如果一個類中的方法,沒有方法體的方法就是抽象方法(就是一個方法沒有使用{}而直接使用分號結束)* * abstract function test(); //抽象方法* * function test(){ //有方法體…

wordpress 顯示數學公式 (MathJax-LaTeX)

blog 不放一堆數學公式怎么能顯得高大上,所以 MathJax-LaTeX 也是必裝的插件之一了。 一、安裝 MathJax-LaTex 插件 直接在 wordpress 插件中,搜索并安裝 MathJax-LaTeX 二、安裝本地 MathJax 服務 不過由默認的 MathJax cdn 服務經常被墻,所…

長春理工大學第十四屆程序設計競賽(重現賽)F.Successione di Fixoracci

鏈接:https://ac.nowcoder.com/acm/contest/912/F 題意: 動態規劃(Dynamic programming,簡稱dp)是一種通過把原問題分解為相對簡單的子問題的方式求解復雜問題的方法。例如,假設小x一步能爬1層或2層臺階,求小x爬n層臺階…

ConstraintLayout

ConstraintLayout使用筆記 具體使用參考:http://blog.csdn.net/guolin_blog/article/details/53122387 ConstraintLayout 好處還是很明顯,確實可以減少嵌套。性能對比參閱:http://www.cnblogs.com/liujingg/p/7161319.html 簡單嵌套Constrain…

css權重

權重大小 內嵌權重為1000 <p style"color: yellow;">ALEX</p> id選擇器的權重為100&#xff0c;類選擇器的權重為10&#xff0c;標簽選擇器的權重為1. /*1 1 1*/ #box1 .wrap2 p{color: red; }當權重一樣的時候&#xff0c;是以后設置的屬性為準&#xf…

手機兩列布局,正方形

手機兩列布局&#xff0c;正方形。 直接貼出調試網站的結果&#xff0c;閱讀效果還不錯。 轉載于:https://www.cnblogs.com/blogzhang/p/11002428.html

python(5)- 基礎數據類型

一 int 數字類型 #abs(x)      返回數字的絕對值&#xff0c;如abs(-10) 返回 10 # ceil(x)    返回數字的上入整數&#xff0c;如math.ceil(4.1) 返回 5 # cmp(x, y)    如果 x < y 返回 -1, 如果 x y 返回 0, 如果 x > y 返回 1 # exp(x)…

B s

666 轉載于:https://www.cnblogs.com/lovelgx/articles/9099239.html

基于HTK的語音撥號系統

為什么80%的碼農都做不了架構師&#xff1f;>>> 基于 HTK 的語音撥號系統 Veket NWPU 2011-6-22 目標&#xff1a; 該系統能夠識別連續說出的數字串和若干組姓名。建模是針對子詞&#xff08; sub-word,eg.. 音素&#xff09;&#xff0c;具有一定的…

MySQL無法重啟問題解決Warning: World-writable config file '/etc/my.cnf' is ignored

為什么80%的碼農都做不了架構師&#xff1f;>>> 今天幫朋友維護服務器&#xff0c;在關閉數據庫的命令發現mysql關不了&#xff0c;提示Warning: World-writable config file /etc/my.cnf is ignored &#xff0c;大概意思是權限全局可寫&#xff0c;任何一個用戶都…