應用服務架構一直處於不斷演進的過程當中,上圖經過對比5種比較主流的架構模式,展現應用架構的演進歷程和變化。前端
單體架構和豎井式架構都是圍繞web容器打包及部署的架構模式,隨着業務的快速發展,要求實現服務的快速迭代和快速交付,應用架構也由此演進爲以服務爲中心的架構模式。主流的面向服務的架構模式有:RPC架構、ESB中心化架構和微服務架構。web
經過上述對比,咱們不難發現,應用服務架構是在不斷演進的,並且其演進背後存在必定的邏輯,服務架構的演進主要取決於如下2個維度:數據庫
關於微服務的定義,此處引用ThoughtWorks首席科學家Martin Fowler給出的描述。編程
其中如下特性值得特別注意:後端
Martin Fowler對於微服務架構的表述更偏向學術上的定義,沒有給出明確的落地標準或規範,只是提供了一些構建微服務架構的原則。安全
微服務架構模式有如此多的優勢,那是否是全部的業務都要採用這種架構模式呢?又該如何篩選微服務?架構
左邊圖中,橫座標表明系統複雜度、縱座標表明開發生產力、藍色線表示微服務架構、綠色線表示單體架構。由圖可知,當項目複雜度較低時,單體架構的生產力更高;隨着項目複雜度愈來愈高,單體架構的生產力逐漸降低,微服務架構的生產力則顯著提升。併發
鑑別出哪些業務須要使用微服務架構模式後,須要決定如何拆分和構建微服務。負載均衡
如何進行服務拆分,是在微服務過程當中業務方常常會問到的問題。框架
其實不少團隊已經開始在作一些微服務化的工做,好比把大的工程拆分紅不一樣的模塊或子系統,這種對業務模塊進行的靜態劃分,至關於已經完成了微服務改造的第一步拆分。
上圖是DDD(領域驅動設計)的開發模式,若是業務方案已經肯定採用微服務的架構模式,在整個工程領域咱們傾向於使用DDD模式來對業務架構和服務進行拆分。
DDD是基於領域模型的建模而不是數據庫表驅動的建模,須要咱們對業務領域有深入的洞察,瞭解服務的邊界和上下文信息傳遞。
康威定律指出:在微服務架構和設計系統組織,其產生的設計等價於組織間的溝通結構。就是說微服務架構不只是技術上的演進,同時對使用技術的組織提出了要求,拆分的服務是咱們和服務之間的溝通方式。
咱們採用微服務的12因子做爲微服務建設的架構原則。微服務的12因子也叫雲原生12因子,它提供了一種業務上雲或微服務改造的最佳實踐。重點介紹其中幾個因子:
微服務看起來很是好,但實際上是須要一個技術體系或平臺體系來支撐的,若是沒有這樣一個服務架構平臺體系的建設,不推薦使用微服務。
微服務架構建設分爲2種思路:SDK模式、ServiceMesh模式。
典型表明是SpringCloud,SpringCloud是基於SpringBoot的一整套實現微服務的框架。SDK模式的底層運行平臺能夠是PaaS平臺,也能夠是Kuberneters平臺或Docker容器。
Istio 是ServiceMesh模式的典型表明。ServiceMesh模式的優缺點與SDK模式正好相反。
SpringCloud是基於SpringBoot發展而來的一整套成熟的微服務架構解決方案。SpringCloud具備如下優點:
SpringCloud自己也是一個逐漸演進的架構模式:最先是基於IOC/AOP的編程思想產生的;而後在Spring的基礎上發展出SpringBoot,基於註解的方式實現快速的應用開發;後來在SpringBoot的基礎上開發出SpringCloud底層微服務構架。
上圖展現了SpringCloud的技術生態,SpringCloud技術棧包含了不少技術模塊,好比Ribbon、Zuul、Eureka、SpringCloud Stream等,這些技術模塊共同組成了SpringCloud生態圈,爲開發者提供豐富的微服務架構基礎設施支撐。
微服務和SpirngCloud的架構是比較複雜的,如配置管理、服務註冊與發現、API網關、打包部署調度、安全、服務故障自愈、流量控制和彈性伸縮等非功能需求,都是微服務須要包含的架構模塊。上圖中藍色字表示SpirngCloud、Kubernetes等用來解決雲原生和微服務架構問題的技術方案。
從圖中能夠看出微服務架構的複雜性,要想實現一套微服務架構來支撐和交付業務,須要在底層封裝不少基礎組件,構建一套底層基礎架構來隔離底層的非功能需求,作到讓業務系統無感知、平滑地對外提供服務。
SpringCloud提供的框架或基礎設施是一個半成品,咱們在SpirngCloud的基礎上進行了二次開發,抽象和封裝了一些微服務架構的通用基礎設施平臺,不一樣的業務團隊共享這些基礎設施,下降技術學習和接入成本,讓業務團隊更專一於業務邏輯的實現,聚焦業務開發。
上圖所示爲宜信的微服務架構:
有別於其餘的架構模式,微服務架構裏出現了一個重要的基礎設施變化-增長了微服務網關模塊。網關主要解決的問題是:服務拆分以後,每個服務粒度都比較小,服務之間的交互會呈現網狀的結構,須要一個聚合的節點來聚合這些微服務。
所以咱們在SpringCloud微服務架構的基礎上二次開發出SIA微服務網關,如圖所示,重點介紹其中的2個核心模塊:
SIA微服務網關的4種模式:同步託管式、同步註解式、異步託管式、異步註解式。
採用單一源碼庫進行代碼管理,交付方式是容器交付,去中心化的設計。目前大部分生產環境和業務都採用同步託管模式。
在跟業務團隊對接時,咱們發現不少業務系統已經實現了一些獨特的業務邏輯,難以遷移到網關,因此咱們採用一種比較兼容的註解的方式去適應這些業務邏輯,在原有項目的基礎上加一個註解,將它們歸入到整個網關管理體系中來。同步註解式是基於SpringCloud-Zuul 1實現的分佈式微網關體系,管理業務方源碼庫,根據業務方環境進行交付。
SpringCloud和Zuul使用的後端技術是基於Servlet,其線程處理模型是一個請求對應一個線程,當請求量過多,線程棧溢出,就會佔用很是多的資源,致使網關沒法提供額外的線程資源來處理新進來的請求。所以咱們採用了SpringCloud自研的SCG技術方案。
SpringCloud-Gateway基於Netty和反應式編程模式,採用收斂式的線程處理模型,只要用少數線程就能夠處理高併發的流量請求。目前已經實現了基於SpringCloud-Gateway的異步模式,當同步模式在線上運行過程當中出現資源透支的狀況,就選擇使用異步模式。異步模式也分爲2種:異步託管式、異步註解式。
經過單一源碼庫進行代碼管理,採用容器交付。主要使用場景是流量型,若是業務多對高併發、高吞吐場景,建議使用異步託管式。
若是想在異步網關基礎上作定製開發,可使用異步註解的模式。
網關的4種模式來源於業務的需求:爲兼容業務已有邏輯演進出註解模式;當出現性能瓶頸、資源浪費時,採用異步模式應對高併發流量。
上圖是網關測試環境的一個截圖, 包括上述4種模式。每個小方格表明業務的一個網關組,方格中的小圓圈表明它屬於哪種網關。業務系統在選擇網關模式時要作一個判斷:訴求是支持業務的快速集成,仍是對流量有必定要求。
如圖將SIA微網關的核心Feature分紅2個層面:
微服務網關貫穿了整個微服務生命週期的管理。
SIA微服務網關的功能包括:
各功能模塊對應的生命週期:
SIA微服務網關做用於軟件生命週期的各個階段,經過標準協同、業務測試/前端後端溝通、服務模塊複用、可視化管理、數據統計管控等實現業務的統一融合、降本增效。
2016年,Gartner 發佈了一個關於應用變化速率的報告《Pace-Layered Application Strategy》,以應用變化速率爲標準將業務應用分爲三層:
中臺的目標是圍繞業務組織進行可複用能力的有機整合,協助業務落地實施、改造、試錯、轉型,提高組織效率,下降系統成本。
中臺和微服務有什麼關係呢?微服務架構是面向開發的架構,不少基礎服務能夠沉澱到微服務架構裏,同時,微服務架構把中臺的能力快速釋放出來,知足敏態業務快速變動的業務需求。
上圖是路由管理裏的一個截圖,當一個大的單體或不一樣的服務要對外提供統一服務時,能夠把服務聚合到網關上;同時一個巨型應用也能夠經過網關分解成微服務。
微服務架構中有不少非功能需求,或者說是技術導向型的需求,包括日誌管理、限流、藍綠部署、版本管理等,能夠經過組件的方式下沉到網關上,業務系統經過將服務與組件綁定實現對組件功能的複用。
咱們還提供了一個插件機制,當業務有獨特的需求,能夠根據其業務邏輯在網關上進行功能的個性化定製。
在開發或先後端聯調時,先後端能夠經過網關服務文檔中心的Swagger UI功能模塊訪問後端服務調用接口的分析。
只要在後端服務之上加一個Swagger註解,網關就能夠把全部對外暴露的服務抓取出來,這至關因而一種契約式的開發。
咱們對網關應用作了容錯和保護機制,固然這也是SpringCloud自己自帶的一個技術模塊,咱們的容錯機制是基於SpringCloud的Hystrix實現的,當發現後端服務調用請求一直在返回錯誤時,會開啓熔斷,避免因爲一直髮送錯誤請求致使雪崩的狀況發生。
除此以外,咱們還會採用Guava限流的方式對服務進行保護。在大促或秒殺的場景下,會有大量請求進來,這時會經過限流來保護服務的穩定。
宜信微服務架構平臺有一個很重要的功能是網關服務運行狀態和後端鏈接狀態可觀測,提供了不少監控方面的功能組件,如圖所示,能夠統計當前請求的頻率、服務健康度。
預警方面重點介紹網關拓撲圖。當請求失敗,當前鏈路出現異常,經過網關拓撲圖能夠快速跟蹤和判斷業務系統哪一個節點出現問題,而後對有問題的節點進行摘除或其餘操做。
咱們的網關運行在Docker平臺上,Docker平臺在出現問題或重啓以後日誌會丟失,咱們的日誌系統會把日誌歸集,存儲到ES中,便於對歷史日誌溯源。
網關中有一個組件叫「監控統計」,這個模塊默認是不打開的,若是你想對請求作延時,或者想看請求的明細調用狀況,能夠經過組件管理中打開這個組件,對容器的請求作統計和分析。監控統計組件會對當前請求的最大延遲、最小延遲、失敗個數、平均延遲進行排序,一目瞭然。
構建微服務網關初期,業務同事比較關注咱們的業務網關和別人的網關是否存在耦合問題,他的業務請求是否會影響到我。咱們選用去中心的網關設計方式,同時經過OAM實現對全部網關節點的統一管理。
咱們的微服務網關是按照DDD領域驅動模式來建設的,沒有把網關綁定在某一個特殊的技術實現上,而是把它做爲一個抽象封裝來統一管理後端的節點,若是換一種技術實現也不會影響到前端業務的正常工做。所以在架構建設初期要考慮清楚你的業務系統和後端技術架構之間是否解耦。
雖然每一種開源方案在開源以前都通過了長時間的考驗,但其實依然可能存在bug,基於這些開源方案進行二次開發時仍可能遇到一些坑,咱們會不斷對開源系統進行bug修復和功能加強。
Zuul自己存在性能瓶頸,當出現性能問題時,咱們考慮是否是要用線程收斂的模式來加強網關的性能。
在網關應用中會遇到Eureka的CAP問題,由於Eureka消息註冊以可用性(Availability)優先,在一致性(Consistency)上相對較弱。爲解決這個問題,咱們基於Eureka的特色提供SynchSpeed服務,若是業務須要保證狀態一致性,能夠開啓這個服務。
這兩個問題是指當雲容器平臺的狀態發生變動,卻沒有及時通知到註冊中心,致使服務在兩個平臺的狀態不一致,這就須要作上下文關聯繫統(StakeHolder)的整合。
內容來源:宜信技術學院第8期技術沙龍-線上直播|宜信微服務架構落地及其演進主講人:宜信高級架構師 & 宜信科技中心基礎研發部SIA微服務網關負責人王佩華