架構:微服務核心架構梳理

什麼是微服務

微服務之父Martin Fowler,對微服務大概的概述如下:

就目前而言,對於微服務業界並沒有一個統一的、標準的定義(While there is no precise definition of this architectural style ) 。但通常而言,微服務架構是一種架構模式或者說是一種架構風格,它提倡將單一應用程序劃分成一組小的服務,每個服務運行獨立的自己的進程中,服務之間互相協調、互相配合,爲用戶提供最終價值。服務之間採用輕量級的通信機制互相溝通(通常是基於HTTP的RESTful API ) 。每個服務都圍繞着具體業務進行構建,並且能夠被獨立地部署到生產環境、類生產環境等。另外,應儘量避免統一的、集中式的服務管理機制,對具體的一個服務而言,應根據業務上下文,選擇合適的語言、工具對其進行構建,可以有一個非常輕量級的集中式管理來協調這些服務。可以使用不同的語言來編寫服務,也可以使用不同的數據存儲。

根據Martin Fowler的描述,我總結了一下幾點:
在這裏插入圖片描述

小服務,沒有特定的標準或者規範,但他在總體規範上一定是小的。
進程獨立,每一組服務都是獨立運行的,可能我這個服務運行在Tomcat容器,而另一個服務運行在Jetty上。可以通過進程方式,不斷的橫向擴展整個服務。
通信,過去的協議都是很重的,就像ESB,就像SOAP,輕通信,着意味着相比過去更智能更輕量的服務相互調用,就所謂smart endpoints and dumb pipes,這些Endpoint都是解耦的,完成一個業務通信調用串起這些micro service就像是Linux系統中通過管道串起一系列命令業務。過去的業務,我們通常會考慮各種各樣的依賴關係,考慮系統耦合帶來的問題。微服務,可以讓開發者更專注於業務的邏輯開發。
部署,不止業務要獨立,部署也要獨立。不過這也意味着,傳統的開發流程會出現一定程度的改變,開發的適合也要有一定的運維指責。
管理,傳統的企業級SOA服務往往很大,不易於管理,耦合性高,團隊開發成本比較大。微服務可以讓團隊各思其政的選擇技術實現,不同的Service可以根據各自的需要選擇不同的技術棧來實現其業務邏輯。

微服務的利與弊

爲什麼用微服務呢?因爲好玩?不是的。下面是我從網絡上找到說的比較全的優點:

優點每個服務足夠內聚,足夠小,代碼容易理解這樣能聚焦一個指定的業務功能或業務需求。
開發簡單、開發效率提高,一個服務可能就是專一的只幹一件事。
微服務能夠被小團隊單獨開發,這個小團隊是2到5人的開發人員組成。
微服務是松藕合的,是有功能意義的服務,無論是在開發階段或部署階段都是獨立的。
微服務能使用不同的語言開發。
易於和第三方集成,微服務允許容易且靈活的方式集成自動部署,通過持續集成工具,如Jenkins、Hudson、Bamboo。
微服務易於被一個開發人員理解,修改和維護,這樣小團隊能夠更關注自己的工作成果。無需通過合作才能體現價值。微服務允許你利用融合最新技術。
微服務只是業務邏輯的代碼,不會和HTML、CSS或其他界面組件混合。
每個微服務都有自己的存儲能力,可以有自己的數據庫。也可以有統一數據庫。

總的來說,微服務的優勢,就是在於,面對大的系統,可以有效的減少複雜程度,使服務架構的邏輯更清晰明瞭。

但是這樣也會帶來很多問題,就譬如分佈式環境下的數據一致性,測試的複雜性,運維的複雜性。

什麼組織適合使用微服務?

微服務帶了種種優點,種種弊端,那麼什麼組織適合使用微服務?

墨菲定律(設計系統)和康威定律(系統劃分)

康威定律,是一個五十多年前就被提出來的微服務概念。在康威的這篇文章中,最有名的一句話就是:
Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations. - Melvin Conway(1967)

在這裏插入圖片描述

架構演化

架構是不斷演化出來的,微服務也是這樣,當從各大科技公司,規模大到一定程度,完全需要演化成更進一步管理的技術架構體系。

在這裏插入圖片描述
傳統的團隊,都是面向過程化的,產品想完了去找策劃,策劃完了找開發,接着順着一步一步找。我們做技術都是爲了產品的,一旦過程出來了什麼問題,回溯尋找問題會非常耗時。
在這裏插入圖片描述
使用了微服務架構體系,團隊組織方式需要轉變成跨職能團隊,即每個團隊都有產品專家,策劃專家,開發專家,運維專家,他們使用API方式發佈他們的功能,而平臺使用他們的功能發佈產品。

在這裏插入圖片描述
在這裏插入圖片描述

分享一下大部分公司都使用的微服務技術架構體系。

在這裏插入圖片描述
服務發現

主流的服務發現,分爲三種:
在這裏插入圖片描述
第一種,開發人員開發了程序以後,會找運維配一個域名,服務的話通過DNS就能找到我們對應的服務。

缺點是,由於服務沒有負載均衡功能,對負載均衡服務,可能會有相當大的性能問題。

在這裏插入圖片描述
第二種,是目前普遍的做法。即每一個服務都通過服務端內置的功能註冊到註冊中心,服務消費者不斷輪詢註冊中心發現對應的服務,使用內置負載均衡調用服務。

缺點是,對多語言環境不是很好,你需要單獨給消費者的客戶端開發服務發現和負載均衡功能。當然了,這個方法通常都是用在Spring Cloud上的。

在這裏插入圖片描述

第三種,是將客戶端和負載均衡放在同一個主機,而不是同一個進程內。

這種方法相對第一種第二種方法來說,改善了他們的缺點,但是會極大增加運維成本。
網關

微服務的網關是什麼?

我們可以聯繫生活實際想一下。每一個大的公司,都會有一偏屬於自己的建築區,而這建築區內,都有不少的門衛。如果有外來人員進入公司,會先和門衛打好招呼,才能進去。

將生活實際聯繫到微服務上,就不難理解網關的意思了。

網關有什麼用
在這裏插入圖片描述

反向路由:很多時候,公司不想讓外部人員看到我們公司的內部,就需要網關來進行反向路由。即將外部請求轉換成內部具體服務條用
安全認證:網絡中會有很多惡意訪問,譬如爬蟲,譬如黑客攻擊,網關維護安全功能。
限流熔斷:當請求很多服務不堪重負,會讓我們的服務自動關閉,導致不能用服務。限流熔斷可以有效的避免這類問題。
日誌監控:所有的外面的請求都會經過網關,這樣我們就可以使用網關來記錄日誌信息
灰度發佈,藍綠部署。是指能夠平滑過渡的一種發佈方式。在其上可以進行A/B testing,即讓一部分用戶繼續用產品特性A,一部分用戶開始用產品特性B,如果用戶對B沒有什麼反對意見,那麼逐步擴大範圍,把所有用戶都遷移到B上面來。

開源網關Zuul架構

在這裏插入圖片描述

Zuul網關核心其實是一個Servlet,所有請求都會經過Zuul Servlet傳到zuulFilter Runner,然後分發到三種過濾器。

先說說架構圖左半部分,分別是使用Groovy實現的前置路由過濾器,路由過濾器,後置路由過濾器。

一般請求都會先經過前置路由過濾器處理,一般的自定義Java封裝邏輯也會在這裏實現。

路由過濾器,實現的是找到對應的微服務進行調用。

調用完了,響應回來,會經過後置路由過濾器,通過後置路由過濾器我們可以封裝日誌審計的處理。

可以說Zuul網關最大的特色就是它三層過濾器。

架構圖右半部分,是Zuul網關設計的自定義過濾器加載機制。網關內部會有生產者消費者模型,自動的將過濾器腳本發佈到Zuul網關讀取加載運行。

配置中心

以前,開發人員把配置文件放在開發文件裏面,這樣會有很多隱患。譬如,配置規範不同,無法追溯配置人員。一旦需要大規模改動配置,改動時間會很長,無法追溯配置人員,從而影響整個產品,後果是我們承擔不起的。

因此就有配置中心這個嘍~

現在的開源中心有百度配置中心Disconf,Spring Cloud Config,Apollo,今天重點說說現在應用質量不錯的配置中心攜程開源的Apollo。

開源地址:https://github.com/ctripcorp/apollo。

在這裏插入圖片描述
Apollo的配置中心規模比較大,本地應用會有響應的配置中心客戶端,可以定時同步配置中心裏的配置。如果配置中心怠機,會使用緩存來進行配置。

通訊方式
在這裏插入圖片描述

監控預警

監控預警對於微服務很重要,一個可靠的監控預警體系對微服務運行至關重要。一般監控分爲如下層次:

在這裏插入圖片描述

從基礎設施到用戶端,層層有監控,全方位,多角度,每一個層面都很重要。總體來說,微服務可分5個監控點:日誌監控,Metrics監控,健康檢查,調用鏈檢查,告警系統。

監控架構

下面的圖是大部分公司的一種監控架構圖。每一個服務都有一個Agent,Agent收集到關鍵信息,會傳到一些MQ中,爲了解耦。同時將日誌傳入ELK,將Metrics傳入InfluxDB時間序列庫。而像Nagios,可以定期向Agent發起信息檢查微服務。

在這裏插入圖片描述

調用鏈監控APM
很多公司都有調用鏈監控,就譬如阿里有鷹眼監控,點評的Cat,大部分調用鏈監控(沒錯,我指的Zipkin)架構是這樣的:
在這裏插入圖片描述

當請求進入Web容器的時候,會經過創建Tracer,連接Spans(模擬潛在的分佈式工作的延遲,該模塊還包含在系統網絡間傳遞跟蹤上下文信息的工具包,如通過http headers)。Spans有一個上下文,其中包含tracer標識符,將其放在表示分佈式操作的樹的正確位置。當我們把圖中的各種Span放到後端的時候,我們的服務調用鏈會動態的生成調用鏈。

下面是一些市場上用的比較多的調用鏈監控對比:在這裏插入圖片描述
熔斷、隔離、限流、降級

面對巨大的突發流量下,大型公司一般會採用一系列的熔斷(系統自動將服務關閉防止讓出現的問題最大化)、隔離(將服務和服務隔離,防止一個服務掛了其他服務不能訪問)、限流(單位時間內之允許一定數量用戶訪問)、降級(當整個微服務架構整體的負載超出了預設的上限閾值或即將到來的流量預計將會超過預設的閾值時,爲了保證重要或基本的服務能正常運行,我們可以將一些 不重要或 不緊急 的服務或任務進行服務的 延遲使用 或 暫停使用)措施。

下面介紹一下Hystrix的運行流程
在這裏插入圖片描述
每一個微服務調用時,都會使用hystrix的command方式(上圖的左上角那個),然後使用command同步的,或者是響應式的,或者是異步的,判斷電路是否熔斷(順着圖從左往右看),如果斷路則走降級Fallback。

如果這個線閉合着,但是線程資源沒了,隊列滿了,則走限流措施(看圖的第5步)。

如果走完了,執行成功了,則走run()方法,獲取Response,但是這個過程如果出錯了,則繼續走降級Fallback。

同時,看圖最上面有一個後綴是health的,這是一個計算整個鏈路是否健康的組件,每一步操作都被它記錄着。

容器與服務編排引擎

從物理機到虛擬機,從虛擬機到容器;從物理集羣到OpenStack,OpenStack到Kubernetes;科技不斷的變化,我們的認知也會刷新。

我們從容器開始說起,它首先是一個相對獨立的運行環境,在這一點有點類似於虛擬機,但是不像虛擬機那樣徹底。

虛擬機會將虛擬硬件、內核(即操作系統)以及用戶空間打包在新虛擬機當中,虛擬機能夠利用“虛擬機管理程序”運行在物理設備之上。虛擬機依賴於Hypervisor,其通常被安裝在“裸金屬”系統硬件之上,這導致Hypervisor在某些方面被認爲是一種操作系統。一旦Hypervisor安裝完成, 就可以從系統可用計算資源當中分配虛擬機實例了,每臺虛擬機都能夠獲得唯一的操作系統和負載(應用程序)。簡言之,虛擬機先需要虛擬一個物理環境,然後構建一個完整的操作系統,再搭建一層Runtime,然後供應用程序運行。

對於容器環境來說,不需要安裝主機操作系統,直接將容器層(比如LXC或libcontainer)安裝在主機操作系統(通常是Linux變種)之上。在安裝完容器層之後,就可以從系統可用計算資源當中分配容器實例了,並且企業應用可以被部署在容器當中。但是,每個容器化應用都會共享相同的操作系統(單個主機操作系統)。容器可以看成一個裝好了一組特定應用的虛擬機,它直接利用了宿主機的內核,抽象層比虛擬機更少,更加輕量化,啓動速度極快。

相比於虛擬機,容器擁有更高的資源使用效率,因爲它並不需要爲每個應用分配單獨的操作系統——實例規模更小、創建和遷移速度也更快。這意味相比於虛擬機,單個操作系統能夠承載更多的容器。雲提供商十分熱衷於容器技術,因爲在相同的硬件設備當中,可以部署數量更多的容器實例。此外,容器易於遷移,但是隻能被遷移到具有兼容操作系統內核的其他服務器當中,這樣就會給遷移選擇帶來限制。因爲容器不像虛擬機那樣同樣對內核或者虛擬硬件進行打包,所以每套容器都擁有自己的隔離化用戶空間,從而使得多套容器能夠運行在同一主機系統之上。我們可以看到全部操作系統層級的架構都可實現跨容器共享,惟一需要獨立構建的就是二進制文件與庫。正因爲如此,容器才擁有極爲出色的輕量化特性。

**我們最常用的容器是Docker,網址:https://www.docker.com/。
**

容器編排
過去虛擬機可以通過雲平臺OpenStack管理虛擬化,容器時代如何管理容器呢?這就要看看容器編排引擎了。

Apache Mesos:

Mesos是基於Master,Slave架構,框架決定如何利用資源,Master負責管理機器,Slave會定期的將機器情況報告給Master,Master再將信息給框架。Master是高可用的,因爲ZooKeeper,也有Leader的存在。下面是架構圖:

Kubernetes:

Kubernetes是最近十分火熱的開源容器編排引擎。
在這裏插入圖片描述

Kubernetes設計理念和功能其實就是一個類似Linux的分層架構,先說說每一個Kubernetes節點內部,kubelet管理全局全局Pod,而每一個Pod承載着一個或多個容器,kube-proxy負責網絡代理和負載均衡。

Kubernetes節點外部,則是對應的控制管理服務器,負責統一管理各個節點調度分配與運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章