摘要:本文是網(wǎng)易容器云平臺的微服務(wù)化實踐系列文章的第一篇。網(wǎng)易容器云平臺的前身是網(wǎng)易應(yīng)用自動部署平臺,它能夠利用云提供的基礎(chǔ)設(shè)施,實現(xiàn)包括構(gòu)建和部署一體化在內(nèi)的整個應(yīng)用生命周期管理。目前網(wǎng)易云容器服務(wù)團隊以的方式管理著微服務(wù),每周構(gòu)建部署次數(shù)。
此文已由作者馮常健授權(quán)網(wǎng)易云社區(qū)發(fā)布。
歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運營經(jīng)驗。
摘要:網(wǎng)易云容器平臺期望能給實施了微服務(wù)架構(gòu)的團隊提供完整的解決方案和閉環(huán)的用戶體驗,為此從 2016 年開始,我們?nèi)萜鞣?wù)團隊內(nèi)部率先開始進行 dogfooding 實踐,看看容器云平臺能不能支撐得起容器服務(wù)本身的微服務(wù)架構(gòu),這是一次很有趣的嘗試。
一旦決定做微服務(wù)架構(gòu),有很多現(xiàn)實問題擺在面前,比如技術(shù)選型、業(yè)務(wù)拆分問題、高可用、服務(wù)通信、服務(wù)發(fā)現(xiàn)和治理、集群容錯、配置管理、數(shù)據(jù)一致性問題、康威定律、分布式調(diào)用跟蹤、CI/CD、微服務(wù)測試,以及調(diào)度和部署等等,這并非一些簡單招數(shù)能夠化解。實踐微服務(wù)架構(gòu)的方式有千萬種,我們探索并實踐了其中的一種可能性,希望可以給大家一個參考。本文是《網(wǎng)易容器云平臺的微服務(wù)化實踐》系列文章的第一篇。
Docker 容器技術(shù)已經(jīng)過了最早的喧囂期,逐漸在各大公司和技術(shù)團隊中應(yīng)用。盡管以今天來看,大家從觀念上已經(jīng)逐漸認可 “將鏡像定義為應(yīng)用交付標(biāo)準(zhǔn),將容器作為應(yīng)用運行的標(biāo)準(zhǔn)環(huán)境” 的觀點,但還是有相當(dāng)一部分人在迷惑容器技術(shù)作為一個標(biāo)準(zhǔn),應(yīng)該怎么落地,怎樣才能大規(guī)模線上應(yīng)用,怎么玩才能真正解放生產(chǎn)力,促進軟件交付效率和質(zhì)量?答案其實在應(yīng)用的架構(gòu)當(dāng)中。
微服務(wù)架構(gòu)不是因 Docker 容器技術(shù)而生,但確實是因容器技術(shù)而火。容器技術(shù)提供了一致性的分發(fā)手段和運行環(huán)境,使得只有微服務(wù)化后的應(yīng)用架構(gòu),才能配合容器發(fā)揮其最大價值。而微服務(wù)化架構(gòu)引入了很大的復(fù)雜性,只有應(yīng)用容器化以及規(guī)模化的容器編排與調(diào)度才能避免運維效率下降。容器技術(shù)和微服務(wù)化架構(gòu)之間本是一種相輔相成的互補關(guān)系。
網(wǎng)易容器云平臺的前身是網(wǎng)易應(yīng)用自動部署平臺 (OMAD),它能夠利用 IaaS 云提供的基礎(chǔ)設(shè)施,實現(xiàn)包括構(gòu)建和部署一體化在內(nèi)的整個應(yīng)用生命周期管理。2014 年,以 Docker 為代表的容器技術(shù)進入大眾視野,我們驚喜地發(fā)現(xiàn),容器技術(shù)是自動部署平臺從工具型應(yīng)用進化為平臺型應(yīng)用過程中最重要的一塊拼圖。原本用戶需要初始化主機,然后借助自動部署平臺完成應(yīng)用的構(gòu)建和部署。引入容器技術(shù)之后,用戶從功能開發(fā)到測試到一鍵部署上線,整個應(yīng)用交付過程中不用關(guān)心主機初始化、主機間通信、實例調(diào)度等一系列應(yīng)用之外的問題。這簡直是信仰 DevOps 的人的福音。
我們從 2015 年開始探索容器技術(shù)的最佳實踐方式,從當(dāng)初 “胖容器” 與容器集群的產(chǎn)品形態(tài),到后來關(guān)于有狀態(tài)和無狀態(tài)服務(wù)的定義,以及如今的新計算與高性能計算,我們一直在思考并豐富著容器技術(shù)的應(yīng)用場景。無論產(chǎn)品形態(tài)如何調(diào)整,容器云平臺的核心概念一直是 “微服務(wù)”,通過微服務(wù)這一抽象提供高性能的容器集群管理方案,支持彈性伸縮、垂直擴容、灰度升級、服務(wù)發(fā)現(xiàn)、服務(wù)編排、錯誤恢復(fù)、性能監(jiān)測等功能,滿足用戶提升應(yīng)用交付效率和快速響應(yīng)業(yè)務(wù)變化的需求。網(wǎng)易云容器平臺期望能給實施了微服務(wù)架構(gòu)的團隊提供完整的解決方案和閉環(huán)的用戶體驗,為此從 2016 年開始,我們?nèi)萜鞣?wù)團隊內(nèi)部率先開始進行 dogfooding 實踐,一方面檢驗容器云平臺能不能支撐得起容器服務(wù)本身的微服務(wù)架構(gòu),另一方面通過微服務(wù)化實踐經(jīng)驗反哺容器云平臺產(chǎn)品設(shè)計,這是一次很有趣的嘗試,也是我們分享容器云平臺微服務(wù)化架構(gòu)實踐的初衷。
在談容器服務(wù)的微服務(wù)架構(gòu)實踐之前,有必要先把網(wǎng)易云容器服務(wù)大致做個介紹。目前網(wǎng)易云容器服務(wù)團隊以 DevOps 的方式管理著30+微服務(wù),每周構(gòu)建部署次數(shù) 400+。網(wǎng)易云容器服務(wù)架構(gòu)從邏輯上看由 4 個層次組成,從下到上分別是基礎(chǔ)設(shè)施層、Docker 容器引擎層、Kubernetes (以下簡稱 K8S)容器編排層、DevOps 和自動化工具層:
容器云平臺整體業(yè)務(wù)架構(gòu)如下:
拋開容器服務(wù)具體業(yè)務(wù)不談,僅從業(yè)務(wù)特征來說,可以分成以下多種類型(括號內(nèi)為舉例的微服務(wù)):
○ 面向終端用戶 (OpenAPI 服務(wù)網(wǎng)關(guān))、面向服務(wù)(裸機服務(wù))
○ 同步通信(用戶中心)、異步通信(構(gòu)建服務(wù))
○ 數(shù)據(jù)強一致需求(etcd 同步服務(wù))、最終一致需求(資源回收服務(wù))
○ 吞吐量敏感型(日志服務(wù))、延時敏感型(實時服務(wù))
○ CPU 計算密集型(簽名認證中心)、網(wǎng)絡(luò) IO 密集型(鏡像倉庫)
○ 在線業(yè)務(wù)(Web 服務(wù))、離線業(yè)務(wù)(鏡像檢查)
○ 批處理任務(wù)(計費日志推送)、定時任務(wù)(分布式定時任務(wù))
○ 長連接(WebSocket 服務(wù)網(wǎng)關(guān))、短連接(Hook 服務(wù))
○ ……
一旦決定做微服務(wù)架構(gòu),有很多現(xiàn)實問題擺在面前,比如技術(shù)選型、業(yè)務(wù)拆分問題、高可用、服務(wù)通信、服務(wù)發(fā)現(xiàn)和治理、集群容錯、配置管理、數(shù)據(jù)一致性問題、康威定律、分布式調(diào)用跟蹤、CI/CD、微服務(wù)測試,以及調(diào)度和部署等等……這并非一些簡單招數(shù)能夠化解。
作為主要編程語言是 Java 的容器服務(wù)來說,選擇 Spring Cloud 去搭配 K8S 是一個很自然的事情。Spring Cloud 和 K8S 都是很好的微服務(wù)開發(fā)和運行框架。從應(yīng)用的生命周期角度來看,K8S 覆蓋了更廣的范圍,特別像資源管理,應(yīng)用編排、部署與調(diào)度等,Spring Cloud 則對此無能為力。從功能上看,兩者存在一定程度的重疊,比如服務(wù)發(fā)現(xiàn)、負載均衡、配置管理、集群容錯等方面,但兩者解決問題的思路完全不同,Spring Cloud 面向的純粹是開發(fā)者,開發(fā)者需要從代碼級別考慮微服務(wù)架構(gòu)的方方面面,而 K8S 面向的是 DevOps 人員,提供的是通用解決方案,它試圖將微服務(wù)相關(guān)的問題都在平臺層解決,對開發(fā)者屏蔽復(fù)雜性。舉個簡單的例子,關(guān)于服務(wù)發(fā)現(xiàn),Spring Cloud 給出的是傳統(tǒng)的帶注冊中心 Eureka 的解決方案,需要開發(fā)者維護 Eureka 服務(wù)器的同時,改造服務(wù)調(diào)用方與服務(wù)提供方代碼以接入服務(wù)注冊中心,開發(fā)者需關(guān)心基于 Eureka 實現(xiàn)服務(wù)發(fā)現(xiàn)的所有細節(jié)。而 K8S 提供的是一種去中心化方案,抽象了服務(wù) (Service),通過 DNS+ClusterIP+iptables 解決服務(wù)暴露和發(fā)現(xiàn)問題,對服務(wù)提供方和服務(wù)調(diào)用方而言完全沒有侵入。
對于技術(shù)選型,我們有自己的考量,優(yōu)先選擇更穩(wěn)定的方案,畢竟穩(wěn)定性是云計算的生命線。我們并不是 “K8S 原教旨主義者”,對于前面提到的微服務(wù)架構(gòu)的各要點,我們有選擇基于 K8S 實現(xiàn),比如服務(wù)發(fā)現(xiàn)、負載均衡、高可用、集群容錯、調(diào)度與部署等。有選擇使用 Spring Cloud 提供的方案,比如同步的服務(wù)間通信;也有結(jié)合兩者的優(yōu)勢共同實現(xiàn),比如服務(wù)的故障隔離和熔斷;當(dāng)然,也有基于一些成熟的第三方方案和自研系統(tǒng)實現(xiàn),比如配置管理、日志采集、分布式調(diào)用跟蹤、流控系統(tǒng)等。
我們利用 K8S 管理微服務(wù)帶來的最大改善體現(xiàn)在調(diào)度和部署效率上。以我們當(dāng)前的情況來看,不同的服務(wù)要求部署在不同的機房和集群(聯(lián)調(diào)環(huán)境、測試環(huán)境、預(yù)發(fā)布環(huán)境、生產(chǎn)環(huán)境等),有著不同需求的軟硬件配置(內(nèi)存、SSD、安全、海外訪問加速等),這些需求已經(jīng)較難通過傳統(tǒng)的自動化工具實現(xiàn)。K8S 通過對 Node 主機進行 Label 化管理,我們只要指定服務(wù)屬性 (Pod label),K8S 調(diào)度器根據(jù) Pod 和 Node Label 的匹配關(guān)系,自動將服務(wù)部署到滿足需求的 Node 主機上,簡單而高效。內(nèi)置滾動升級策略,配合健康檢查 (liveness 和 readiness 探針)和 lifecycle hook 可以完成服務(wù)的不停服更新和回滾。此外,通過配置相關(guān)參數(shù)還可以實現(xiàn)服務(wù)的藍綠部署和金絲雀部署。集群容錯方面,K8S 通過副本控制器維持服務(wù)副本數(shù) (replica),無論是服務(wù)實例故障(進程異常退出、oom-killed 等)還是 Node 主機故障(系統(tǒng)故障、硬件故障、網(wǎng)絡(luò)故障等),服務(wù)副本數(shù)能夠始終保持在固定數(shù)量。
Docker 通過分層鏡像創(chuàng)造性地解決了應(yīng)用和運行環(huán)境的一致性問題,但是通常來講,不同環(huán)境下的服務(wù)的配置是不一樣的。配置的不同使得開發(fā)環(huán)境構(gòu)建的鏡像無法直接在測試環(huán)境使用,QA 在測試環(huán)境驗證過的鏡像無法直接部署到線上……導(dǎo)致每個環(huán)境的 Docker 鏡像都要重新構(gòu)建。解決這個問題的思路無非是將配置信息提取出來,以環(huán)境變量的方式在 Docker 容器啟動時注入,K8S 也給出了 ConfigMap 這樣的解決方案,但這種方式有一個問題,配置信息變更后無法實時生效。我們采用的是使用 Disconf 統(tǒng)一配置中心解決。配置統(tǒng)一托管后,從開發(fā)環(huán)境構(gòu)建的容器鏡像,可以直接提交到測試環(huán)境測試,QA 驗證通過后,上到演練環(huán)境、預(yù)發(fā)布環(huán)境和生產(chǎn)環(huán)境。一方面避免了重復(fù)的應(yīng)用打包和 Docker 鏡像構(gòu)建,另一方面真正實現(xiàn)了線上線下應(yīng)用的一致性。
Spring Cloud Hystrix 在我們的微服務(wù)治理中扮演了重要角色,我們對它做了二次開發(fā),提供更靈活的故障隔離、降級和熔斷策略,滿足 API 網(wǎng)關(guān)等服務(wù)的特殊業(yè)務(wù)需求。進程內(nèi)的故障隔離僅是服務(wù)治理的一方面,另一方面,在一個應(yīng)用混部的主機上,應(yīng)用間應(yīng)該互相隔離,避免進程間互搶資源,影響業(yè)務(wù) SLA。比如絕對要避免一個離線應(yīng)用失控占用了大量 CPU,使得同主機的在線應(yīng)用受影響。我們通過 K8S 限制了容器運行時的資源配額(以 CPU 和內(nèi)存限制為主),實現(xiàn)了進程間的故障和異常隔離。K8S 提供的集群容錯、高可用、進程隔離,配合 Spring Cloud Hystrix 提供的故障隔離和熔斷,能夠很好地實踐 “Design for Failure” 設(shè)計哲學(xué)。
服務(wù)拆分的好壞直接影響了實施微服務(wù)架構(gòu)的收益大小。服務(wù)拆分的難點往往在于業(yè)務(wù)邊界不清晰、歷史遺留系統(tǒng)改造難、數(shù)據(jù)一致性問題、康威定律等。從我們經(jīng)驗來看,對于前兩個問題解決思路是一樣的:1)只拆有確定邊界能獨立的業(yè)務(wù)。2)服務(wù)拆分本質(zhì)上是數(shù)據(jù)模型的拆分,上層應(yīng)用經(jīng)得起倒騰,底層數(shù)據(jù)模型經(jīng)不起倒騰。對于邊界模糊的業(yè)務(wù),即使要拆,只拆應(yīng)用不拆數(shù)據(jù)庫。
以下是我們從主工程里平滑拆出用戶服務(wù)的示例步驟:
1.將用戶相關(guān)的 UserService、UserDAO 分離出主工程,加上 UserController、UserDTO 等,形成用戶服務(wù),對外暴露 HTTP RESTful API。
2.將主工程用戶相關(guān)的 UserService 類替換成 UserFa?ade 類,采用 Spring Cloud Feign 的注解,調(diào)用用戶服務(wù) API。
3.主工程所有依賴 UserServce 接口的地方,改為依賴 UserFa?ade 接口,平滑過渡。
經(jīng)過以上三個步驟, 用戶服務(wù)獨立成一個微服務(wù),而整個系統(tǒng)代碼的復(fù)雜性幾乎沒有增加。
數(shù)據(jù)一致性問題在分布式系統(tǒng)中普遍存在,微服務(wù)架構(gòu)下會將問題放大,這也從另一個角度說明合理拆分業(yè)務(wù)的重要性。我們碰到的大部分數(shù)據(jù)一致性場景都是可以接受最終一致的。“定時任務(wù)重試+冪等” 是解決這類問題的一把瑞士軍刀,為此我們開發(fā)了一套獨立于具體業(yè)務(wù)的 “分布式定時任務(wù)+可靠事件” 處理框架,將任何需保證數(shù)據(jù)最終一致的操作定義為一種事件,比如用戶初始化、實例重建、資源回收、日志索引等業(yè)務(wù)場景。以用戶初始化為例,注冊一個用戶后,必須對其進行初始化,初始化過程是一個耗時的異步操作,包含租戶初始化、網(wǎng)絡(luò)初始化、配額初始化等等,這需要協(xié)調(diào)不同的系統(tǒng)來完成。我們將初始化定義為一種 initTenant 事件,將 initTenant 事件及上下文存入可靠事件表,由分布式定時任務(wù)觸發(fā)事件執(zhí)行,執(zhí)行成功后,清除該事件記錄;如果執(zhí)行失敗,則定時任務(wù)系統(tǒng)會再次觸發(fā)執(zhí)行。對于某些實時性要求較高的場景,則可以先觸發(fā)一次事件處理,再將事件存入可靠事件表。對于每個事件處理器來說,要在實現(xiàn)上確保支持冪等執(zhí)行,實現(xiàn)冪等執(zhí)行有多種方式,我們有用到布爾型狀態(tài)位,有用到 UUID 做去重處理,也有用到基于版本號做 CAS。這里不展開說了。
當(dāng)業(yè)務(wù)邊界與組織架構(gòu)沖突時,從我們的實踐經(jīng)驗來看,寧愿選擇更加符合組織架構(gòu)的服務(wù)拆分邊界。這也是一種符合康威定律的做法。康威定律說,系統(tǒng)架構(gòu)等同于組織的溝通結(jié)構(gòu)。組織架構(gòu)會在潛移默化中約束軟件系統(tǒng)架構(gòu)的形態(tài)。違背康威定律,非常容易出現(xiàn)系統(tǒng)設(shè)計盲區(qū),出現(xiàn) “兩不管” 互相推脫的局面,我們在團隊間、團隊內(nèi)都碰到過這種情況。
nbsp;
本文是《網(wǎng)易容器云平臺的微服務(wù)化實踐》系列文章的第一篇,介紹了容器技術(shù)和微服務(wù)架構(gòu)的關(guān)系,我們做容器云平臺的目的,以及簡單介紹了網(wǎng)易云容器服務(wù)基于 Kubernetes 和 Spring Cloud 的微服務(wù)化實踐經(jīng)驗。限于篇幅,有些微服務(wù)架構(gòu)要點并未展開,比如服務(wù)通信、服務(wù)發(fā)現(xiàn)和治理、配置管理等話題;有些未提及,比如分布式調(diào)用跟蹤、CI/CD、微服務(wù)測試等話題,這些方面的實踐經(jīng)驗會在后續(xù)的系列文章中再做分享。實踐微服務(wù)架構(gòu)的方式有千萬種,我們探索并實踐了其中的一種可能性,希望可以給大家一個參考。
網(wǎng)易云計算基礎(chǔ)服務(wù)深度整合了 IaaS、PaaS 及容器技術(shù),提供彈性計算、DevOps 工具鏈及微服務(wù)基礎(chǔ)設(shè)施等服務(wù),幫助企業(yè)解決 IT、架構(gòu)及運維等問題,使企業(yè)更聚焦于業(yè)務(wù),是新一代的云計算平臺,點擊可免費試用。
文章來源: 網(wǎng)易云社區(qū)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/25285.html
摘要:德邦快遞創(chuàng)始于年,從專于傳統(tǒng)零擔(dān)業(yè)務(wù)到現(xiàn)在全面發(fā)力大件快遞,業(yè)務(wù)量正處于高速增長中。網(wǎng)易云輕舟微服務(wù)是圍繞應(yīng)用和微服務(wù)打造的一站式平臺,幫助用戶快速實現(xiàn)易接入易運維的微服務(wù)解決方案。 歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運營經(jīng)驗。 2018年7月31日,由杭州市政府、賽迪以及網(wǎng)易主辦的2018中國杭州云創(chuàng)大會于杭州國際博覽中心如期舉辦,大會以開放·生態(tài)·賦能為主題,匯聚行業(yè)領(lǐng)袖、技...
摘要:劉超,網(wǎng)易云計算首席架構(gòu)師,有多年的云計算架構(gòu)與開發(fā)經(jīng)歷,積累了豐富的企業(yè)級應(yīng)用的微服務(wù)化,容器化實戰(zhàn)經(jīng)驗。近日,記者對劉超進行了采訪,跟大家分享了微服務(wù)實戰(zhàn)的挑戰(zhàn)和一些常見的微服務(wù)誤解,以及他對微服務(wù)發(fā)展趨勢的判斷。 劉超,網(wǎng)易云計算首席架構(gòu)師,有10多年的云計算架構(gòu)與開發(fā)經(jīng)歷,積累了豐富的企業(yè)級應(yīng)用的微服務(wù)化,容器化實戰(zhàn)經(jīng)驗。劉超將擔(dān)任今年 5 月份 QCon 全球軟件開發(fā)大會廣州...
摘要:近日,網(wǎng)易云通過認證,正式成為官方認可的服務(wù)提供商,也標(biāo)志著網(wǎng)易云在云原生領(lǐng)域的技術(shù)實力得到了業(yè)界認可。同時,網(wǎng)易云曾多次主辦,也是技術(shù)的積極布道者。 近日,網(wǎng)易云通過KCSP認證,正式成為CNCF官方認可的Kubernetes服務(wù)提供商,也標(biāo)志著網(wǎng)易云在云原生領(lǐng)域的技術(shù)實力得到了業(yè)界認可。 showImg(https://segmentfault.com/img/bVbqb3a?w=...
摘要:以推出輕舟微服務(wù)平臺的網(wǎng)易云為代表,云計算公司正在微服務(wù)領(lǐng)域發(fā)力,促進企業(yè)數(shù)字化創(chuàng)新。以網(wǎng)易云輕舟微服務(wù)平臺為例,該平臺已經(jīng)在物流工業(yè)和金融等領(lǐng)域得到了深度應(yīng)用。 所謂數(shù)字化轉(zhuǎn)型升級,就是以數(shù)字技術(shù)優(yōu)化傳統(tǒng)資源,企業(yè)需要謹慎地選擇合適的技術(shù)逐步完成自己的數(shù)字化戰(zhàn)略。以推出輕舟微服務(wù)平臺的網(wǎng)易云為代表,云計算公司正在微服務(wù)領(lǐng)域發(fā)力,促進企業(yè)數(shù)字化創(chuàng)新。那么,微服務(wù)對數(shù)字化轉(zhuǎn)型意味著什么?...
摘要:目前,網(wǎng)易云輕舟微服務(wù)平臺已經(jīng)應(yīng)用于銀行證券視頻監(jiān)控物流工業(yè)等行業(yè)不少中大型企業(yè),幫助其實施微服務(wù)化改造,建設(shè)符合行業(yè)特點的業(yè)務(wù)中臺,支撐企業(yè)數(shù)字化戰(zhàn)略的落地。 微服務(wù)技術(shù)由于天生支持快速迭代、彈性擴展的特點,使企業(yè)能夠在不確定性下提升發(fā)展速度及抗風(fēng)險能力,受到了越來越多的關(guān)注。當(dāng)前,云服務(wù)商紛紛試水微服務(wù)產(chǎn)品,最為典型的,當(dāng)屬推出輕舟微服務(wù)平臺、劍指整個微服務(wù)應(yīng)用生命周期的網(wǎng)易云。 ...
閱讀 3197·2021-11-10 11:36
閱讀 3145·2021-11-02 14:39
閱讀 1726·2021-09-26 10:11
閱讀 4928·2021-09-22 15:57
閱讀 1685·2021-09-09 11:36
閱讀 2053·2019-08-30 12:56
閱讀 3487·2019-08-30 11:17
閱讀 1701·2019-08-29 17:17