­

[微服務感悟] 服務發現與常見架構

  • 2020 年 2 月 13 日
  • 筆記

文章目錄
  • 什麼是服務發現
  • 服務發現原始架構
  • 程序內集成網關架構
  • 統一網關架構(總線架構)
  • service mesh微服務架構

這時一篇務虛的博文,主要記錄對微服務發現的感悟。

什麼是服務發現

微服務架構中,服務都運行在許許多多的機器中,調用其他服務時首先需要找到這個服務在哪裡呢,找服務對應的機器的過程就是服務發現。

服務發現原始架構

最初的做法是在程序中寫死服務對應的域名,讓運維人員配置域名解析到對應的ngnix網關,網關做負載均衡,分發到對應服務器節點。這種做法相當於程序內保存服務對應域名,ngnix做網關,保存服務器節點地址,並負責負載均衡和轉發。

隨着業務進一步發展,服務越來越多,服務的節點服務器也越來越多,稍微上點規模的業務,都有20+的服務,每個服務又存在2+個節點服務器。這時如果服務的域名,服務的節點要發生更改,就需要改動很多文件,甚至需要許多服務重新發版,而且隨着服務多了,總有某些服務會需要發生更改,這存在極大的工作量和風險。所以服務多了,這套就不適用了。

A域名

B域名

生產服務, 項目配置文件中存在其他服務信息

網關, 負載均衡

A服務節點1

A服務節點2

A服務節點3

網關B

B服務節點1

B服務節點2

程序內集成網關架構

這套架構是在每個程序中都存放所有服務,所有節點的信息,程序自己做負載均衡。同時存在一個服務中心,它負責同步每個服務的最新節點信息,註冊服務(當有新服務上線時,像服務中心發送自己的ip和服務名,服務中心添加該條服務信息),健康檢查(定時發送心跳包到每個服務,對發送不成功的服務,按下線規則做處理),提供查看所有節點信息的http接口。

這時服務中心就十分重要,如果服務中心掛了,其他服務就不能感知到存在的新的服務變化,所以它一定要高可用。每個服務實際訪問的是本地的服務節點信息,那麼就一定存在本地和服務中心節點數據不同步的情況,所以從設計上說,這是一個偏向高可用的設計,而不是高一致。

常見的實踐是在框架中即成服務節點信息同步,服務發現,負載均衡等功能,程序只實現業務員邏輯。spring cloud便是這一套架構,eureka是服務註冊中心,spring cloud框架中集成了服務信息的同步。

這種架構需要統一的框架支持某套服務節點信息同步的通信協議,這會技術棧依賴某一個框架,並不能實現微服務中,每個服務任意使用某個技術棧的願想。如採用spring cloud做微服務技術棧,那麼每個服務都要採用springcloud/boot框架,但是我如果想使用python/go/.net/c++的服務,就不太容易集成到這套架構中去。

統一網關架構(總線架構)

這是一種偏向AP的架構,高一致,低可用,每個微服務程序都需要將請求發給服務中心,由服務中心找到對應可用節點,再進行分發。它抽象出的服務中心,負責負載均衡,服務註冊,服務轉發的功能功能。

這套的好處是,服務中心統一管理所有的服務節點信息,可以保證高一致性,每個服務不用集成負載均衡等模塊,不存在框架/代碼依賴,每個微服務都可以採用各自技術棧,不受限制。

缺點是每個請求都要穿透一次服務中心,有性能損耗;而且服務中心作用太大,一旦掛掉,所有業務都會停止,只適合內網比較穩定的環境中運行。

服務關鍵字

轉發

客服端服務

服務中心

服務A節點1

服務A節點2

服務B節點1

我工作中的某家公司,用的就是這套架構。做法是這樣的,規定統一的發送協議,即採用http做通信協議,在請求頭中加一個系統code,代表要轉發的系統編號。所有請求都要發給middleware(服務中心)的服務做轉發,middleware中存有所有服務IP地址;每個服務啟動時都會向middleware服務發送註冊信息;middleware定期向所有服務發送心跳監控服務是否在線;middleware提供統一的負載均衡策略,熔斷策略;middleware提供統一的http接口以供其查詢服務器信息,middleware在內網中。

PS:當時設計這套的架構師稱為總線架構,後來被綠廠高薪挖過去搞架構了,他說過去推廣這一套。

架構如下,不過我已經離職有段時間了,這個架構應該還能再拆拆,合合。如open-Platform、face功能重合,沒有合併的原因是歷史原因;如middleware可以拆成櫃機基本服務和服務中心。

service mesh微服務架構

service mesh是現在比較火的概念,它的思想和程序內集成網關架構有點像,不過它的網關在每個系統鏡像包中,而不是代碼/框架集成在程序中,它配合來使用docker會非常方便。服務中心同步每個容器中網關的服務節點信息,每個程序都向系統/容器內的網關發送請求,網關在進行服務發現和負載均衡,找到對應的容器發送過去。

這套架構也支持每個服務採用各自的技術棧,互不干擾;服務都是通過容器內的網關做轉發,即使服務中心不可用,也能使用,是高可用架構

缺點是沒啟動一個應用,都要重新打一個對應的鏡像包,運維工作更加複雜,必須有集成一整套自動化開發部署工具才行,也就是devops工具箱,只有技術實力強的公司可以試試這套。