架構新紀元(一):從分佈式架構到雲原生架構

信息技術從出現伊始到漸成主流,其發展歷程經歷了軟件、開源、雲三個階段。從軟件到開源,再到雲,這也是信息技術的發展趨勢。

1.軟件改變世界

縱觀人類社會漫長的發展歷程,農耕時代、工業時代與信息時代可謂三個明顯的分水嶺, 每個時代都會出現很多新興的領域。作爲信息時代最重要的載體,互聯網越來越成爲當今社會 關注的焦點,互聯網的基石之一——軟件,正在迅速地改變着這個世界。

2.開源改變軟件

隨着軟件行業的成熟,相比於“重複造輪子”,“站在巨人的肩膀上”明顯可以更加容易和 快速地創造出優秀的新產品。隨着開源文化越來越被認可,以及社區文化越來越成熟,使用優 秀的開源產品作爲基礎構架來快速搭建系統以實現市場戰略,成了當今最優的資源配比方案。

3.雲吞噬開源

僅通過開源產品搭建並運維一個高可用、高度彈性化的平臺,進而實現互聯網近乎 100% 的可用性,難度可想而知。因此,在提供技術思路的同時,進一步提供整套雲解決方案以保障 不斷擴展的非功能需求,便成了當今新一代互聯網平臺的追求。

在信息技術的大潮中,每一次通信模式的升級都會給這個世界的合作模式帶來變革。

隨着互聯網在 21 世紀初被大規模接入,互聯網由基於流量點擊贏利的單方面信息發佈的 Web 1.0 業務模式,轉變爲由用戶主導而生成內容的 Web 2.0 業務模式。因此,互聯網應用系統 所需處理的訪問量和數據量均疾速增長,後端技術架構也因此面臨着巨大的挑戰。Web 2.0 階段的互聯網後端架構大多經歷了由All in One的單體式應用架構漸漸轉爲更加靈活的分佈式應用 架構的過程,而企業級架構由於功能複雜且並未出現明顯的系統瓶頸,因此並未跟進。後端開 發不再侷限於單一技術棧,而是越來越明顯地被劃分爲企業級開發和互聯網開發。企業級開發 和互聯網開發的差別不僅在於技術棧差異,也在於工作模式不同,對質量的追求和對效率的提 升成了兩個陣營的分水嶺,互聯網架構追求更高的質量和效率。

隨着智能手機的出現以及 4G 標準的普及,互聯網應用由 PC 端迅速轉向更加自由的移動端。 移動設備由於攜帶方便且便於定位,因此在出行、網絡購物、支付等方面徹底改變了現代人的 生活方式。在技術方面,爲了應對更加龐大的集羣規模,單純的分佈式系統已經難於駕馭,因 此技術圈開啓了一個概念爆發的時代——SOA、DevOps、容器、CI/CD、微服務、Service Mesh 等概念層出不窮,而 Docker、Kubernetes、Mesos、Spring Cloud、gRPC、Istio 等一系列產品的 出現,標誌着雲時代已真正到來。

從分佈式架構到雲原生架構

從分佈式架構到雲原生架構隨着虛擬化技術的成熟和分佈式架構的普及,用來部署、管理和運行應用的雲平臺被越來越多地提及。IaaS、PaaS和SaaS是雲計算的三種基本服務類型,分別表示關注硬件基礎設施的基礎設施即服務、關注軟件和中間件平臺的平臺即服務,以及關注業務應用的軟件即服務。容器的出現,使原有的基於虛擬機的雲主機應用,徹底轉變爲更加靈活和輕量的“容器+編排調度”的雲平臺應用。

新紀元的分水嶺——容器技術

在過去幾年裏,雲平臺發展迅速,但其中困擾運維工程師最多的,是需要爲各種迥異的開發語言安裝相應的運行時環境。雖然自動化運維工具可以降低環境搭建的複雜度,但仍然不能從根本上解決環境的問題。
Docker的出現成爲了軟件開發行業新的分水嶺,容器技術的成熟也標誌着技術新紀元的開啓。Docker提供了讓開發工程師可以將應用和依賴封裝到一個可移植的容器中的能力,這項舉措使得Docker大有席捲整個軟件行業並且進而改變行業遊戲規則的趨勢,這像極了當年智能手機剛出現時的場景——改變了整個手機行業的遊戲規則。Docker通過集裝箱式的封裝方式,讓開發工程師和運維工程師都能夠以Docker所提供的“鏡像+分發”的標準化方式發佈應用,使得異構語言不再是捆綁團隊的枷鎖。

新紀元的編排與調度系統

容器單元越來越散落使得管理成本逐漸上升,大家對容器編排工具的需求前所未有的強烈,Kubernetes、Mesos、Swarm等爲雲原生應用提供了強有力的編排和調度能力,它們是雲平臺上的分佈式操作系統。

Kubernetes是目前世界範圍內關注度最高的開源項目,它是一個出色的容器編排系統,用於提供一站式服務。Kubernetes出身於互聯網行業巨頭——Google,它借鑑了由上百位工程師花費十多年時間打造的Borg系統的理念,安裝極其簡易,網絡層對接方式十分靈活。

Mesos則更善於構建一個可靠的平臺,用來運行多任務關鍵工作負載,包括Docker容器、遺留應用程序(如Java)和分佈式數據服務(如Spark、Kafka、Cassandra、Elastic)。Mesos採用兩級調度的架構,開發人員可以很方便地結合公司的業務場景定製Mesos Framework。

其實無論是Kubernetes還是Mesos,它們都不是專門爲了容器而開發的。Mesos早於Docker出現,而Kubernetes的前身Borg更是早已出現,它們都是基於解除資源與應用程序本身的耦合限制而開發的。運行於容器中的應用,其輕量級的特性恰好能夠與編排調度系統完美結合。

唯一爲了Docker而生的編排系統是Swarm,它由Docker所在的Moby公司出品,用於編排基於Docker的容器實例。不同於Kubernetes和Mesos,Swarm是面向Docker容器的,相較於Kubernetes面向雲原生PaaS平臺,以及Mesos面向“大數據+編排調度”平臺,Swarm顯得功能單一。在容器技術本身已不是重點的今天,編排能力和生態規劃均略遜一籌的Swarm已經跟不上前兩者的腳步。

Kubernetes和Mesos的出色表現給行業中各類工程師的工作模式帶來了顛覆性的改變。他們再也不用像照顧寵物那樣精心地“照顧”每一臺服務器,當服務器出現問題時,只要將其換掉即可。業務開發工程師不必再過分關注非功能需求,只需專注自己的業務領域即可。而中間件開發工程師則需要開發出健壯的雲原生中間件,用來連接業務應用與雲平臺。

架構設計的變革——微服務

單體應用雖然簡單且深入人心,但是隨着越來越多的應用被部署到雲端,它的劣勢也體現得愈加明顯。因爲應用變更的範圍和週期被捆綁在一起,因此即使只變更應用的一部分,也需要重新構建並部署整個單體應用,而且擴展時無法只對需要更多資源的部分模塊進行單獨擴展,必須將應用整體擴展。這種粗粒度的劃分,不利於對系統進行管理,也不利於資源的充分利用。因此,人們越來越傾向於將應用進行合理的拆分。

在過去的幾年中,微服務已經迅速成爲了技術圈最熱門的術語之一,微服務是一種架構風格,它將一個複雜的單體應用分解成多個獨立部署的微型服務,每個服務運行在自己的進程中,服務間的通信採用輕量級通信機制,如RESTful API。服務可以使用不同的開發語言和數據存儲技術。通過服務拆分,系統可以更加自由地將資源分配到所需的應用中,而無須直接擴展整個應用。圖1-5直觀地展現了單體應用與微服務的區別。

圖 單體應用與微服務的區別

採用微服務架構風格的團隊將圍繞業務組織團隊,而不是圍繞技術組織團隊,這一點和DevOps有異曲同工之妙。實施微服務前的組織結構如圖1-6所示,對於集中式架構而言,拆分大型應用通常需要在技術層面上設立UI團隊、後端開發團隊、數據庫團隊。在這種團隊劃分方式下,即使進行簡單更改也會導致協作團隊垮掉。

微服務架構風格則採用圍繞業務線進行劃分的方式,以保證一個團隊中能擁有UI工程師、開發工程師、DBA和項目經理。實施微服務後的組織結構如圖1-7所示。

微服務的優勢是通過清晰的模塊邊界構建易於理解的架構風格,它可以讓每個服務具有獨立部署、與開發語言無關的能力。分佈式系統的開發成本和運維開銷則是伴隨微服務的普及而需要付出的代價。

圖 實施微服務前的組織結構

圖 實施微服務後的組織結構

相比於集中式架構,微服務架構需要額外處理的分佈式開發和運維工作包括以下幾點。

  • 配置管理。相比於集中式架構的屬性文件配置方式,微服務架構更加傾向於使用集中化的配置中心來存儲配置數據。配置中心不一定在任何時候都是100%高可用的,大部分時間,配置是從客戶端的緩存中讀取的,如果配置中心恰好在配置修改時不可用,就會帶來很大的影響,導致配置修改無法及時生效。配置修改要想及時生效,配置中心必須有推送配置變更事件的能力。如果配置中心是高可用的,也要慎重考慮如何保證多個配置中心間的數據一致性。

  • 服務發現。單體應用的服務是可數且可人工運維的,而對於基於微服務架構的應用而言,其服務數非常多,數不勝數。因此,微服務框架要具有服務發現的能力。一般情況下,服務發現是通過向註冊中心註冊服務實例的運行時標識以及對其進行監聽並反向通知其狀態變化來實現的。

  • 負載均衡。與服務發現類似,大量的微服務應用實例無法通過靜態修改負載均衡器的方式進行運維,因此需要反向代理或使用客戶端負載均衡器配合服務發現動態調整負載均衡策略。

  • 彈性擴縮容。這是集中式架構所不具備的能力,即能夠在流量洪峯期通過增加應用實例的水平伸縮來增強服務的處理能力,並且能夠在流量回歸正常時簡單地關閉應用實例,平滑地將多餘的資源移出集羣。

  • 分佈式調用追蹤。大量微服務應用的調用和交互,需要依靠一套完善的調用鏈追蹤系統來實現,包括確定服務當前的運行狀況,以及在出現狀況時迅速定位相應的問題點。

  • 日誌中心。在微服務架構中,散落在應用節點上的日誌不易排查,而且隨着應用實例的銷燬,日誌也會丟失,因此需要將日誌發送至日誌中心統一進行存儲和排查。

  • 自愈能力。這是一個進階功能,如果微服務應用可以通過健康檢查感知各個服務實例的存活狀態,並通過系統資源監控以及SLA分析獲知應用當前的承載量,同時應用本身具有彈性擴縮容能力且微服務管控系統具有自動服務發現以及調整負載均衡的能力,那麼便可以根據合理的調度策略配置通過調度系統來自動增加、關閉和重啓應用實例,達到系統自愈的效果,使系統更加健壯。

在容器技術開源社區、編排系統開源社區的推動,以及微服務等開發理念的帶動下,將應用部署到雲端已經是不可逆轉的趨勢。隨着雲化技術的不斷髮展,雲原生的概念也應運而生。在現有業務代碼不變的情況下,要想讓分佈式系統無縫入雲,需要改變的就是中間件。因此,從分佈式中間件向雲原生中間件變遷,便成爲重中之重。

本文節選自圖書《未來架構:從服務化到雲原生》第一章。本書對快速演進中的雲原生數據架構、典型分佈式數據庫中間件進行了剖析,重點介紹Service Mesh等新興概念,創新性地提出了Database Mesh的理念,深度揭祕Apache項目——ShardingSphere。

購買鏈接:https://u.jd.com/sbmG4Y

作者簡介
張亮
京東數科數據研發負責人,Apache ShardingSphere發起人兼PPMC成員。熱愛分享,擁抱開源,主張代碼優雅化,擅長以Java爲主的分佈式架構以及以Kubernetes和Mesos爲主的雲平臺的構建。ShardingSphere已進入Apache軟件基金會,是京東集團首個進入Apache的開源項目,也是Apache首個分佈式數據庫中間件。

吳晟
Apache SkyWalking創始人及PPMC成員,Apache ShardingSphere原型作者及PPMC成員,Apache Zipkin貢獻者,Apache孵化器導師,CNCF基金會OpenTracing標準化委員會成員,W3C Trace Context規範貢獻者。擅長分佈式架構、性能監控與診斷、分佈式追蹤、雲原生監控等領域。

敖小劍
具有十七年軟件開發經驗,資深碼農,微服務專家,Cloud Native 擁護者,敏捷實踐者,Service Mesh佈道師,ServiceMesher中文社區聯合創始人。專注於基礎架構建設,對微服務、雲計算等相關技術有着深入研究和獨到見解。

宋淨超
螞蟻金服雲原生布道師,ServiceMesher中文社區聯合創始人,Kubernetes社區成員,Istio社區成員,《Cloud Native Go》《Python雲原生》《雲原生Java》等圖書譯者。

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