天天看點

如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結

如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結

作者 | 王科懷(行松)

來源 |

阿裡巴巴雲原生公衆号

微服務治理面臨的挑戰

在業務初期,因人手有限,想要快速開發并上線産品,很多團隊使用單體的架構來開發。但是随着公司的發展,會不斷往系統裡面添加新的業務功能,系統越來越龐大,需求不斷增加,越來越多的人也會加入到開發團隊,代碼庫也會增速的膨脹,慢慢的單體應用變得越來越臃腫,可維護性和靈活性逐漸降低,維護成本越來越高。

如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結

這個時候很多團隊會把單體應用架構改為微服務的架構,解決單體應用的問題。但随着微服務越來越多,運維投入會越來越大,需要保證幾十甚至幾百個服務正常運作與協作,這給運維帶來了很大的挑戰,下面從軟體生命周期的角度來分析這些挑戰:

  • 開發測試态
    • 如何實作開發、測試、線上環境隔離?
    • 如何快速調試本地變更?
    • 如何快速部署本地變更?
  • 釋出态
    • 如何設計服務釋出政策?
    • 如何無損下線舊版本服務?
    • 如何實作對新版本服務灰 度測試?
  • 運作态
    • 線上問題如何排查?有什麼工具可以利用呢?
    • 對于服務品質差的節點如何處理?
    • 對于完全不工作的執行個體我們如何恢複?

面對以上問題,Serverless 應用引擎在這方面都做了哪些工作?

Serverless 應用引擎

如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結

如上圖所示,Serverless 應用引擎(SAE)基于神龍 + ECI + VPC + SLB + NAS 等 IaaS 資源,建構了一個 Kubernetes 叢集,在此之上提供了應用管理和微服務治理的一些能力。它可以針對不同應用類型進行托管,比如 Spring Cloud 應用、Dubbo 應用、HSF 應用、Web 應用和多語言應用。并且支援 Cloudtoolkit 插件、雲效 RDC / Jenkins 等開發者工具。在 Serverless 應用引擎上,零代碼改造就可以把 Java 微服務的應用遷移到 Serverless。

總的來說,Serverless 應用引擎能夠提供成本更優、效率更高的一站式應用托管方案,零門檻、零改造、零容器基礎,即可享受 Serverless + K8s + 微服務帶來的技術紅利。

微服務治理實踐

1. 開發态實踐

1)多環境管理

如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結
  • 多租戶共有一個注冊中心,通過不同的租戶對流量進行隔離;更進一步可以通過網絡 VPC 進行環境隔離;
  • 提供環境級别的運維操作,比如一鍵停止和拉起整個環境的功能;
  • 提供環境級别的配置管理;
  • 提供環境級别的網關路由流量管理。

2)雲端聯調

Serverless 應用引擎(SAE)基于 Alibaba CloudToolkit 插件+ 跳闆機可以實作:

  • 本地服務訂閱并注冊到雲端 SAE 内置的注冊中心;
  • 本地服務可以和雲端 SAE 服務互相調用。
如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結

如上圖所示,在實作的時候使用者需要有一個 ECS 代理伺服器,實際注冊的是 ECS 代理伺服器到 SAE 的注冊中心,IDEA 在安裝 Cloudtoolkit 插件以後,在啟動程序時,會在本地拉起一個通道服務,這個通道服務會連上 ECS 代理伺服器,本地所有的請求都會轉到 ECS 代理伺服器上,雲端對服務的調用也會通過 ECS 代理轉到本地,這樣就可以以最新的代碼在本地斷點調試,這就是雲端聯調的實作。

3)建構快速開發體系

如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結

代碼在本地完成聯調以後,要能快速地通過 Maven 插件和 IDEA-plugin,可以很快地一鍵部署到雲端的開發環境。

2. 釋出态實踐

1)應用釋出三闆斧

如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結
如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結
  • 可灰階:應用在釋出的過程中,運維平台一定要有釋出政策,包括單批、分批、金絲雀等釋出政策;同時還要支援流量的灰階;批次間也要允許自動/手動任選。
  • 可觀測:釋出過程可監控,白屏化實時檢視釋出的日志和結果,及時定位問題。
  • 可復原:允許人工介入控制釋出流程:異常中止、一鍵復原。

通過這三點可以讓應用釋出做到可灰階、可觀測、可復原。

2)微服務無損下線

在版本更換的過程中,SAE 是如何保證舊版本的微服務流量可以無損地下線掉?

如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結

上圖是微服務注冊和發行的整個流程,圖中有服務消費者和服務提供者,服務提供者分别有 B1、B2 兩台執行個體,服務消費者分别有 A1、A2 兩台執行個體。

B1、B2 把自己注冊到注冊中心,消費者從注冊中心重新整理服務清單,發現服務提供者 B1、B2,正常情況下,消費者開始調用 B1 或者 B2,服務提供者 B 需要釋出新版本,先對其中一個節點進行操作,如 B1,首先停止 Java 程序,服務停止過程又分為主動銷毀和被動銷毀,主動銷毀是準實時的,被動銷毀的時間由不同的注冊中心決定,最差的情況可能需要一分鐘。

如果應用是正常停止,Spring Cloud 和 Dubbo 架構的 ShutdownHook 能正常被執行,這一步的耗時基本上是可以忽略不計的。如果應用是非正常停止,比如說直接 Kill-9 的一個停止,或者是 Docker 鏡像建構的時候,Java 程序不是一号程序,且沒有把 Kill 信号傳遞給應用的話,那麼服務提供者不會主動去登出節點,它會等待注冊中心去發現、被動地去感覺服務下線的過程。

當微服務注冊中心感覺到服務下線以後,會通知服務消費者其中一個服務節點已下線,這裡有兩種方式:注冊中心的推送和消費者的輪巡。注冊中心重新整理服務清單,感覺到提供者已經下線一個節點,這一步對于 Dubbo 架構來說不存在,但對于 Spring Cloud 來說,它最差的重新整理時間是 30 秒。等消費者的服務清單更新以後,就不再調用下線節點 B。從第 2 步到第 6 步的過程中,注冊中心如果是 Eureka,最差的情況需要消耗兩分鐘;如果是 Nacos,最差的情況需要消耗 50 秒。

在這個時間内請求都有可能出現問題,是以釋出的時候會出現各種報錯。

如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結

經過上面的分析,在傳統的釋出流程中,用戶端有一個服務端調用報錯期,這是由于用戶端沒有及時感覺到服務端下線的執行個體造成的,這種情況主要是因為服務提供者借助微服務,通知消費者來更新服務提供的清單造成的。

如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結

那能否繞過注冊中心,服務提供者直接通知服務消費者?答案是肯定的。SAE 做了兩件事情,第一,服務提供者在應用釋出前,會主動向服務注冊中心登出應用,并将應用标記為已下線狀态,将原來停止程序階段的登出變成了 preStop 階段登出程序。

在接收到服務消費者的請求時,首先會正常處理本次請求,并且通知服務消費者此節點已經下線,在此之後消費者收到通知後,會立即重新整理自己的服務清單,在此之後服務消費者就不會再把請求發到服務提供者 B1 的執行個體上。

通過上面這個方案,就使得下線感覺時間大大縮短,從原來的分鐘級别做到準實時的,確定你的應用在下線時能夠做到業務無損。

3)基于标簽的灰階釋出

如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結

釋出政策分為分批釋出和灰階釋出,如何實作流量的灰階?從上面的架構圖中可以看到,在應用釋出之前,要配置一個灰階規則,比如按 uid 的取模餘值 =20 來作為灰階流量的規則,當應用釋出的時候,會對已釋出的節點辨別為一個灰階的版本,在這樣的情況下,當有流量進來時,微服務網關和消費者都會通過配置中心拿到在治理中心配置的灰階規則。

消費者的 Agent 也會從注冊中心拉取它所依賴的服務的一些資訊,當一個流量進到消費者時,會按照灰階規則來做比對,如果是灰階的流量,它會轉化到灰階的機器上;如果是正常流量,它會轉到正常的機器上,這是基于标簽實作的灰階釋出的具體邏輯。

3. 運作态實踐

1)強大的應用監控 & 診斷能力

如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結

運作态的執行個體,服務的運作過程中會出現這樣或者那樣的問題,怎麼去排查和解決它?

排查和解決的前提是必須具有強大的應用監控能力和診斷能力,SAE 內建了雲産品 ARMS,能夠讓跑在上面的 Java 微服務看到應用的調用關系拓撲圖,可以定位到你的 MySQL 慢服務方法的調用堆棧,進而定位到代碼級别的問題。

比如一個請求響應慢,業務出現問題,它可以定位到是哪個請求、哪個服務、服務的哪行代碼出現了問題,這樣就能為解決問題帶來很多便利。總的來說,就是我們要先有監控報警的能力,才能幫助我們更好地診斷服務營運過程中的問題。

2)故障隔離和服務恢複

上面說到我們通過監控、報警來排查、解決遇到的問題,那我們的系統能否主動去做一些事情呢?SAE 作為一個 Serverless 平台,具備很多自運維的能力,下圖中有兩個場景:

如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結
  • 場景 1:某應用營運過程中,某幾台機器由于磁盤滿或者主控端資源争搶,導緻 load 很高或網絡狀态差,用戶端出現調用逾時或者報錯。

面對這種情況,SAE 提供了服務治理能力,即離群摘除,它可以配置,當網絡逾時嚴重或者後端服務 5xx 報錯達到一定比例時,可以選擇把該節點從消費端服務清單中摘除,進而使得有問題的機器不再響應業務的請求,很好地保證業務的 SLA。

  • 場景 2:某應用運作過程中,因突發流量導緻記憶體耗盡,觸發 OOM。

這種情況下,通過 SAE 這種 Serverless 應用引擎,節點在配置健康檢查以後,節點裡的容器是可以重新拉起的,可以做到快速對程序進行恢複。

3)精準容量+限流降級+極緻彈性

如何通過 Serverless 提高 Java 微服務治理效率?微服務治理面臨的挑戰Serverless 應用引擎微服務治理實踐總結

基于 Serverless Paas 平台 SAE 和其他産品的互動,來達到整個運維态的閉環。

使用者在使用的時候,可以運用 PTS 壓測工具構造場景,然後得出來一些門檻值。比如可以對流量高峰所需要消耗的資源進行預估,這時就可以根據這些門檻值設計彈性政策。當業務系統達到請求比例時,就可以按照所設定的彈性政策來擴縮容自己的機器。

擴縮容在時間上,有可能還跟不上處理大批量的請求,這時可以通過和 AHAS 的互動,配置限流降級的能力。當有突發大流量時,首先可以用 AHAS 的能力把一些流量擋在門外,然後同時觸發 SAE 上應用的擴容政策去擴容執行個體,當這些執行個體擴容完成之後,整個機器的平均負載會下降,流量又重新放進來。從突發大流量到限流降級再到擴容,最後到流量達到正常狀态,這就是“精準容量+限流降級+極緻彈性”的最佳實踐模型。

總結

本文首先按照提出問題、解決問題的思路,闡述微服務在開發、釋出和運作态是如何解決問題的;再介紹如何通過 Serverless 産品和其他産品的互動,進而實作精準流量、限流降級和極緻彈性。

    • 通過注冊中心多租戶和網絡環境的隔離,并提供環境級别的能力;
    • 通過雲端聯調技術來快速調式本地變更;
    • 如果 IDE 插件快速部署本地變更。
    • 運維平台針對應用釋出需要具備可灰階、可觀測、 可復原;
    • 通過 MSE agent 能力實作服務無損下線;
    • 通過标簽路由提供了線上流量灰階測試的能力。
    • 建立強大應用監控和診斷能力;
    • 對服務品質差的節點具備離群摘除能力;
    • 對已經不工作的執行個體通過配置健康檢查能夠做到執行個體重新開機恢複業務;
    • 提供了精準容量+限流降級+極緻彈性模型。

作者簡介

王科懷,花名:行松,阿裡雲 SAE 技術研發,負責 SAE 産品 Runtime 層技術架構設計,專注于微服務、Serverless、應用托管領域,基于雲原生技術持續打造新一代應用托管平台。

本文整理自【Serverless Live 系列直播】2 月 1 日場

直播回看連結:

https://developer.aliyun.com/topic/serverless/practices

Serverless 電子書下載下傳

本書亮點:

  • 從架構演進開始,介紹 Serverless 架構及技術選型建構 Serverless 思維;
  • 了解業界流行的 Serverless 架構運作原理;
  • 掌握 10 大 Serverless 真實落地案例,活學活用。

下載下傳連結:

https://developer.aliyun.com/topic/download?id=1128