日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

网易容器云平台的微服务化实践

發(fā)布時間:2024/9/27 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网易容器云平台的微服务化实践 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

摘要:網(wǎng)易云容器平臺期望能給實施了微服務(wù)架構(gòu)的團(tuán)隊提供完整的解決方案和閉環(huán)的用戶體驗,為此從 2016 年開始,我們?nèi)萜鞣?wù)團(tuán)隊內(nèi)部率先開始進(jìn)行 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ù)團(tuán)隊中應(yīng)用。盡管以今天來看,大家從觀念上已經(jīng)逐漸認(rèn)可 “將鏡像定義為應(yīng)用交付標(biāo)準(zhǔn),將容器作為應(yīng)用運(yùn)行的標(biāo)準(zhǔn)環(huán)境” 的觀點,但還是有相當(dāng)一部分人在迷惑容器技術(shù)作為一個標(biāo)準(zhǔn),應(yīng)該怎么落地,怎樣才能大規(guī)模線上應(yīng)用,怎么玩才能真正解放生產(chǎn)力,促進(jìn)軟件交付效率和質(zhì)量?答案其實在應(yīng)用的架構(gòu)當(dāng)中。

?

微服務(wù)架構(gòu)不是因 Docker 容器技術(shù)而生,但確實是因容器技術(shù)而火。容器技術(shù)提供了一致性的分發(fā)手段和運(yùn)行環(huán)境,使得只有微服務(wù)化后的應(yīng)用架構(gòu),才能配合容器發(fā)揮其最大價值。而微服務(wù)化架構(gòu)引入了很大的復(fù)雜性,只有應(yīng)用容器化以及規(guī)模化的容器編排與調(diào)度才能避免運(yùn)維效率下降。容器技術(shù)和微服務(wù)化架構(gòu)之間本是一種相輔相成的互補(bǔ)關(guān)系。

?

網(wǎng)易容器云平臺的前身是網(wǎng)易應(yīng)用自動部署平臺 (OMAD),它能夠利用 IaaS 云提供的基礎(chǔ)設(shè)施,實現(xiàn)包括構(gòu)建和部署一體化在內(nèi)的整個應(yīng)用生命周期管理。2014 年,以 Docker 為代表的容器技術(shù)進(jìn)入大眾視野,我們驚喜地發(fā)現(xiàn),容器技術(shù)是自動部署平臺從工具型應(yīng)用進(jìn)化為平臺型應(yīng)用過程中最重要的一塊拼圖。原本用戶需要初始化主機(jī),然后借助自動部署平臺完成應(yīng)用的構(gòu)建和部署。引入容器技術(shù)之后,用戶從功能開發(fā)到測試到一鍵部署上線,整個應(yīng)用交付過程中不用關(guān)心主機(jī)初始化、主機(jī)間通信、實例調(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ù)這一抽象提供高性能的容器集群管理方案,支持彈性伸縮、垂直擴(kuò)容、灰度升級、服務(wù)發(fā)現(xiàn)、服務(wù)編排、錯誤恢復(fù)、性能監(jiān)測等功能,滿足用戶提升應(yīng)用交付效率和快速響應(yīng)業(yè)務(wù)變化的需求。網(wǎng)易云容器平臺期望能給實施了微服務(wù)架構(gòu)的團(tuán)隊提供完整的解決方案和閉環(huán)的用戶體驗,為此從 2016 年開始,我們?nèi)萜鞣?wù)團(tuán)隊內(nèi)部率先開始進(jìn)行 dogfooding 實踐,一方面檢驗容器云平臺能不能支撐得起容器服務(wù)本身的微服務(wù)架構(gòu),另一方面通過微服務(wù)化實踐經(jīng)驗反哺容器云平臺產(chǎn)品設(shè)計,這是一次很有趣的嘗試,也是我們分享容器云平臺微服務(wù)化架構(gòu)實踐的初衷。

?

在談容器服務(wù)的微服務(wù)架構(gòu)實踐之前,有必要先把網(wǎng)易云容器服務(wù)大致做個介紹。目前網(wǎng)易云容器服務(wù)團(tuán)隊以 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ù)(裸機(jī)服務(wù))

  • 同步通信(用戶中心)、異步通信(構(gòu)建服務(wù))

  • 數(shù)據(jù)強(qiáng)一致需求(etcd 同步服務(wù))、最終一致需求(資源回收服務(wù))

  • 吞吐量敏感型(日志服務(wù))、延時敏感型(實時服務(wù))

  • CPU 計算密集型(簽名認(rèn)證中心)、網(wǎng)絡(luò) IO 密集型(鏡像倉庫)

  • 在線業(yè)務(wù)(Web 服務(wù))、離線業(yè)務(wù)(鏡像檢查)

  • 批處理任務(wù)(計費(fèi)日志推送)、定時任務(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ùn)行框架。從應(yīng)用的生命周期角度來看,K8S 覆蓋了更廣的范圍,特別像資源管理,應(yīng)用編排、部署與調(diào)度等,Spring Cloud 則對此無能為力。從功能上看,兩者存在一定程度的重疊,比如服務(wù)發(fā)現(xiàn)、負(fù)載均衡、配置管理、集群容錯等方面,但兩者解決問題的思路完全不同,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ā)者維護(hù) Eureka 服務(wù)器的同時,改造服務(wù)調(diào)用方與服務(wù)提供方代碼以接入服務(wù)注冊中心,開發(fā)者需關(guān)心基于 Eureka 實現(xiàn)服務(wù)發(fā)現(xiàn)的所有細(xì)節(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)、負(fù)載均衡、高可用、集群容錯、調(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ù)要求部署在不同的機(jī)房和集群(聯(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 主機(jī)進(jìn)行 Label 化管理,我們只要指定服務(wù)屬性 (Pod label),K8S 調(diào)度器根據(jù) Pod 和 Node Label 的匹配關(guān)系,自動將服務(wù)部署到滿足需求的 Node 主機(jī)上,簡單而高效。內(nèi)置滾動升級策略,配合健康檢查 (liveness 和 readiness 探針)和 lifecycle hook 可以完成服務(wù)的不停服更新和回滾。此外,通過配置相關(guān)參數(shù)還可以實現(xiàn)服務(wù)的藍(lán)綠部署和金絲雀部署。集群容錯方面,K8S 通過副本控制器維持服務(wù)副本數(shù) (replica),無論是服務(wù)實例故障(進(jìn)程異常退出、oom-killed 等)還是 Node 主機(jī)故障(系統(tǒng)故障、硬件故障、網(wǎng)絡(luò)故障等),服務(wù)副本數(shù)能夠始終保持在固定數(shù)量。

Docker 通過分層鏡像創(chuàng)造性地解決了應(yīng)用和運(yùn)行環(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ù)需求。進(jìn)程內(nèi)的故障隔離僅是服務(wù)治理的一方面,另一方面,在一個應(yīng)用混部的主機(jī)上,應(yīng)用間應(yīng)該互相隔離,避免進(jìn)程間互搶資源,影響業(yè)務(wù) SLA。比如絕對要避免一個離線應(yīng)用失控占用了大量 CPU,使得同主機(jī)的在線應(yīng)用受影響。我們通過 K8S 限制了容器運(yùn)行時的資源配額(以 CPU 和內(nèi)存限制為主),實現(xiàn)了進(jìn)程間的故障和異常隔離。K8S 提供的集群容錯、高可用、進(jìn)程隔離,配合 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ù)的示例步驟:


  • 將用戶相關(guān)的 UserService、UserDAO 分離出主工程,加上 UserController、UserDTO 等,形成用戶服務(wù),對外暴露 HTTP RESTful API。

  • 將主工程用戶相關(guān)的 UserService 類替換成 UserFa?ade 類,采用 Spring Cloud Feign 的注解,調(diào)用用戶服務(wù) API。

  • 主工程所有依賴 UserServce 接口的地方,改為依賴 UserFa?ade 接口,平滑過渡。


  • 經(jīng)過以上三個步驟, 用戶服務(wù)獨立成一個微服務(wù),而整個系統(tǒng)代碼的復(fù)雜性幾乎沒有增加。

    ?

    數(shù)據(jù)一致性問題在分布式系統(tǒng)中普遍存在,微服務(wù)架構(gòu)下會將問題放大,這也從另一個角度說明合理拆分業(yè)務(wù)的重要性。我們碰到的大部分?jǐn)?shù)據(jù)一致性場景都是可以接受最終一致的。“定時任務(wù)重試+冪等” 是解決這類問題的一把瑞士軍刀,為此我們開發(fā)了一套獨立于具體業(yè)務(wù)的 “分布式定時任務(wù)+可靠事件” 處理框架,將任何需保證數(shù)據(jù)最終一致的操作定義為一種事件,比如用戶初始化、實例重建、資源回收、日志索引等業(yè)務(wù)場景。以用戶初始化為例,注冊一個用戶后,必須對其進(jìn)行初始化,初始化過程是一個耗時的異步操作,包含租戶初始化、網(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) “兩不管” 互相推脫的局面,我們在團(tuán)隊間、團(tuán)隊內(nèi)都碰到過這種情況。

    ?

    本文是《網(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)的方式有千萬種,我們探索并實踐了其中的一種可能性,希望可以給大家一個參考。



    PS:推薦一個容器技術(shù)線上直播,講師來自騰訊、華為、思科、58同城、美麗聯(lián)合、當(dāng)當(dāng)?shù)?位一線專家,議題涵蓋容器云、微服務(wù)、servicemesh等最新實踐,具體直播時間為本周六(12月16日),歡迎掃描下方圖片中二維碼報名參加。





    總結(jié)

    以上是生活随笔為你收集整理的网易容器云平台的微服务化实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。