致傳統企業朋友:不夠痛就別微服務,有坑 (2)

 

此文已由做者劉超受權網易雲社區發佈。前端

歡迎訪問網易雲社區,瞭解更多網易技術產品運營經驗。spring

 

3.4. 階段二有什麼問題嗎?數據庫

 

其實大部分的企業,到了這個階段,已經能夠解決大部分的問題了。緩存

可以作到架構SOA化,基礎設施雲化的公司已是傳統行業在信息化領域的佼佼者了。安全

中臺開發組基本可以解決中臺的能力複用問題,持續集成也基本跑起來了,使得業務開發組的迭代速度明顯加快。架構

集中的中間件組或者架構組,能夠集中選型,維護,研究消息隊列,緩存等中間件。併發

在這個階段,因爲業務的穩定性要求,不少公司仍是會採用Oracle商用數據庫,也沒有什麼問題。框架

實現到了階段二,在同行業內,已經有必定的競爭優點了。運維

 

3.5. 什麼狀況下才會以爲階段二有問題?ssh

 

咱們發現,當傳統行業再也不知足於在本行業的領先地位,但願可以對接到互聯網業務的時候,上面的模式纔出現新的痛點。

對接互聯網所面臨的最大的問題,就是巨大的用戶量所帶來的請求量和數據量,會是原來的N倍,能不能撐得住,你們都內心沒底。

例若有的客戶推出互聯網理財秒殺搶購,原來的架構沒法承載近百倍的瞬間流量。

有的客戶對接了互聯網支付,甚至對接了國內最大的外賣平臺,而原來的ESB總線,就算擴容到最大規模(13個節點),也可能撐不住。

有的客戶雖然已經用了Dubbo實現了服務化,可是沒有熔斷,限流,降級的服務治理策略,有可能一個請求慢,高峯期波及一大片,或者請求所有接進來,最後都撐不住而掛一片。

有的客戶但願實現工業互連網平臺,但是接入的數據量動輒PB級別,若是扛的住是一個很大的問題。

有的客戶起初使用開源的緩存和消息隊列,分佈式數據庫,可是讀寫頻率到了必定的程度,就會出現各類奇奇怪怪的問題,不知道應該如何調優。

有的客戶發現,一旦到了互聯網大促級別,Oracle數據庫是確定扛不住的,須要從Oracle遷移到DDB分佈式數據庫,但是怎麼個遷移法,如何平滑過渡,內心沒底。

有的客戶服務拆分以後,原來原子化的操做分紅了兩個服務調用,如何仍然保持原子化,要不所有成功,要不所有失敗,須要分佈式事務,雖然業內有大量的分佈式方案,可是可以承載高併發支付的框架尚未。

當出現這些問題的時候,才應該考慮進入第三個階段,微服務化

 

4、階段三:組織DevOps化,架構微服務化,基礎設施容器化

 

             

 

 

4.1. 階段三的應用架構

 

從SOA到微服務化這一步很是關鍵,複雜度也比較高,上手須要謹慎。

爲了可以承載互聯網高併發,業務每每須要拆分的粒度很是的細,細到什麼程度呢?咱們來看下面的圖。

 

             

 

在這些知名的使用微服務的互聯網公司中,微服務之間的相互調用已經密密麻麻相互關聯成爲一個網狀,幾乎都看不出條理來。

爲何要拆分到這個粒度呢?主要是高併發的需求。

可是高併發不是沒有成本的,拆分紅這個粒度會有什麼問題呢?你會發現等拆完了,下面的這些措施一個都不能少。

  • 要使用消息隊列,將原來連續調用的多個服務異步化爲監聽消息隊列,從而縮短核心邏輯

  • 服務之間要設定熔斷,限流,降級策略,一旦調用阻塞應該快速失敗,而不該該卡在那裏,處於亞健康狀態的服務要被及時熔斷,不產生連鎖反應。非核心業務要進行降級,再也不調用,將資源留給核心業務。要在壓測到的容量範圍內對調用限流,寧肯慢慢處理,也不用一會兒都放進來,把整個系統沖垮。

  • 拆分紅的服務太多了,沒辦法一個個配置,須要統一的一個配置中心,將配置下發

  • 拆分紅的服務太多了,沒辦法一個個看日誌,須要統一的日誌中心,將日誌彙總

  • 拆分紅的服務太多了,很難定位性能瓶頸,須要經過APM全鏈路應用監控,發現性能瓶頸,及時修改

  • 拆分紅的服務太多了,不壓測一下,誰也不知道到底可以抗住多大的量,於是須要全鏈路的壓測系統。

應用層須要處理這十二個問題,最後一個都不能少,實施微服務,你作好準備了嗎?你真以爲攢一攢springcloud,就可以作好這些嗎?

 

4.2. 階段三的運維模式

 

業務的微服務化改造以後,對於運維的模式是有衝擊的。

 

            

若是業務拆成了如此網狀的細粒度,服務的數目就會很是的多,每一個服務都會獨立發佈,獨立上線,於是版本也很是多。

這樣環境就會很是的多,手工部署已經不可能,必須實施自動部署。好在在上一個階段,咱們已經實施了自動部署,或者基於腳本的,或者基於鏡像的,可是到了微服務階段都有問題。

若是基於腳本的部署,腳本原來多由運維寫,因爲服務太多,變化也多,腳本確定要不斷的更新,而每家公司的開發人員都遠遠多於運維人員,運維根原本不及維護自動部署的腳本。那腳本能不能由開發寫呢?通常是不可行的,開發對於運行環境瞭解有限,並且腳本沒有一個標準,運維沒法把控開發寫的腳本的質量。

基於虛擬機鏡像的就會好不少,由於須要腳本作的事情比較少,大部分對於應用的配置都打在鏡像裏面了。若是基於虛擬機鏡像進行交付,也能起到標準交付的效果。並且一旦上線有問題,也能夠基於虛擬機鏡像的版本進行回滾。

可是虛擬機鏡像實在是太大了,動不動幾百個G,若是一共一百個服務,每一個服務天天一個版本,一天就是10000G,這個存儲容量,誰也受不了。

這個時候,容器就有做用了。鏡像是容器的根本性發明,是封裝和運行的標準,其餘什麼namespace,cgroup,早就有了。

原來開發交付給運維的,是一個war包,一系列配置文件,一個部署文檔,可是因爲部署文檔更新不及時,經常出現運維部署出來出錯的狀況。有了容器鏡像,開發交付給運維的,是一個容器鏡像,容器內部的運行環境,應該體如今Dockerfile文件中,這個文件是應該開發寫的。

這個時候,從流程角度,將環境配置這件事情,往前推了,推到了開發這裏,要求開發完畢以後,就須要考慮環境部署的問題,而不能當甩手掌櫃。因爲容器鏡像是標準的,就不存在腳本沒法標準化的問題,一旦單個容器運行不起來,確定是Dockerfile的問題。

而運維組只要維護容器平臺就能夠,單個容器內的環境,交給開發來維護。這樣作的好處就是,雖然進程多,配置變化多,更新頻繁,可是對於某個模塊的開發團隊來說,這個量是很小的,由於5-10我的專門維護這個模塊的配置和更新,不容易出錯。本身改的東西本身知道。

若是這些工做量全交給少數的運維團隊,不但信息傳遞會使得環境配置不一致,部署量會大很是多。

容器做用之一就是環境交付提早,讓每一個開發僅僅多作5%的工做,就可以節約運維200%的工做,而且不容易出錯。

 

             

 

容器的另一個做用,就是不可改變基礎設施。

容器鏡像有個特色,就是ssh到裏面作的任何修改,重啓都不見了,恢復到鏡像原來的樣子,也就杜絕了原來咱們部署環境,這改改,那修修最後部署成功的壞毛病。

由於若是機器數目比較少,還能夠登陸到每臺機器上改改東西,一旦出了錯誤,比較好排查,可是微服務狀態下,環境如此複雜,規模如此大,一旦有個節點,由於人爲修改配置致使錯誤,很是難排查,因此應該貫徹不可改變基礎設施,一旦部署了,就不要手動調整了,想調整從頭走發佈流程。

這裏面還有一個概念叫作一切即代碼,單個容器的運行環境Dockerfile是代碼,容器之間的關係編排文件是代碼,配置文件是代碼,全部的都是代碼,代碼的好處就是誰改了什麼,Git裏面一清二楚,均可以track,有的配置錯了,能夠統一發現誰改的。

 

4.3. 階段三的組織形態

 

到了微服務階段,實施容器化以後,你會發現,然而原本原來運維該作的事情開發作了,開發的老大願意麼?開發的老大會投訴運維的老大麼?

這就不是技術問題了,其實這就是DevOps,DevOps不是不區分開發和運維,而是公司從組織到流程,可以打通,看如何合做,邊界如何劃分,對系統的穩定性更有好處。

 

 

             

 

其實開發和運維變成了一個融合的過程,開發會幫運維作一些事情,例如環境交付的提早,Dockerfile的書寫。

運維也能夠幫助研發作一些事情,例如微服務之間的註冊發現,治理,配置等,不可能公司的每個業務都單獨的一套框架,能夠下沉到運維組來變成統一的基礎設施,提供統一的管理。

實施容器,微服務,DevOps後,整個分工界面就變成了下面的樣子。

 

 

             

 

在網易就是這個模式,杭州研究院做爲公共技術服務部門,有運維部門管理機房,上面是雲平臺組,基於OpenStack開發了租戶可自助操做的雲平臺。PaaS組件也是雲平臺的一部分,點擊可得,提供SLA保障。容器平臺也是雲平臺的一部分,而且基於容器提供持續集成,持續部署的工具鏈。

微服務的管理和治理也是雲平臺的一部分,業務部門可使用這個平臺進行微服務的開發。

業務部門的中間件組或者架構組合雲平臺組溝通密切,主要是如何以正確的姿式使用雲平臺組件。

業務部門分前端組,業務開發組,中臺開發組。

 

5、如何實施微服務,容器化,DevOps

 

實施微服務,容器化,DevOps有不少的技術選型。

其中容器化的部分,Kubernetes當之無愧的選擇。可是Kubernetes可不只僅志在容器,他是爲微服務而設計的。對於實施微服務各方面都有涉及。

詳細分析參加爲何 kubernetes 自然適合微服務

 

             

可是Kubernetes對於容器的運行時生命週期管理比較完善,可是對於服務治理方面還不夠強大。

於是對於微服務的治理方面,多選擇使用Dubbo或者SpringCloud。使用Dubbo的存量應用比較多,相對於Dubbo來說,SpringCloud比較新,組件也比較豐富。可是SpringCloud的組件都不到開箱即用的程度,須要比較高的學習曲線。

 

             

 

於是基於Kubernetes和SpringCloud,就有了下面這個微服務,容器,DevOps的綜合管理平臺。包含基於Kubernetes的容器平臺,持續集成平臺,測試平臺,API網關,微服務框架,APM應用性能管理。

 

             

 

主要爲了解決從階段一到階段二,或者階段二到階段三的改進中的痛點。

下面咱們列舉幾個場景。

場景一:架構SOA拆分時,如何保證迴歸測試功能集不變

 

前面說過,服務拆分後,最怕的是拆完了引入一大堆的bug,經過理智確定不能保證拆分後功能集是不變的,於是須要有迴歸測試集合保證,只要測試集合經過了,功能就沒有太大的問題。

迴歸測試最好是基於接口的,由於基於UI的很危險,有的接口是有的,可是UI上不能點,這個接口若是有Bug,就被暫時隱藏掉了,當後面有了新的需求,當開發發現有個接口可以調用的時候,一調用就掛了。

 

有了基於Restful API的接口測試以後,能夠組成場景測試,將多個API調用組合成爲一個場景,例以下單,扣優惠券,減庫存,就是一個組合場景。

另外能夠造成測試集合,例如冒煙測試集合,當開發將功能交付給測試的時候,執行一下。再如平常測試集合,天天晚上跑一遍,看看當天提交的代碼有沒有引入新的bug。再如迴歸測試集合,上線以前跑一遍,保證大部分的功能是正確的。

 

場景二:架構SOA化的時候,如何統一管理並提供中臺服務

 

當業務要提供中臺服務的時候,中臺服務首先但願可以註冊到一個地方,當業務組開發業務邏輯的時候,可以在這個地方找到中臺的接口如何調用的文檔,當業務組的業務註冊上來的時候,能夠進行調用。

 

在微服務框架普通的註冊發現功能以外,還提供知識庫的功能,使得接口和文檔統一維護,文檔和運行時一致,從而調用方看着文檔就能夠進行調用。

另外提供註冊,發現,調用期間的鑑權功能,不是誰看到中臺服務都能調用,須要中臺管理員受權才能夠。

爲了防止中臺服務被惡意調用,提供帳戶審計功能,記錄操做。

 

場景三:服務SOA化的時候,如何保證關鍵服務的調用安全

有的服務很是關鍵,例如支付服務,和資金相關,不是誰想調用就能調用的,一旦被非法調用了,後果嚴重。

在服務治理裏面有路由功能,除了可以配置靈活的路由功能以外,還能夠配置黑白名單,能夠基於IP地址,也能夠基於服務名稱,配置只有哪些應用能夠調用,能夠配合雲平臺的VPC功能,限制調用方。

 

場景四:架構SOA化後,對外提供API服務,構建開放平臺

         

架構SOA化以後,除了對內提供中臺服務,不少能力也能夠開放給外部的合做夥伴,造成開放平臺。例如你是一家物流企業,除了在你的頁面上下單寄快遞以外,其餘的電商也能夠調用你的API來寄快遞,這就須要有一個API網關來管理API,對接你的電商只要登陸到這個API網關,就能看到API以及如何調用,API網關上面的文檔管理就是這個做用。

另外API網關提供接口的統一認證鑑權,也提供API接口的定時開關功能,靈活控制API的生命週期。

 

場景五:互聯網場景下的灰度發佈和A/B測試

 

接下來咱們切換到互聯網業務場景,常常會作A/B測試,這就須要API網關的流量分發功能。

例如咱們作互聯網業務,當上一個新功能的 時候,不清楚客戶是否喜歡,因而能夠先開放給山東的客戶,當HTTP頭裏面有來自山東的字段,則訪問B系統,其餘客戶仍是訪問A系統,這個時候能夠看山東的客戶是否都喜歡,若是都喜歡,就推向全國,若是不喜歡,就撤下來。

 

場景六:互聯網場景下的預發測試

 

這個也是互聯網場景下常常遇到的預發測試,雖然咱們在測試環境裏面測試了不少輪,可是因爲線上場景更加複雜,有時候須要使用線上真實數據進行測試,這個時候能夠在線上的正式環境旁邊部署一套預發環境,使用API網關將真實的請求流量,鏡像一部分到預發環境,若是預發環境可以正確處理真實流量,再上線就放心多了。

 

場景七:互聯網場景下的性能壓測

 

互聯網場景下要作線上真實的性能壓測,才能知道整個系統真正的瓶頸點。可是性能壓測的數據不能進真實的數據庫,於是須要進入影子庫,性能壓測的流量,也須要有特殊的標記放在HTTP頭裏面,讓通過的業務系統知道這是壓測數據,不進入真實的數據庫。

這個特殊的標記要在API網關上添加,可是因爲不一樣的壓測系統要求不同,於是須要API網關有定製路由插件功能,能夠隨意添加本身的字段到HTTP頭裏面,和壓測系統配合。

 

場景八:微服務場景下的熔斷,限流,降級

 

微服務場景下,大促的時候,須要進行熔斷,限流,降級。這個在API網關上能夠作,將超過壓測值的流量,經過限流,攔在系統外面,從而保證儘可能的流量,可以下單成功。

在服務之間,也能夠經過微服務框架,進行熔斷,限流,降級。Dubbo對於服務的控制在接口層面,SpringCloud對於服務的管理在實例層面,這兩個粒度不一樣的客戶選擇不同,都用Dubbo粒度太細,都用SpringCloud粒度太粗,因此須要能夠靈活配置。

 

             

 

場景九:微服務場景下的精細化流量管理。

 

             

 

在互聯網場景下,常常須要對於流量進行精細化的管理,能夠根據HTTP Header裏面的參數進行分流,例如VIP用戶訪問一個服務,非VIP用戶訪問另外一個服務,這樣能夠對高收入的用戶推薦更加精品的產品,增長連帶率。

 

網易雲計算基礎服務深度整合了 IaaS、PaaS 及容器技術,提供彈性計算、DevOps 工具鏈及微服務基礎設施等服務,幫助企業解決 IT、架構及運維等問題,使企業更聚焦於業務,是新一代的雲計算平臺,點擊可免費試用

 

 

免費體驗雲安全(易盾)內容安全、驗證碼等服務

更多網易技術、產品、運營經驗分享請點擊

 

 

相關文章:
【推薦】 如何搭建SBT編譯Scala開發的Android工程
【推薦】 考拉Android統一彈框

相關文章
相關標籤/搜索