1. 程式人生 > >直面PHP微服務架構挑戰

直面PHP微服務架構挑戰

在4月20日的阿里雲棲開發者沙龍PHP技術專場上,雲智慧Technical VP高馳濤為大家介紹了微服務的前世今生,分享了微服務架構實踐中所面對的諸多挑戰以及相應的應對策略。

本次直播視訊精彩回顧,戳這裡!
直播回顧:https://yq.aliyun.com/live/965
PPT分享:https://yq.aliyun.com/download/3527

以下內容根據演講視訊以及PPT整理而成。

專家簡介

高馳濤 (Neeke Gao),雲智慧Technical VP,PHP/PECL開發組成員,具有10餘年研發管理經驗,同時也是PECL/SeasLog、PECL/JsonNet、GoCrab等多項開源軟體的作者。2014年加入雲智慧,致力於APM與大資料產品的架構研發,崇尚敏捷、高效。

從一個問題談起

首先,從幾年之前某CTO的一個問題談起,這個問題是“我們的系統將會擁有五千個微服務元件。我們應該怎麼做?”大家可以仔細思考這個問題,我們都知道一個介面肯定無法稱之為微服務,達到十幾個介面或許才能夠叫做微服務。那麼,對於包含五千個微服務的系統而言,又該怎麼實現和管理呢?其實,這樣的系統背後會存在很大的問題。

本次分享將會主要圍繞以下三個方面內容展開:

  1. 微服務的前世今生
  2. 微服務的挑戰
  3. 應該怎麼面對

微服務的前世今生

下圖所展現的內容其實可以說是供大家在茶餘飯後聊天的談資,如果想要知道微服務是如何誕生的,那麼就必須要了解以下四個領域的知識。

TOGAF:全稱為“開放組體系結構框架”,TOGAF在上世紀七、八十年代的時候就已經由專門組織負責開發了,但一直到1995年的時候,美國國防部參與之後,TOGAF才最終成型。舉例而言,大家手機里正在使用的產品和應用中,很多都會用到SAP、IBM或者惠普等的軟體,而這些軟體公司所遵循的就是TOGAF。可以說目前全球超過50%的企業正在使用TOGAF實踐軟體架構設計和開發。TOGAF是一個架構體系,而並沒有提供具體的架構方法。TOGAF包含了業務架構、應用架構、資料架構、技術架構等,其實,阿里雲的全域性元件也屬於TOGAF中的技術架構領域,其能夠幫助客戶減少各種繁雜的思考,使得客戶只需要關注於業務架構即可。

TOGAF有三個最為主要支柱:

1)企業架構域,主要是企業資訊與業務流等;
2)ADM一系列的架構方法論;
3)企業連續性,指的是在企業業務高速增長並且也不斷變更的過程中,保證架構體系的連續性。

DDD:全稱為“領域驅動設計”,其包含了諸多的概念,但是大家只需要記住主要的三句話即可。
1)DDD是精簡的業務,DDD首先關注的就是業務,把各種繁瑣的業務流程精簡成更細的鏈條;
2)DDD需要回答業務是幹什麼的,能夠滿足什麼需求,達成什麼目的;
3)不斷迭代,DDD的不斷迭代與TOGAF的企業連續性類似。

SOA:全稱為“面向服務架構”,其理論也非常多,但是大家也只需要記住三點。
1)SOA解決了資訊孤島的問題,不讓資訊變成孤島;
2)業務重用,從業務角度將各個服務組合成一個個中介軟體或者服務,將其提供給使用者或者其他系統;
3)SOA使得系統成為互聯互通的資訊群。

GRASP原則:全稱為“通用職責分配原則”,其實很多大家耳熟能詳的概念如“低耦合”、“高內聚”都來自於GRASP原則。其與設計模式不同,設計模式指導如何實現系統,而GRASP指導如何劃分。GRASP原則指導定義業務架構以及API等相關內容和劃分服務,其理論內容也非常多,但是隻需要記住三個關鍵:
1)自己幹自己的事;
2)自己只幹自己能幹的事;
3)自己只幹自己的事,強調了資源劃分。

在軟體工程的教科書上給出了微服務架構的定義:微服務架構是一種架構模式,它提介將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為⽤戶提供最終價值。每個服務運行在其獨立的程序中,服務與服務間採用輕量級的通訊機制互相溝通(通常是基於HTTP協議的RESTFul API)。每個服務都圍繞著具體業務進⾏構建,並且能夠被獨⽴的部署到⽣產環境、類⽣產環境等。另外,應當儘量避免統一的、集中式的服務管理機制,對具體的一個服務⽽言,應根據業務上下⽂,選擇合適的語言、工具對其進行構建。而這些教科書上的內容或許在當下來看已經過時了。

微服務帶來的優勢

那麼,我們使用微服務架構的時候,到底得到了什麼東西呢?其實得到了很多,這裡為大家總結了四點最為明顯的優點。

1)使得開發和迭代變得更加敏捷,使用微服務架構使得敏捷開發成為可能;
2)易於擴充套件和收縮,一些公司基於Kubernetes、Docker等技術可以在幾秒內拉起上萬個微服務,當大型流量衝擊到達的時候,可以實現無損地承擔全部流量,同時實現使用者無感知,而當資料訪問量降低之後,又可以實現快速縮容;
3)多技術棧可能,目前智慧雲的技術棧非常全面,雖然開發人員只有60多人,但是開發語言卻多達10多門,而使用微服務可以有效地組織各類開發人員;
4)高可修改性,比如實現資料庫的快速遷移,通道的快速切換等。

微服務帶來的兩點疑問

這裡再提出兩個問題,雖然微服務能夠帶來諸多優點,但是也存在兩點疑問。第一個就是“微服務架構,你的系統變得更健壯了嗎?”;第二個則是“使用微服務讓系統變得更快了嗎?”對於這兩點而言,可能說是見仁見智的。有人說因為元件變得越來越多,可監控性就會變難,因此係統健壯性就會變得越來越差,也有人說因為將系統拆分得越來越細,因此健壯性就會越來越強。如果單體架構是序列的,那麼使用微服務可以將其變成並行的和分散式的,而多個元件之間進行通訊,也會使得通訊成為效能瓶頸,那麼使用微服務到底是變快了還是變慢了呢?這兩個問題都很難以回答。而作為一個架構師或者開發者需要進行深入的思考。

微服務架構面臨的挑戰和思考

這裡為大家總結了在使用微服務架構的時候所需要面臨的8條挑戰和相關的思考。

1. 小即是多

當業務從大變小的時候,也意味著業務變多了。由大變小,可以使系統變得更加容易維護和修改,但是由少變多,又會使得問題更加複雜,因此也會有很多的挑戰。第一個問題就是多節點、多服務和多狀態。系統中的節點、元件服務變得更多了,那麼節點和服務之間的狀態也會變得更難維護,更加複雜。基於前面提到的四種知識,其實可以將從大變小和從少變多這兩個轉變進行折中,使得其變得更加可控。而解決這個問題的關鍵在於對於服務的合理拆分,主要有三點可以考慮,即資料資源、業務功能以及服務物件。

2. 債務管理

比如Bug、程式碼缺陷、未完成的功能或者版本不相容等問題都是債務。當服務變得越來越多的時候,債務往往就會變得更多。為了解決這些問題,其實有這樣的幾種策略,比如單元測試,如果單元測試做的足夠好,那麼程式碼缺陷的可能性就會變得更低一些,可以將服務由少變多所造成的債務變多情況進行收斂;整合迴歸,這部分提供了很多工具去做這件事情,不用開發者自己去做;版本管理,這裡指的是靜態庫的版本管理,動態庫指的是正在變更中的庫,而靜態庫指的是不再變更的庫和配置項,這一點控制不好,就容易使得系統管理混亂;迭代衝刺,這是一種組織方式,當有很多技術債務需要進行管理時,如何將這些債務一點點處理掉或者把發散的趨勢收斂住,迭代衝刺就是一種做法;Bug Crash,這是智慧雲團隊自己發明的一個名詞,相當於是對於Bug的大掃除,無論採用傳統的還是敏捷的開發模式,都有一些Bug存在,因此定期會組織全體開發和測試以及產品將自己的產品用一遍,進行Bug大掃除;迴歸總結,無論採用什麼開發模式,在一個迭代週期完成之後,迴歸總結是少不了的,也需要通過一些方法解決新發生的問題,或者將其封閉住不使債務繼續蔓延。

3. 複雜的服務依賴

如果只有一個或者幾個元件,那麼其實不存在服務依賴問題,而如果有幾千個元件,那麼服務依賴將會成為巨大的問題。舉例而言,如果使用者服務需要呼叫訂單服務,那麼在啟動的時候需要進行一些初始化任務,那麼一個服務的版本釋出可能導致系統全面癱瘓,這就是複雜服務依賴問題。為了解決這個問題首先就需要服務發現機制,比如使用etcd或者Zookeeper等,首先服務發現中心也需要是分散式高可靠的,那麼服務起來之後需要把自己的名字和呼叫方式告訴服務發現中心,註冊上去,對於服務呼叫者而言只需要從服務發現中心那裡通過約定好的名字獲取服務呼叫地址即可。依賴喚醒是有一個相對比較新的東西,比如大流量突然打進來的時候,A服務需要從原來的10個啟動到100個,而B從原來的3個肯定也是不夠用的,因此需要通過喚醒的機制將服務拉起來,而不是被動的被通知。還有一種情況也需要使用到依賴喚醒機制,比如快取穿透問題,正常情況下,快取是生效的,不會存在穿透的情況,但是可能因為某種異常使得快取不生效了,會將大量的流量打到DB裡面去,使得服務變得不可用了,整個服務雪崩掉,針對這些問題一般會開發一些擋板服務,可能會給出一些固定的資料,而這些擋板服務也有可能會面臨這種突發的流量也需要通過依賴喚醒的機制實現喚醒。此外,還有灰度釋出和AB測試,這兩點是相關聯的。還有多版本共存問題,對於服務的多版本也是一個技術債務問題,需要考慮如何將其舊版本拿下來。

4. 訊息通訊

如果系統中包含多個語言棧,多種實現方式。那麼統一標準是必須的,要麼統一一種RPC或者就使用RestFul API等。訊息中心也是一種處理做法,這一點在Java中應用很多,訊息中心並不是訊息佇列,而是一個事件驅動的訊息中心。此外,還有通訊閘道器,這在使用微服務的時候也是一個必要點,其主要解決了監控問題,而且可以通過閘道器起到中控的作用,比如安全、效能以及使用者校驗等任務。

5. 分散式事務

在實現分散式事務的時候可以採用2PC或者3PC原則來實現,2PC原則是通過全部節點投票和執行兩個步驟完成的,並且是阻塞的;而3PC則不同,雖然在一個具體的事務裡面可以是阻塞的,也可以是非阻塞的。3PC協議則是通過“Can-Pre-Do”三個步驟來實現的,其實PDU就是3PC協議在單體中的實現方式。而在分散式系統中,3PC有三種實現方式,使用分散式的事件驅動、最大通知以及兩階段補償TCC。

6. 花式故障

很多時候,當系統出現問題可能需要花費數週和很多人力才能找到根源所在,可能因為系統太多,使得系統架構師也無法清楚系統與系統之間的關係。面對諸多的花式故障,也有多種策略可以應對,比如全鏈路追蹤,比如使用Open Tracking;主動撥測,很多使用者端的APP裡面內建探針,使其可以接收Server端的指令來定期探測介面和服務是否正常。

7. 中心與去中心

中心與去中心可以算是一個永恆的話題,上圖中展示的配置、發號、日誌、排程、狀態以及預警,其實對於比較成熟的大型系統而言,這六點都是需要中心的。

8. 組織危機

最後一個問題,也是最大的問題。其實要實現向微服務架構的變更的時候,最大的問題就是組織危機。這一點與開發者關係不大,但是對於Team Leader以及組織的管理人員而言,關係就非常大了。架構的轉變需要考慮到信任危機、過期維護、多語言棧、溝通協作、安全閘道器以及輪崗結對等問題。

總結

總結而言,最重要的觀點有兩個:微服務不是銀彈。不要讓重複的事情做兩次。

作者:PHP小能手

原文連結

本文為雲棲社群原創內容,未經