服務治理過程演進

原文地址:http://javatar.iteye.com/blog/1345073前端

(1) 當服務愈來愈多時,服務URL配置管理變得很是困難,F5硬件負載均衡器的單點壓力也愈來愈大。 

此時須要一個服務註冊中心,動態的註冊和發現服務,使服務的位置透明。 

並經過在消費方獲取服務提供方地址列表,實現軟負載均衡和Failover,下降對F5硬件負載均衡器的依賴,也能減小部分紅本。 

(2) 當進一步發展,服務間依賴關係變得錯蹤複雜,甚至分不清哪一個應用要在哪一個應用以前啓動,架構師都不能完整的描述應用的架構關係。 

這時,須要自動畫出應用間的依賴關係圖,以幫助架構師理清理關係。 

(3) 接着,服務的調用量愈來愈大,服務的容量問題就暴露出來,這個服務須要多少機器支撐?何時該加機器? 

爲了解決這些問題,第一步,要將服務如今天天的調用量,響應時間,都統計出來,做爲容量規劃的參考指標。 

其次,要能夠動態調整權重,在線上,將某臺機器的權重一直加大,並在加大的過程當中記錄響應時間的變化,直到響應時間到達閥值,記錄此時的訪問量,再以此訪問量乘以機器數反推總容量。 

(4) 規模繼續擴大,應用之間再也不是扁平的對應關係,開始分層,好比核心數據層,業務集成層等,就算沒有出現循環依賴,也不容許從低層向高層依賴,以避免後續被逼循環依賴。 

這時,須要在註冊中心定義架構體系,列明有哪些層的定義,每一個服務暴露或引用時,都必須聲明本身應用屬於哪一層,這樣註冊中心能更快的發現架構的腐化現象。 

(5) 服務多了,溝通成本也開始上升,調某個服務失敗該找誰?服務的參數都有什麼約定? 

這時就須要登記每一個服務都是誰負責的,並創建一個服務的文檔庫,方便檢索。 

(6) 慢慢一些敏感數據也都服務化了,安全問題開始變得重要,誰能調該服務?如何受權? 

這樣的服務可能須要一個密碼,訪問時需帶着此密碼,但若是用密碼,要改密碼時,就會很不方便,全部的消費方都要改,因此動態生成令牌(Token)可能會更好,提供方將令牌告之註冊中心,由註冊中心決定是否告之消費方,這樣就能在註冊中心頁面上作複雜的受權模型。 

(7) 就算是不敏感的服務,也不是能任意調用,好比某服務忽然多了一個消費者,這個消費者的請求量直接把服務給拖跨了,其它消費者跟着一塊兒故障。 

首先服務提供方須要流控,當流程超標時,能拒絕部分請求,進行自我保護。 

其次,消費者上線前和提供者約定《服務質量等級協定(SLA)》,SLA包括消費者承諾天天調用量,請求數據量,提供方承諾響應時間,出錯率等,將SLA記錄在監控中心,定時與監控數據對比,超標則報警。 

(8) 雖然有SLA約定,若是不能控制,就只是君子協定,如何確保服務質量? 

好比:一個應用很重要,一個不那麼重要,它們調用同一個服務,這個服務就應該向重要應用傾斜,而不是一視同仁,當支撐不住時,應限制不重要應用的訪問,保障重要應用的可用,如何作到這一點呢。這時,就須要服務路由,控制不一樣應用訪問不一樣機器,好比: 
應用分離: 
consumer.application = foo => provider.host = 1,2,3 
consumer.application != foo => provider.host = 5,6 
讀寫分離: 
method.name = find*,get* => provider.host = 1,2,3 
method.name != find*,get* => provider.host = 5,6 

(9) 服務上線後,須要驗證服務是否可用,但因防火牆的限制,線下是不能訪問線上服務的,不得不先寫好一個測試Main,而後放到線上去執行,很是麻煩,而且容易忘記驗證。 

因此線上須要有一個自動運行的驗證程序,用戶只需在界面上填上要驗證的服務方法,以及參數值和指望的返回值,當有一個服務提供者上線時,將自動運行該用例,並將運行結果發郵件通知負責人。 

(10) 服務應用和Web應用是有區別的,它是一個後臺Daemon程序,不須要Tomcat之類的Web容器。但因公司以前以Web應用爲主,規範都是按Web應用的,因此不得不把服務跑在一個根本用不上的Web容器裏,而搭一個這樣的Web工程也很是費事。 

因此須要實現一個非Web的容器,只需簡單的Main加載Spring配置便可,並提供Maven模板工程,只需mvn dubbo:generate 便可建立一個五臟俱全的服務應用。 

(11) 開發服務的人愈來愈多,更注重開發效率,IDE的集成支持必不可少。 

經過插件,能夠在Eclipse中直接運行服務,提供方能夠直接填入測試數據測試服務,消費方能夠直接Mock服務不依賴提供方開發。 

(12) 由於暴露服務很簡單,服務的上線愈來愈隨意,有時候負責服務化的架構師都不知道有人上線了某個服務,使得線上服務魚龍混雜,甚至出現重複的服務,而服務下線比上線還困難。 

須要一個新服務上線審批流程,必須通過服務化的架構師審批過了,才能夠上線。 

而服務下線時,應先標識爲過期,而後通知調用方儘快修改調用,直到沒有人調此服務,才能下線。 

(13) 因服務接口設計的經驗一直在慢慢的積累過程當中,不少接口並不能一促而蹴,在修改的過程當中,如何保證兼容性,怎麼判斷是否兼容?另外,更深層次的,業務行爲兼容嗎? 

能夠根據使用的協議類型,分析接口及領域模型的變動是否兼容,好比:對比加減字段,方法簽名等。 

而業務上,可能須要基於自動迴歸測試用例,造成Technology Compatibility Kit (TCK),確保兼容升級。 

(14) 隨着服務的不停升級,總有些意想不到的事發生,好比cache寫錯了致使內存溢出,故障不可避免,每次核心服務一掛,影響一大片,人心慌慌,如何控制故障的影響面?服務是否能夠功能降級?或者資源劣化? 

應用間聲明依賴強度,哪些功能強依賴,哪些弱依賴,而後基於依賴強度,計算出影響面,並按期測試複查,增強關鍵路徑上的服務的優化和容錯,清理不應在關鍵路徑上的服務。 

提供容錯Mock數據,Mock數據也應能夠在註冊中心在運行時動態下發,當某服務不可用時,用Mock數據代替,能夠減小故障的發生,好比某驗權服務,當驗權服務所有掛掉後,直接返回false表示沒有權限,並打印Error日誌報警。 

另外,前端的頁面也應採用Portal進行降級,當該Portal獲取不到數據時,直接隱藏,或替換爲其它模塊展現,並提供功能開關,可人工干預是否展現,或限制多少流量能夠展現。 

(15) 當已有不少小服務,可能就須要組合多個小服務的大服務,爲此,不得不增長一箇中間層,暴露一個新服務,裏面分別調其它小服務,這樣的新服務業務邏輯少,卻帶來不少開發工做量。 

此時,須要一個服務編排引擎,內置簡單的流程引擎,只需用XML或DSL聲明如何聚合服務,註冊中心能夠直接下發給消費者執行聚合邏輯,或者部署通用的編排服務器,全部請求有編排服務器轉發。 

(16) 並非全部服務的訪問量都大,不少的服務都只有一丁點訪問量,卻須要部署兩臺提供服務的機器,進行HA互備,如何減小浪費的機器。 

此時可能須要讓服務容器支持在一臺機器上部署多個應用,能夠用多JVM隔離,也能夠用ClassLoader隔離。 

(17) 多個應用若是不是一個團隊開發的,部署在一臺機器上,頗有能夠誤操做,停掉了別人的服務。 

因此須要實現自動部署,全部的部署都無需人工干擾,最好是一鍵式部署。 

(18) 機器老是的閒時和忙時,或者冗餘機器防災,如何提升機器的利用率? 

即然已經能夠自動部署了,那根據監控數據,就能夠實現資源調度,根據應用的壓力狀況,自動添加機器並部署。

若是你的應用是國際化的,有中文站,美國站之類,由於時差,美國站的機器晚上閒的時候,可能正是中文站的白天忙時,能夠經過資源調度,分時段自動調配和部署雙方應用。 

按關鍵詞概括爲: 

1. 服務註冊與發現 

2. 軟負載均衡與容錯 

3. 服務監控與統計 

4. 服務容量評估 

5. 服務上線審批 

6. 服務下線通知 

7. 服務負責人 

8. 服務文檔 

9. 服務路由 

10. 服務編排 

11. 服務黑白名單 

12. 服務權限控制 

13. 服務依賴關係 

14. 服務分層架構 

15. 服務調用鏈跟蹤 

16. 故障傳導分析 

17. 服務降級 

18. 服務等級協定 

19. 服務自動測試 

20. 服務假裝容錯 

21. 服務兼容性檢測 

22. 服務使用狀況報告 

23. 服務權重動態調整 

24. 服務負載均衡調整 

25. 服務映射 

26. 服務模板工程 

27. 服務開發IDE 

28. 服務健康檢測 

29. 服務容器 

30. 服務自動部署 

31. 服務資源調度 java

相關文章
相關標籤/搜索