掃二維碼與項目經理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網交流

創(chuàng)新互聯(lián)公司成都網站建設按需設計網站,是成都網站推廣公司,為成都戶外休閑椅提供網站建設服務,有成熟的網站定制合作流程,提供網站定制設計服務:原型圖制作、網站創(chuàng)意設計、前端HTML5制作、后臺程序開發(fā)等。成都網站設計熱線:13518219792
說起微服務,大家應該并不陌生,不只是一線大廠,很多中小規(guī)模團隊也已經將這項技術引入并在實際業(yè)務中落地。
那作為一名開發(fā)人員,應該如何學習微服務呢?
雖然現在開源的微服務框架有很多,各種編程語言的都有,花上幾個小時搭建一套可運行的開發(fā)環(huán)境也并不是一件難事。但畢竟微服務涉及的組件還是挺多的,相比于單體架構來說,復雜度提升了不少。
不知道你有沒有和我一樣的困擾,有時候想要深入學習一下,但卻不知道從什么地方入手,結果就是對其了解只是浮于表面。
所以我最近看了極客時間的專欄《從 0 開始學微服務》,覺得作為入門還是不錯的。
同時,我總結了專欄中的部分內容,并加入一些自己的思考,形成了這篇文章。算是學習微服務的一個大綱,然后再按照這個大綱去深入學習,不斷充實這套技術體系。
好了,下面正文開始。
微服務是指開發(fā)應用所用的一種架構形式。通過微服務,可將大型應用分解成多個獨立的組件,其中每個組件都有各自的責任領域。在處理一個用戶請求時,基于微服務的應用可能會調用許多內部微服務來共同生成其響應。
微服務的特點:
想要構建微服務,首先要解決的問題是,服務提供者如何發(fā)布一個服務,服務消費者如何引用這個服務。具體來說,就是這個服務的接口名是什么?調用這個服務需要傳遞哪些參數?接口的返回值是什么類型?以及一些其他接口描述信息。
最常見的服務發(fā)布和引用的方式有三種:
這種方式就比較常見了,主要被用作 HTTP 或者 HTTPS 協(xié)議的接口定義,即使在非微服務架構體系下,也被廣泛采用。而且學習成本低,比較適合用作跨業(yè)務平臺之間的服務協(xié)議。
這種方式下需要在服務提供者和服務消費者之間維持一份對等的 XML 配置文件,來保證服務調用。比如提供者維護 server.xml,消費者維護 client.xml。
在接口變更時,需要同時修改這兩個接口描述文件。
IDL 就是接口描述語言(interface description language)的縮寫,通過一種中立的方式來描述接口,使得在不同的平臺上運行的對象和不同語言編寫的程序可以相互通信交流。
也就是說 IDL 主要是用作跨語言平臺的服務之間的調用,有兩種最常用的 IDL:一個是 Facebook 開源的 Thrift 協(xié)議,另一個是 Google 開源的 gRPC 協(xié)議。
每種方式都有各自的優(yōu)缺點,具體應該如何選擇,需要根據自身的業(yè)務特點。
|
描述方式 |
使用場景 |
缺點 |
|
RESTful API |
跨語言平臺,組織內外皆可 |
使用 HTTP 作為通信協(xié)議,相比于 TCP,性能較差 |
|
XML 配置 |
Java 平臺,一般用于組織內部 |
不支持跨語言平臺 |
|
IDL 文件 |
跨語言平臺,組織內外皆可 |
修改和刪除字段不支持向前兼容 |
服務拆分之后,服務的提供者和消費者分別運行在不同的機器上,而且服務眾多,有幾十個,甚至上百個。這就涉及到一個問題,消費者如何才能找到服務提供者,這也是注冊中心需要解決的問題。
注冊中心需要實現哪些 API?
除此之外,為了便于管理,注冊中心還必須提供一些后臺管理的 API,例如:
在拆分為微服務架構前,單體應用只需要管理一套配置;而拆分為微服務后,每一個系統(tǒng)都有自己的配置,并且都各不相同,而且因為服務治理的需要,有些配置還需要能夠動態(tài)改變,以達到動態(tài)降級、切流量、擴縮容等目的,所以如何管理配置十分重要。
配置中心一般包含下面幾個功能:
API 網關可以被視為一種充當應用程序服務和不同客戶端之間的中間件,可以管理許多事情,例如:
事實上,它是作為一個反向代理工作的,客戶端只需要知道系統(tǒng)的網關,應用服務就可以隱藏起來,不直接向其他系統(tǒng)暴露。
如果沒有 API 網關,可能需要在每個服務中做一些橫切關注點,比如想記錄服務的請求和響應。此外,如果應用程序由多個服務組成,客戶端需要知道每個服務地址,并且在更改服務地址的情況下,需要更新多個地方。
微服務架構擁有很好的可擴展性,我們能夠通過運行更多服務實例來處理更多請求,但問題是,哪個實例應該接收請求,或客戶端如何知道哪個服務實例應該處理請求?
這些問題的答案是負載均衡。負載均衡是高可用網絡基礎架構的關鍵組件,通常用于將工作負載分布到多個服務器來提高網站、應用、數據庫或其他服務的性能和可靠性。
常用的負載均衡算法有一下五種:
顧名思義就是從可用的服務節(jié)點中,隨機挑選一個節(jié)點來訪問。
實現比較簡單,在請求量遠超可用服務節(jié)點數量的情況下,各個服務節(jié)點被訪問的概率基本相同,主要應用在各個服務節(jié)點的性能差異不大的情況下。
跟隨機算法類似,各個服務節(jié)點被訪問的概率也基本相同,也主要應用在各個服務節(jié)點性能差異不大的情況下。
在輪詢算法基礎上的改進,可以通過給每個節(jié)點設置不同的權重來控制訪問的概率,因此主要被用在服務節(jié)點性能差異比較大的情況。
比如經常會出現一種情況,因為采購時間的不同,新的服務節(jié)點的性能往往要高于舊的節(jié)點,這個時候可以給新的節(jié)點設置更高的權重,讓它承擔更多的請求,充分發(fā)揮新節(jié)點的性能優(yōu)勢。
與加權輪詢算法預先定義好每個節(jié)點的訪問權重不同,采用最少活躍連接算法,客戶端同服務端節(jié)點的連接數是在時刻變化的,理論上連接數越少代表此時服務端節(jié)點越空閑,選擇最空閑的節(jié)點發(fā)起請求,能獲取更快的響應速度。
尤其在服務端節(jié)點性能差異較大,而又不好做到預先定義權重時,采用最少活躍連接算法是比較好的選擇。
因為它能夠保證同一個客戶端的請求始終訪問同一個服務節(jié)點,所以適合服務端節(jié)點處理不同客戶端請求差異較大的場景。
比如服務端緩存里保存著客戶端的請求結果,如果同一客戶端一直訪問一個服務節(jié)點,那么就可以一直從緩存中獲取數據。
不管是單體架構,還是微服務架構,監(jiān)控都是必不可少的。只不過微服務架構更加復雜,監(jiān)控起來也就更加不容易。
對于一個微服務來說,必須明確要監(jiān)控哪些對象、哪些指標,并且還要從不同的維度進行監(jiān)控,才能掌握微服務的調用情況。
監(jiān)控對象可以分為四個層次,由上到下可歸納為:
搞清楚要監(jiān)控的對象之后,需要監(jiān)控具體哪些指標呢?
一般來說,要從多個維度來對業(yè)務進行監(jiān)控,包括下面幾個維度:
在調試單體應用時,非常直觀容易。但是在微服務架構上,因為一個請求可能會通過不同的服務,而不同的服務又不在一個地方,這使得調試和跟蹤變得困難。
所以服務追蹤是分布式系統(tǒng)中必不可少的功能,它能夠幫助我們查詢一次用戶請求在系統(tǒng)中的具體執(zhí)行路徑,以及每一條路徑的上下游的詳細情況,對于追查問題十分有用。
它的核心理念就是調用鏈:通過一個全局唯一的 ID 將分布在各個服務節(jié)點上的同一次請求串聯(lián)起來,從而還原原有的調用關系,可以追蹤系統(tǒng)問題、分析調用數據并統(tǒng)計各種系統(tǒng)指標。
小結一下,traceId 是用于串聯(lián)某一次請求在系統(tǒng)中經過的所有路徑,spanId 是用于區(qū)分系統(tǒng)不同服務之間調用的先后關系,而 annotation 是用于業(yè)務自定義一些自己感興趣的數據,在上傳 traceId 和 spanId 這些基本信息之外,添加一些自己感興趣的信息。
系統(tǒng)故障是避免不了的,雖然微服務架構做了服務拆分,不至于像單體架構那樣整體崩潰,但由于其整體復雜度也大大提升,故障處理也更加困難。
顧名思義,限流就是限制流量。通常情況下,系統(tǒng)能夠承載的流量根據集群規(guī)模的大小是固定的,可以稱之為系統(tǒng)的最大容量。
當真實流量超過了系統(tǒng)的最大容量后,就會導致系統(tǒng)響應變慢,服務調用出現大量超時,反映給用戶的感覺就是卡頓、無響應。
所以,應該根據系統(tǒng)的最大容量,給系統(tǒng)設置一個閾值,超過這個閾值的請求會被自動拋棄,這樣的話可以最大限度地保證系統(tǒng)提供的服務正常。
熔斷和限流還不太一樣,上面我們可以看到限流是控制請求速率,只要還能承受,那么都會處理,但熔斷不是。
在一條調用鏈上,如果發(fā)現某個服務異常,比如響應超時。那么調用者為了避免過多請求導致資源消耗過大,最終引發(fā)系統(tǒng)雪崩,會直接返回錯誤,而不是瘋狂調用這個服務。
什么是降級呢?降級就是通過停止系統(tǒng)中的某些功能,來保證系統(tǒng)整體的可用性。
降級可以說是一種被動防御的措施,為什么這么說呢?因為它一般是系統(tǒng)已經出現故障后所采取的一種止損措施。
單體應用拆分成多個微服務后,能夠實現快速開發(fā)迭代,但隨之帶來的問題是測試和運維部署成本的提升。
而容器技術正好可以很好的解決這些問題,目前最流行的當屬 Docker 莫屬。
微服務容器化運維主要涉及到以下幾點:
鏡像倉庫的概念其實跟 Git 代碼倉庫類似,就是有一個集中存儲的地方,把鏡像存儲在這里,在服務發(fā)布的時候,各個服務器都訪問這個集中存儲來拉取鏡像,然后啟動容器。
這個階段主要是解決在哪些機器上啟動容器的問題,特別是規(guī)模比較大的公司,一般有物理機集群,虛擬機集群,私有云和公有云。對接這么多不同的平臺,難度還是不小的。
需要統(tǒng)一管理來自不同集群的機器權限管理、成本核算以及環(huán)境初始化等操作,這個時候就需要有一個統(tǒng)一的層來完成這個操作。
很顯然,靠人工是肯定不行的,需要搭建統(tǒng)一的部署運維平臺。
大部分情況下,微服務之間是相互獨立的,在進行容器調度的時候不需要考慮彼此。
但有時候也會存在一些場景,比如服務 A 調度的前提必須是先有服務 B,這樣的話就要求在進行容器調度的時候,還需要考慮服務之間的依賴關系。
Service Mesh 的概念最早是由 Buoyant 公司的 CEO William Morgan 提出,他給出的服務網格的定義是:
A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application. In practice, the service mesh is typically implemented as an array of lightweight network proxies that are deployed alongside application code, without the application needing to be aware.
被很多人定義為下一代的微服務架構。
目前,Service Mesh 的代表產品當屬 Google 和 IBM 的 lstio。
Istio 的架構可以說由兩部分組成,分別是 Proxy 和 Control Plane。

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網交流