官术网_书友最值得收藏!

三、微服務架構關鍵技術

微服務平臺技術圖譜

微服務技術桟:

API Doc: Swagger UI

API Mock: Swagger Mock API

AOP基礎框架:Spring framework

微服務容器:Spring Boot

服務發布:Spring Web MVC

服務注冊中心:Spring Cloud-Eureka

服務路由:Spring Cloud-Ribbon

服務調用:Spring Cloud-Feign

服務熔斷器:Spring Cloud-Hystrix

安全認證:Spring Cloud-Security

服務配置中心:Apollo, Spring Cloud-Config

服務監控:Spring Boot Admin

關鍵技術架構與設計

我們從這9個方面來解析微服務關鍵技術架構與設計。

1、前端UI框架

兼容性

Vue是流行的前端框架,其對瀏覽器的兼容性較好,主流的操作系統和瀏覽器都支持。

vue響應式雙向數據綁定實現自動同步

vue.js采用數據劫持結合發布者-訂閱者的方式,通過Object.defineProperty()來劫持各個屬性的settergetter,在數據變動時,發布消息給訂閱者,觸發相應的監聽回調。

具體的來講,Vue.js通過Directives指令去對DOM做封裝,當數據發生變化,會通知指令去修改對應的DOM,數據驅動DOM的變化。vue.js還會對操作做一些監聽(DOM Listener),當我們修改視圖的時候,vue.js監聽到這些變化,從而改變數據。這樣就形成了數據的雙向綁定。

2、微服務容器

微服務運行的容器環境

我們來看一下微服務運行容器,要做可靠高效的微服務架構應用,實際上我們需要做的事情還是非常多的。如果沒有一個統一的微服務容器,這些能力在每個微服務組件中都需要建設一遍,而且會五花八門,也很難集成到一起。

微服務容器:負載均衡

微服務容器的基礎服務能力之一就是支持負載均衡。

1. 通常所說的負載均衡都指的是服務端負載均衡,其中分為硬件負載均衡和軟件負載均衡。硬件負載均衡主要通過在服務器節點之間安裝專門用于負載均衡的設備,比如F5等;而軟件負載均衡則是通過在服務器上安裝一些具有負載均衡功能或模塊的軟件來完成請求分發工作,比如Nigix等。

2. 硬件負載均衡的設備或是軟件負載均衡的軟件模塊都會維護一個下掛可用的服務端清單,通過心跳檢測來剔除故障的服務端節點以保證清單中都是可以正常訪問的服務端節點。當客戶端發送請求到負載均衡設備時,該設備按照某種算法(比如線性輪詢、按權重負載、按流量負載等)從維護的可用服務端清單中取出一臺服務端的地址,然后進行轉發。

3. 客戶端負載均衡和服務器負載均衡最大的不同點在于上面所提到的服務清單所存儲的位置。在客戶端負載均衡中,所有客戶端節點都維護著自己要訪問的服務端清單,而這些服務端的清單來自于服務注冊中心,建議使用Spring Cloud NetflixRibbon組件。

微服務容器:服務熔斷、容錯、升降級、限流

微服務容器的基礎服務能力之二就是服務熔斷、容錯、升降級、限流,在系統出現異常時提供故障恢復能力。

3、注冊中心

服務注冊與發現

接下來我們聊一下注冊發現,以前的單塊應用之間互相調用時配置個IP就行了,但在微服務架構下,服務提供者會有很多,手工配置IP地址又變成了一個不可行的事情。那么服務自動注冊發現的方案就解決了這個問題。

我們的服務注冊發現能力是依賴SpringCloud Eureka組件實現的。服務在啟動的時候,會將自己要發布的服務注冊到服務注冊中心,運行時,如果需要調用其他微服務的接口,那么就要先到注冊中心獲取服務提供者的地址,拿到地址后,通過微服務容器內部的簡單負載均衡器進行路由。

一般情況,系統內微服務的調用都通過這種客戶端負載均衡的模式進行,否則就需要有很多的負載均衡進程。跨業務系統的服務調用,也可以采用這種去中心化的路由方式。當然采用SOA的模式,由中心化的服務網管來管理系統間的調用也是另一種選擇,要結合企業的IT現狀和需求來決定。

4、配置中心

集中配置管理

微服務分布式環境下,一個系統拆分為很多個微服務,一定要告別投產或運維手工修改配置的方式。需要采用集中配置管理的方式來提升運維的效率。

配置文件主要有運行前的靜態配置和運行期的動態配置兩種。靜態配置通常是在編譯部署包之前設置好。動態配置則是系統運行過程中需要調整的系統變量或者業務參數。

要想做到集中的配置管理,那么需要注意以下幾點:

1. 配置與介質分離,這個就需要通過制定規范的方式來控制。千萬別把配置放在Jar包里。

2. 配置的方式要統一,格式、讀寫方式、變更熱更新的模式盡量統一,要采用統一的配置框架

3. 運行時需要有個配置中心來統一管理業務系統中的配置信息,這個就需要平臺來提供配置中心服務和配置管理門戶。

配置修改同步交互

配置修改后通過推送或者定時拉取的方式更新并緩存到應用程序所在的微服務容器中供應用程序使用。

高可用運行架構設計

配置中心有兩種部署模式

1. 高可用模式,見上圖,支撐大規模微服務訪問時根據負載情況可以對“配置查詢同步服務”進行橫向擴展

2. ALL-IN-ONE模式,配置變更服務、配置查詢服務合并為一個進程。適合支撐少量系統的場景使用。

配置中心可以支持高可用模式部署,滿足金融行業的要求。

5、監控中心

基于Skywalking定制實現

SkyWalking主要就是通過收集各種格式的數據進行存儲,然后展示。所以我們需要關注的是SkyWalking CollecterSkyWalking UI和存儲設備。

APM探針

JavaAgentJDK 1.5以后引入的,也可以叫做Java代理。

JavaAgent是運行在main方法之前的攔截器,它內定的方法名叫premain,也就是說先執行premain方法然后再執行main方法。

使用agent技術構建一個獨立于應用程序的代理程序(即為Agent),用來協助監測、運行甚至替換其他JVM上的程序。使用它可以實現虛擬機級別的AOP功能。

APM全鏈路運行監控

調用鏈跟蹤分析:把同一TraceIDSpan收集起來,按時間排序就是timeline。把ParentID串起來就是調用棧。

實時分析:對單條日志直接分析,不做匯總,重組。得到當前QPS,延遲。

離線分析:按TraceID匯總,通過SpanIDParentID還原調用關系,分析鏈路形態。

6、日志中心

日志中心架構

日志分析是運維工程師解決系統故障,發現問題的主要手段。日志主要包括系統日志、應用程序日志和安全日志。系統運維和開發人員可以通過日志了解服務器軟硬件信息、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日志可以了解服務器的負荷,性能安全性,從而及時采取措施糾正錯誤。

通常,日志被分散的儲存在不同的設備上。如果你管理數十上百臺服務器,你還在使用依次登錄每臺機器的傳統方法查閱日志,即繁瑣又效率低下。為此,我們使用集中化的日志管理,將所有服務器上的日志收集匯總。

集中化管理日志后,日志的統計和檢索又成為一件比較麻煩的事情,這時實時日志分析ELK平臺能夠完美的解決上述的問題,ELKElasticSearchLogstashKiabana三個開源工具組成。

規范日志與流水,問題追根溯源

作為一個微服務應用平臺除了提供支撐開發和運行的技術組件和框架之外,還應該提供一些運維友好的經驗總結,我們推薦的日志與流水實現如下:

1. 先來看日志,平臺應提供的日志主要有三種,系統日志,引擎日志還有跟蹤日志。有了這些日志,在出問題的時候能夠幫助我們獲取一些關鍵信息進行問題定位。

2. 要想做到出了問題能夠追根溯源,那么右邊的這些流水號的設計也是非常重要的,日志與各種流水號配合,能夠讓我們快速定位問題發生的具體時間地點以及相關信息,能夠快速還原業務交易全鏈路。對這些日志與流水的細節處理,對于系統運維問題定位有非常大的幫助,沒有這些有用的日志內容,ELK日志收集套件搭建的再漂亮,收一堆垃圾日志也是沒用的。

通常開源框架只是提供個框架由開發人員自由發揮,而設計一個平臺則一定要考慮直接提供統一規范的基礎能力。

7API Gateway

基于Spring Cloud NetflixZuul組件定制實現

異步非阻塞模式啟動的線程很少,基本上一個CPU core上只需啟一個處理線程,它使用的線程資源就很少,上下文切換(Context Switch)開銷也少。非阻塞模式可以接受的連接數大大增加,可以簡單理解為請求來了只需要進隊列,這個隊列的容量可以設得很大,只要不超時,隊列中的請求都會被依次處理。

API Gateway邏輯架構

API網關就像整個系統的門面一樣,所有的外部訪問都經過它實現調度、過濾、請求路由、負載均衡、校驗等等。

API Gateway功能

API網關上還可以實現更多更復雜的功能。

8IAMIdentity and Access Management

IAM架構

IAM為企業提供統一的賬號管理視角,對所有基于賬號的管理、認證、授權、審計進行集中的統一管理,提高了賬號管理的安全,幫助系統管理員提高了工作效率,降低了管理負擔,同時改善了普通用戶在不同資源中登錄認證的重復繁瑣過程,為日常工作提供了更高的安全性。

統一用戶中心

IAM可以為企業所有的資源使用人員如普通用戶、系統管理人員、駐場代維人員、合作伙伴、臨時工作人員等定義主賬號,按照公司的組織方式對人員進行管理。通過一對一的主賬號管理模式,可以在該平臺實現對所有資源使用人員進行集中定義、集中維護等生命周期管理。

統一認證與鑒權

安全認證方面,我們基于Spring Security結合Auth2再加上JWTJson web token)做安全令牌,實現統一的安全認證與鑒權,使得微服務之間能夠按需隔離和安全互通。認證鑒權一定是個公共的服務,而不是多個系統各自建設。

9、微服務管理

服務管理機制

? 服務提供者:

1. 服務注冊

在服務注冊時,需要確認下eureka.client.register-with-eureka=true參數是否正確,默認為true,若設置為false將不會啟動注冊操作。

2. 服務同步

由于服務注冊中心之間因互相注冊為服務,當服務提供者發送注冊請求到一個服務注冊中心,它會將該請求轉發給集群中相連的其他注冊中心,從而實現注冊中心之間的服務同步。

3. 服務續約

eureka.instance.lease-renewal-interval-in-seconds參數用于定義服務續約任務的調用間隔時間默認30秒。

eureka.instance.lease-exptration-duration-in-seconds參數用于定義服務失效時間,默認為90秒。

? 服務消費者:

1. 獲取服務

當我們啟動服務消費者時候,它會發送一個REST請求給服務注冊中心,來獲取上面注冊的服務清單。為了性能考慮,Eureka Server會維護一份只讀的服務清單來返回給客戶端,同時該緩存清單會每隔30秒更新一次。

2. 服務調用

服務消費者在獲取服務清單后,通過服務名可以獲得具體提供服務的實例名和該實例的元數據。因為有這些服務實例的詳細信息,所以客戶端可以根據自己的需要決定具體調用哪個實例。

單服務異常導致雪崩

采用微服務架構后,服務之間會有錯綜復雜的依賴關系,例如,一個前端請求一般會依賴于多個后端服務。

在微服務架構中,存在著那么多的服務單元,若一個單元出現故障,就很容易因依賴關系而引發故障的蔓延,最終導致整個系統的癱瘓,造成所謂的雪崩效應,這樣的架構較傳統架構更加不穩定。

自我保護

當網絡分區故障發生時,微服務與Eureka Server之間無法正常通信,而微服務本身是正常運行的,此時不應該移除這個微服務,所以引入了自我保護機制。

服務注冊到Eureka Server之后,會維護一個心跳連接,告訴Eureka Server自己還活著。Eureka Server在運行期間,會統計心跳失敗的比例在15分鐘之內是否低于85%,如果出現低于的情況,Eureka Server會將當前的實例注冊信息保護起來,讓這些實例不會過期,盡可能保護這些注冊信息。

服務容錯處理

1. 資源隔離:包括線程池隔離和信號量隔離,限制調用分布式服務的資源使用,某一個調用的服務出現問題不會影響其他服務調用

2. 降級機制:超時降級、資源不足時(線程或信號量)降級,降級后可以配合降級接口返回托底數據。

3. 熔斷:當失敗率達到閥值自動觸發降級(如因網絡故障/超時造成的失敗率高),熔斷器觸發的快速失敗會進行快速恢復。

4. 緩存:提供了請求緩存、請求合并實現。


推薦閱讀

構建金融+場景化的生態服務平臺

數字化轉型背景下的金融交易業務中臺實踐

普元數據服務監控解密


關于作者:黃豆,普元信息數字化金融研究院研究員,擅長系統分析和架構設計、金融三級密鑰安全體系及信息安全保障、虛擬化和云計算技術、JavaEE技術;參與研發的神州商橋電子商務平臺獲得“全國電子商務示范單位”稱號;帶領團隊研發的國電通云終端系統在國網多個省公司推廣應用。

主站蜘蛛池模板: 枞阳县| 太原市| 工布江达县| 阿坝县| 鹤庆县| 德阳市| 德阳市| 达拉特旗| 河东区| 云林县| 广饶县| 焉耆| 锦屏县| 长沙县| 乡宁县| 忻城县| 黄大仙区| 赤壁市| 昌吉市| 吉林市| 东平县| 饶平县| 新巴尔虎左旗| 保定市| 马山县| 太白县| 灌云县| 清远市| 普定县| 建湖县| 九江县| 永善县| 海丰县| 新郑市| 马公市| 留坝县| 曲水县| 浪卡子县| 玉田县| 深州市| 玛多县|