成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

程序員筆記 | API網(wǎng)關(guān)如何實(shí)現(xiàn)對(duì)服務(wù)下線的實(shí)時(shí)感知

開(kāi)發(fā) 開(kāi)發(fā)工具
上篇文章《Eureka 緩存機(jī)制》介紹了Eureka的緩存機(jī)制,相信大家對(duì)Eureka 有了進(jìn)一步的了解,本文將詳細(xì)介紹API網(wǎng)關(guān)如何實(shí)現(xiàn)服務(wù)下線的實(shí)時(shí)感知。

上篇文章《Eureka 緩存機(jī)制》介紹了Eureka的緩存機(jī)制,相信大家對(duì)Eureka 有了進(jìn)一步的了解,本文將詳細(xì)介紹API網(wǎng)關(guān)如何實(shí)現(xiàn)服務(wù)下線的實(shí)時(shí)感知。 

一、前言

在基于云的微服務(wù)應(yīng)用中,服務(wù)實(shí)例的網(wǎng)絡(luò)位置都是動(dòng)態(tài)分配的。而且由于自動(dòng)伸縮、故障和升級(jí),服務(wù)實(shí)例會(huì)經(jīng)常動(dòng)態(tài)改變。因此,客戶(hù)端代碼需要使用更加復(fù)雜的服務(wù)發(fā)現(xiàn)機(jī)制。

目前服務(wù)發(fā)現(xiàn)主要有兩種模式:客戶(hù)端發(fā)現(xiàn)和服務(wù)端發(fā)現(xiàn)。

  • 服務(wù)端發(fā)現(xiàn):客戶(hù)端通過(guò)負(fù)載均衡器向服務(wù)注冊(cè)中心發(fā)起請(qǐng)求,負(fù)載均衡器查詢(xún)服務(wù)注冊(cè)中心,將每個(gè)請(qǐng)求路由到可用的服務(wù)實(shí)例上。
  • 客戶(hù)端發(fā)現(xiàn):客戶(hù)端負(fù)責(zé)決定可用服務(wù)實(shí)例的網(wǎng)絡(luò)地址,并且在集群中對(duì)請(qǐng)求負(fù)載均衡, 客戶(hù)端訪問(wèn)服務(wù)登記表,也就是一個(gè)可用服務(wù)的數(shù)據(jù)庫(kù),然后客戶(hù)端使用一種負(fù)載均衡算法選擇一個(gè)可用的服務(wù)實(shí)例然后發(fā)起請(qǐng)求。

客戶(hù)端發(fā)現(xiàn)相對(duì)于服務(wù)端發(fā)現(xiàn)***的區(qū)別是:客戶(hù)端知道(緩存)可用服務(wù)注冊(cè)表信息。如果Client端緩存沒(méi)能從服務(wù)端及時(shí)更新的話(huà),可能出現(xiàn)Client 與 服務(wù)端緩存數(shù)據(jù)不一致的情況。 

二、網(wǎng)關(guān)與Eureka結(jié)合使用

Netflix OSS 提供了一個(gè)客戶(hù)端服務(wù)發(fā)現(xiàn)的好例子。Eureka Server 為注冊(cè)中心,Zuul 相對(duì)于Eureka Server來(lái)說(shuō)是Eureka Client,Zuul 會(huì)把 Eureka Server 端服務(wù)列表緩存到本地,并以定時(shí)任務(wù)的形式更新服務(wù)列表,同時(shí)zuul通過(guò)本地列表發(fā)現(xiàn)其它服務(wù),使用Ribbon實(shí)現(xiàn)客戶(hù)端負(fù)載均衡。

程序员笔记|API网关如何实现对服务下线的实时感知

正常情況下,調(diào)用方對(duì)網(wǎng)關(guān)發(fā)起請(qǐng)求即刻能得到響應(yīng)。但是當(dāng)對(duì)生產(chǎn)者做縮容、下線、升級(jí)的情況下,由于Eureka這種多級(jí)緩存的設(shè)計(jì)結(jié)構(gòu)和定時(shí)更新的機(jī)制,LoadBalance 端的服務(wù)列表B存在更新不及時(shí)的情況(由上篇文章《Eureka 緩存機(jī)制》可知,服務(wù)消費(fèi)者最長(zhǎng)感知時(shí)間將***趨近240s),如果這時(shí)消費(fèi)者對(duì)網(wǎng)關(guān)發(fā)起請(qǐng)求,LoadBalance 會(huì)對(duì)一個(gè)已經(jīng)不存在的服務(wù)發(fā)起請(qǐng)求,請(qǐng)求是會(huì)超時(shí)的。 

三、解決方案

3.1 實(shí)現(xiàn)思路

生產(chǎn)者下線后,***得到感知的是 Eureka Server 中的 readWriteCacheMap,***得到感知的是網(wǎng)關(guān)核心中的 LoadBalance。但是 loadBalance 對(duì)生產(chǎn)者的發(fā)現(xiàn)是在 loadBalance 本地維護(hù)的列表中。

所以要想達(dá)到網(wǎng)關(guān)對(duì)生產(chǎn)者下線的實(shí)時(shí)感知,可以這樣做:首先生產(chǎn)者或者部署平臺(tái)主動(dòng)通知 Eureka Server, 然后跳過(guò) Eureka 多級(jí)緩存之間的更新時(shí)間,直接通知 Zuul 中的 Eureka Client,***將 Eureka Client 中的服務(wù)列表更新到 Ribbon 中。

但是如果下線通知的邏輯代碼放在生產(chǎn)者中,會(huì)造成代碼污染、語(yǔ)言差異等問(wèn)題。

借用一句名言:

“計(jì)算機(jī)科學(xué)領(lǐng)域的任何問(wèn)題都可以通過(guò)增加一個(gè)間接的中間層來(lái)解決”

程序员笔记|API网关如何实现对服务下线的实时感知

Gateway-SynchSpeed 相當(dāng)于一個(gè)代理服務(wù),它對(duì)外提供REST API來(lái)負(fù)責(zé)響應(yīng)調(diào)用方的下線請(qǐng)求,同時(shí)會(huì)將生產(chǎn)者的狀態(tài)同步到 Eureka Server 和 網(wǎng)關(guān)核心,起著 狀態(tài)同步 和 軟事物 的作用。

思路:在生產(chǎn)者做 縮容、下線、升級(jí) 前,spider 平臺(tái)(spider為容器管理平臺(tái))會(huì)主動(dòng)通知 Gateway-SynchSpeed 某個(gè)生產(chǎn)者的某個(gè)實(shí)例要下線了,然后 Gateway-SynchSpeed 會(huì)通知 Eureka Server 生產(chǎn)者的某個(gè)實(shí)例下線了;如果Eureka Server 下線成功,Gateway-SynchSpeed 會(huì)直接通知 網(wǎng)關(guān)核心。

設(shè)計(jì)特點(diǎn)

  • 無(wú)侵入性、方便使用。不用關(guān)心調(diào)用方的基于何種語(yǔ)言實(shí)現(xiàn),調(diào)用者只要對(duì) Gateway-SynchSpeed 發(fā)起一個(gè)http rest請(qǐng)求即可,真正的實(shí)現(xiàn)邏輯不用侵入到調(diào)用方而是交給這個(gè)代理來(lái)實(shí)現(xiàn)。
  • 原子性。調(diào)用方先在Eureka Server下線,然后在所有相關(guān)網(wǎng)關(guān)核心中下線為最小工作執(zhí)行單元,Gateway-SynchSpeed 相當(dāng)于一個(gè)"軟事物",保證服務(wù)下線的某種程度上原子特性。

3.2 實(shí)現(xiàn)步驟

程序员笔记|API网关如何实现对服务下线的实时感知

步驟說(shuō)明

***步:在生產(chǎn)者做 縮容、下線、升級(jí) 前,spider平臺(tái)會(huì)以http請(qǐng)求的形式通知到 Gateway-SynchSpeed 服務(wù),通知的粒度為服務(wù)實(shí)例所在的容器IP。

第二步:Gateway-SynchSpeed 接受到請(qǐng)求后,先校驗(yàn)IP的可用性,然后通知Eureka Server。

第三步:Eureka Server 將 Producer 置為失效狀態(tài),并返回處理結(jié)果(Eureka 下線形式分為兩種,一種是直接從服務(wù)注冊(cè)列表直接剔除,第二種是狀態(tài)下線,即是將 Producer 的狀態(tài)置為OUT_OF_SERVICE。 如果是以***種形式下線,Spider平臺(tái)發(fā)出下線請(qǐng)求后,不能保證Producer進(jìn)程立刻被kill,如果這期間 Producer 還有心跳同步到 Eureka Server,服務(wù)會(huì)重新注冊(cè)到 Eureka Server)。

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

第五步:Gateway-SynchSpeed 為Eureka Client。Gateway-SynchSpeed 通過(guò) IP 到本地服務(wù)注冊(cè)列表中得到 Producer 的 Application-Name。

第六步:Gateway-SynchSpeed 通過(guò) Application-Name 到網(wǎng)關(guān)核心庫(kù)中查詢(xún)所有與下線服務(wù)相關(guān)的 網(wǎng)關(guān)組名字。

第七步:Gateway-SynchSpeed 通過(guò) 網(wǎng)關(guān)組名字 到本地服務(wù)列表中查找網(wǎng)關(guān)組下所有的服務(wù)地址 ipAddress(ip : port)。

第八步:Gateway-SynchSpeed 異步通知所有相關(guān)網(wǎng)關(guān)節(jié)點(diǎn)。

第九步:Gateway-Core 收到通知后,對(duì) Producer 做狀態(tài)下線,同時(shí)記錄所有狀態(tài)下線成功的實(shí)例信息到緩存 DownServiceCache 中。

第十步:Gateway-Core 更新本地 Ribbon 服務(wù)列表。

四、補(bǔ)償機(jī)制

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

程序员笔记|API网关如何实现对服务下线的实时感知

針對(duì) Eureka 這種機(jī)制,引入監(jiān)聽(tīng)器 EurekaEventListener 作為補(bǔ)償機(jī)制,它會(huì)監(jiān)聽(tīng) Eureka Client 全量拉取事件,對(duì)于緩存中未超過(guò)30s的服務(wù),將其狀態(tài)重新設(shè)置成 OUT_OF_SERVICE 。 

五、API安全設(shè)計(jì)

考慮到系統(tǒng)的安全性問(wèn)題,如果被人惡意訪問(wèn),可能會(huì)使生產(chǎn)者在Eureka Server中無(wú)故下線,導(dǎo)致消費(fèi)者無(wú)法通過(guò) Eureka Server 來(lái)發(fā)現(xiàn)生產(chǎn)者。

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

  • 對(duì) Gateway-Synchspeed 中設(shè)置白名單網(wǎng)段(IP網(wǎng)段)。
  • 在 Gateway-Synchspeed 加入過(guò)濾器,對(duì)下線請(qǐng)求方進(jìn)行IP校驗(yàn),如果請(qǐng)求端IP在網(wǎng)段中,則放行;反之,過(guò)濾。

六、日志回溯

由于 Gateway-SynchSpeed 和 Gateway-Core 是部署在 Docker 容器中,如果容器重啟,會(huì)導(dǎo)致日志文件全部丟失。所以需要將 Gateway-SynchSpeed 和 Gateway-Core 中相關(guān)日志寫(xiě)入到 Elasticsearch ,最終由 Kibana 負(fù)責(zé)查詢(xún) Elasticsearch 的數(shù)據(jù)并以可視化的方式展現(xiàn)。

七、代碼片段展示

Gateway-SynchSpeed 做狀態(tài)同步。

程序员笔记|API网关如何实现对服务下线的实时感知

EurekaEventListener 處理緩存數(shù)據(jù)。

程序员笔记|API网关如何实现对服务下线的实时感知 

八、 補(bǔ)充說(shuō)明

目前網(wǎng)關(guān)實(shí)現(xiàn)對(duì)服務(wù)下線的實(shí)時(shí)感知中,使用的 Zuul 和 Eureka 版本為 Spring Cloud Zuul 1.3.6.RELEASE 、Spring Cloud Eureka 1.4.4.RELEASE。

目前網(wǎng)關(guān)實(shí)現(xiàn)的是對(duì)網(wǎng)關(guān)下游服務(wù)的實(shí)時(shí)感知,而且需滿(mǎn)足以下條件:

  • 生產(chǎn)者需部署在 kubernetes 容器管理平臺(tái) 。
  • 生產(chǎn)者做正常的下線、升級(jí)或者縮容操作。如果是由于容器資源不足,導(dǎo)致服務(wù)異常宕機(jī)等非正常下線,不支持。

網(wǎng)關(guān)服務(wù)下線實(shí)時(shí)感知是網(wǎng)關(guān)對(duì)業(yè)務(wù)方提供的一種可選的解決方案,在 spider 平臺(tái)中默認(rèn)是沒(méi)有開(kāi)啟此功能,是否開(kāi)啟此功能由業(yè)務(wù)方根據(jù)本身系統(tǒng)要求決定,具體如何配置可參考 API網(wǎng)關(guān)接入指南 中 《網(wǎng)關(guān)實(shí)時(shí)感知在spider上配置文檔說(shuō)明》。

【本文是51CTO專(zhuān)欄機(jī)構(gòu)宜信技術(shù)學(xué)院的原創(chuàng)文章,微信公眾號(hào)“宜信技術(shù)學(xué)院( id: CE_TECH)”】

戳這里,看該作者更多好文

 

責(zé)任編輯:張燕妮 來(lái)源: 宜信技術(shù)學(xué)院
相關(guān)推薦

2013-07-09 09:11:50

程序員

2011-03-22 10:16:48

程序員

2020-09-16 08:00:52

程序員財(cái)務(wù)

2009-06-25 09:33:43

Java API程序員

2011-12-15 09:47:12

API

2015-09-11 10:26:38

獨(dú)立程序員贊美

2015-09-22 10:07:30

程序員贊美

2019-05-20 08:49:18

程序員女生嫁人

2013-08-20 09:33:59

程序員

2013-08-08 14:13:18

程序員

2022-04-18 11:05:36

開(kāi)源github代碼庫(kù)

2019-09-24 08:44:09

OpenrestyAPI網(wǎng)關(guān)

2011-05-13 14:34:02

程序員

2020-03-02 15:15:37

程序員工資協(xié)議

2014-12-01 10:05:25

程序員

2020-04-26 09:44:04

微服務(wù)容器架構(gòu)

2014-07-14 11:28:41

2017-10-20 17:21:16

華為

2009-12-10 17:05:10

Visual Stud

2021-05-27 08:54:58

程序員學(xué)歷互聯(lián)網(wǎng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩性在线 | 欧美一区二区在线观看 | 黄a网站| 亚洲视频一区二区 | 免费在线一区二区 | 在线成人av| 久久精品欧美一区二区三区不卡 | 欧美日韩不卡 | 中文字幕在线二区 | 日本涩涩视频 | 91看国产| 国产精品99久久久久久人 | 在线观看av网站永久 | 日本在线视频一区二区 | 精品国产乱码久久久久久88av | 欧美性大战xxxxx久久久 | 日韩午夜网站 | 拍真实国产伦偷精品 | 日日淫 | 91天堂| 国产欧美精品区一区二区三区 | 啪视频在线 | 欧美一区二区在线观看 | 亚洲狠狠| 在线免费观看视频黄 | 欧美一区二区三区精品免费 | 久久精品视频在线观看 | 精品亚洲一区二区三区四区五区 | 天天插日日操 | 欧美性一区二区三区 | 亚洲人在线播放 | 国产一级特黄视频 | 最新国产精品 | 污视频免费在线观看 | 天堂在线91 | 欧美国产视频 | 国产成人一区二区三区 | 免费一区| 91色网站 | www.日韩高清 | 精品综合久久 |