1、從領域驅動到Kubernetes的微服務實踐云原生的設計理念云原生(Cloud Native)是一種應用架構。包含超越12要素,DevOps,持續交付,微服務,敏捷基礎設施等幾大主題。采用基于云原生的技術和管理方法,可以享受“云”的高效和持續的服務能力。云原生應用DevOps微服務MicroServices持續集成交付Continuous Delivery超越12要素The Twelve-Factor App敏捷基礎設施Agile I云原生微服務架構支撐數字化轉型迭代更快:各模塊獨立開發、部署質量更高:去雪崩效應,秒級恢復應對爆發:架構到資源全彈性伸縮免單體架構微服務架構組件高度耦合,開發部署
2、效率低單體結構,可靠性差單體部署,彈性缺失物理機缺乏彈性傳統云計算僅關注資源彈性容器云資源和架構全彈性伸縮什么是微服務架構微服務架構(Micro Services Architecture,MSA)提倡將龐大規模應用分割成一系列細粒度的服務,每個服務專注于單一業務功能,可獨立運行,服務之間采用輕量級通信機制相互溝通、配合來實現完整的應用。相比于一體化架構和SOA架構,MSA在部署效率、伸縮彈性和容錯性等方面具備優勢,滿足當前互聯網與云計算趨勢下企業IT系統對敏捷性的不懈追求。微服務架構康威定律各模塊獨立部署敏捷開發技術異構性強傳統單體應用架構服務化拆分后的架構領域驅動設計可擴展性微服務架構當前
3、應用情況微服務生態群微服務架構在大型互聯網公司中已有成熟的規?;瘧?。美國Netflix、Amazon、Wikipedia、Twitter等;日本Line、Cookpad等;以及國內一線互聯網公司已將自身IT架構基于微服務完成重構;而在下游企業用戶端,制造業和金融業有望率先實現規?;涞?。業內尖端企業微服務實踐微服務全景圖HailoAmazonNetflixK微服務架構如何實現領域驅動設計DDD概念圖 摘取自 DDDChina企業基于微服務架構搭建IT系統,可以主要分為業務系統設計和微服務平臺搭建兩個部分。企業根據自身業務框架進行梳理,有效切分現有的單體架構并進行領域驅動設計(DomainDr
4、ivenDesign,DDD),這一過程體現明顯個性化,企業往往通過外部引入咨詢專家+內部IT團隊配合的方式完成;另一方面,需要基于容器云技術搭建微服務平臺以實現多組件管理,主要包括開發框架、以及周邊配套工具鏈等全套體系的構建。微服務架構實現途徑服務端架構演變 Spring MVC 垂直煙囪服務化初期 Dubbo 服務數量20+服務化中期 Spring Cloud+Dubbo(存量)服務數量300+微服務化服務網格化Spring BootHystrixGuavaSleuth+zipkinKafkaELKSpring MVCNginx+LuaMQSpring BootDubboZookeeper
5、DDDSpring BootHystrixIstioEnvoyJaegerELK云音樂微服務歷程 單體應用階段云音樂早期的架構的發展,經歷的幾個階段遇到的問題開發難:結構復雜,頻繁失憶測試難:全量回歸迭代效率低缺乏服務治理手段優化思路大中臺,小前臺架構思想提高橫向擴展能力實現靈活服務熔斷、降級策略服務化初期 煙囪階段遇到的問題開發難:結構復雜,頻繁失憶測試難:全量回歸迭代效率低缺乏服務治理手段優化思路大中臺,小前臺架構思想提高橫向擴展能力實現靈活服務熔斷、降級策略云音樂早期的架構的發展,經歷的幾個階段微服務試水初期服務拆分問題需要DevOps平臺提供敏捷迭代能力參考DDD、The Twelve
6、-Factor方法論根據業務實際情況逐步設計服務間通信問題服務的通信方式Http、Rpc服務注冊和發現,路由、負載均衡等都是需要解決的問題基礎設施問題服務器資源分配困難,服務器機型碎片化一臺服務器上多個進程互相影響、排障困難,QoS 難以保障服務拆分與領域驅動設計什么是領域模型 模型是一種表達形式,它是我們頭腦中某種想法的表達,表述過程即可看作是建模的過程。領域模型是將業務邏輯組織為由狀態和行為的類構成的對象模型。軟件模型建筑模型高達模型領域驅動設計DDD統一語言分析領域戰略設計定義限界上下文戰術設計定義實體、聚合、服務等編碼形成微服務UI層應用層領域層基礎設施層統一語言領域模型問題域限界上下
7、文 分層結構 領域服務 領域事件 值對象 實體 資源庫 工場 聚合戰略設計戰術設計簡單CRUDCQRSDDD與微服務微服務:Domain-driven Design 領域驅動設計:分布式服務組成的系統 按照業務而不是技術來劃分組織 自動化運維 服務快速演化迭代 通過建立領域模型來解決領域中的核心問題 通過領域模型驅動代碼的實現 技術架構設計或數據存儲等是在領域模型的外圍 DDD vs SSI(spring+hibernate):充血模型/失血模型 建立模型用例測試驅動開發用戶故事 六邊形結構 整潔架構思想 CQRS模式 事件朔源 事件風暴 設計、工程、運營等的平衡 漸進演化拆分原則:DDD案例
8、1-倉儲系統的復合打包場景復合打包的模型視圖在倉儲系統中,質檢環節有這樣的場景 庫工對打包完成的包裹稱重并測量體積 包裹的體積或重量超過標準值的包裹質檢失敗 系統可以查詢測量失敗的記錄 稱重完成的包裹狀態變為稱重完成DDD案例1-倉儲系統的復合打包場景優化后的復合打包的模型視圖云原生的十二要素超越12要素Beyond the Twelve-Factor A微服務轉型中期業務的可靠性問題服務雪崩,非核心的服務掛了,調用鏈路上的其他核心服務都會受到影響一個服務慢,會導致整個調用鏈路出現大量超時,無法快速恢復數據一致性問題分布式事務支持方式復雜度高,且和業務綁定嚴重每個事務場景都需要重寫一遍事務提交
9、補償的邏輯,效率很低微服務技術棧不統一Spring Cloud、Dubbo、私有RPC,微服務框架選型不一,技術無法積累,上手成本高API 版本管理混亂,無法統一管理服務化中期遇到的問題服務注冊服務發現服務調用接口粒度鏈路追蹤1.Dubbo 與 Spring Cloud如何共存服務化中期遇到的問題2.ZK注冊中心成為瓶頸 注冊模型臃腫 網絡開銷大 資源利用率低dubbo:/server_ip:20880/org.apache.dubbo.samples.api.GreetingService?anyhost=true&application=dubboannotationprovider&de
10、fault.timeout=1000&dubbo=2.0.2&generic=false&interface=org.apache.dubbo.samples.api.GreetingService&methods=sayHello&pid=27780&side=provider×tamp=1543201372914consumer:/server_ip/org.apache.dubbo.samples.api.GreetingService?application=dubboannotationconsumer&category=consumers&check=false&defa
11、ult.timeout=3000&dubbo=2.0.2&interface=org.apache.dubbo.samples.api.GreetingService&methods=sayHello&pid=27807&side=consumer×tamp=優化重構注冊中心注冊中心 提供服務實例注冊發現,健康檢查等優化思路服務注冊與服務發現解耦抽象服務注冊發現模型CP模型轉為AP模型元數據改造元數據中心 管理服務元信息,配置信息,路由信息等服務熔斷保護 熔斷限流通過熔斷限流機制,當一個服務掛了,被影響的服務能夠及時熔斷,使用 Fallback 數據保證流程在非關鍵服務不可用的情況下
12、,仍然可以進行。線程池保護通過線程池和消息隊列機制實現異步化,允許服務快速失敗,當一個服務因為過慢而阻塞,被影響服務可以在超時后快速失敗,不會影響整個調用鏈路。服務治理遇到的問題3.Hystrix 熔斷策略動態配置難如何動態下發實時生效?微服務的關鍵能力限流降級容錯黑白名單負載均衡參數分流拓撲依賴動態配置認證鑒權擴展插件服務注冊發現環境感知熔斷NSF 微服務框架 1.0微服務框架注冊發現限流熔斷降級容錯路由負載均衡參數分流拓撲依賴動態配置服務監控服務告警認證鑒權知識庫微服務框架與開源技術棧統一解決了哪些問題?將服務治理邏輯抽離、以無侵入方式實現、支持 Spring Cloud、Dubbo 等開
13、源技術棧 業務代碼,框架代碼解耦開發和運維;避免重復造輪子;完善方法級別治理粒度;服務治理策略實時生效;NSF 微服務框架實現SpringAOP自定義注解+字節碼增強 引入微服務框架的能力用一句話概括!問題解決 服務治理策略實時生效SpringAOP自定義注解+字節碼增強 引入微服務框架的能力控制面數據面服務治理的實際場景應用架構示意前端展現在某個微服務實例出錯時,能夠錯誤容忍,迅速重試服務容錯在某個接口調用超時時,能夠快速失敗,不阻塞鏈路及其他服務服務熔斷保護后端核心微服務性能。限制異常調用服務限流apiVersion:extensions/v1beta1kind:Deploymentmet
14、adata:labels:nce-app:nsf-stock-viewername:nsf-stock-viewernamespace:nsfspec:template:metadata:labels:nce-app:nsf-stock-viewercontainers:-name:tomcatenv:-name:NCE_PORTvalue:8790-name:NCE_JAVA_OPTSvalue:-javaagent:/home/nsf-agent/nsf-agent.jar=stock-viewerimage: 如何優雅集成?It just works!微服務化改造1.0的成本工程內部依賴
15、組件多整合內部平臺組件哨兵監控鏈路性能追蹤健康檢查認證鑒權動態配置微服務化后遇到的問題大規模服務實例如何實時查看治理情況?https:/ 2.0持續擴展,降低微服務成本微服務框架NSF注冊發現限流熔斷降級容錯服務路由負載均衡參數分流拓撲依賴動態配置服務監控服務告警認證鑒權知識庫自動測試性能監控鏈路追蹤JVM監控TCC事務消息自動補償流量染色流量穿梭環境感知微服務應用整體架構多環境支持后端服務發現認證鑒權服務治理 熔斷、降級流量控制多數據面接入服務注冊服務發現租戶隔離性大幅減少重復框架代碼統一組件版本配置多語言支持分布式事務 數據一致性問題在分布式系統下保證業務操作的一致性是不可或缺的的,特別是
16、在電商,金融等行業對數據一致性的要求更為苛刻,因此需要引入分布式事務框架。根據業務場景(支付、派單等)選擇事務模式冪等重試異常補償兩階段提交TCCFMT事務托管(低侵入,一行注解搞定分布式事務)事務軌跡 事務狀態監控 事務軌跡 事務運維能力(回查、重試)下單-扣優惠券-去庫存下單-發短信、發郵件微服務大規模上線后服務認證,流量控制需要網關來解決認證、流量控制等問題系統可觀察性指標監控無法覆蓋到微服務調用鏈,無法定位故障服務,故障排查效率低服務調用信息碎片化嚴重,無法有效聚合業務id 無法與服務調用相關聯自動化測試,線上壓測,故障演練問題測試環境數量大增,環境管理、部署更新困難接口數量多,回歸測
17、試占用大量人力線上壓測無法引流故障演練手段不一,硬編碼隨處可見測試需求源源不斷測試資源永遠不夠搭建越來越繁瑣環境配置問題,新bug互相Block測試環境的災難微服務架構下問題不斷放大敢怒不敢言,敏捷只是個傳說,聯調時間永遠不夠問題.部署方式的改變單體應用獨立起一個應用的幾個服務就是一套完整環境。簡單省心。20+服務統一修改應用的版本號,手工進行差異化配置。修改MQ的destination和數據庫表配一個nginx反向代理。有點麻煩,但還能接受。200+服務全量部署工作量大,同時非常浪費機器資源。每個測試迭代新增部署有修改的服務+上下關聯服務,然后各種集成配置一頓改。工序繁多,累心且極易出錯。問
18、題2.測試環境“復位”測試環境有莫名干擾問題:測試環境無人管理運行著一個過時的分支內容CICD容器資源不足優雅的解決思路自動部署環境(開發自調環境,peer聯調環境)生命周期控制(創建、銷毀、凍結)同環境優先調用Step1.自動部署測試環境JenkinsAnsibleKubernetesHelmMavenGit代碼拉取代碼編譯鏡像構建部署分支部署平臺Step2.流量染色X-B3-TraceId=3b68393d31a43489X-B3-SpanId=bbca2e4bf2db4bfaX-B3-ParentSpanId=1669bfa13d21fedfX-B3-Sampled=1X-NSF-Acc
19、essKey:e9e850c35447442da693c5648071cX-NSF-Date:2018-08-30T08:14:03ZX-NSF-Dryrun:falseX-NSF-Signaturemethod:HMAC-SHA256X-NSF-TraceOriginENV=edu-netease-15445215攜帶環境來源信息利用分布式追蹤原理攜帶環境來源信息Step3.多環境流量穿梭 降低測試成本 靈活控制 分支環境獨立Service Mesh 能為微服務帶來什么?p流量染色p流量穿梭p故障注入p區域調度p異構支持在L4 實現治理流控與請求消息穿梭把框架與進行業務解耦,并下沉到基礎設施
20、中,與Spring Cloud各有優劣引入Service Mesh架構統一控制面對接多數據面支撐微服務的全流程平臺輕舟企業級分布式服務底座NCE(容器平臺)Pod&Deployment網絡 Calico,OVS存儲 Ceph滾動更新彈性伸縮日志中心基礎設施監控開發集群測試集群API網關(流量接入層)路由路由插件分流流量鏡像維護開關API監控認證鑒權治理文檔報表NSF(微服務框架)服務目錄注冊發現限流熔斷降級容錯路由負載均衡參數分流拓撲依賴配置中心服務監控服務告警認證鑒權統計概覽知識庫APM(應用性能監控)運行時拓撲性能監控服務篩選調用鏈調用棧JVM監控數據庫監控性能告警自定義數據服務告警監控大屏賬戶審計CICD(開發流程管理)代碼檢出代碼編譯鏡像構建集成測試自動部署流水線管理GoAPI(測試平臺)單接口用例場景用例執行集定時執行接口Mock覆蓋率歷史管理批量導入接口監控GTXS(分布式事務)TCC事務補償事務消息事務協調統一接入低侵入數據庫事務中間件事務多框架支持輕舟企業級分布式服務底座的實現基于開源,強于開源。組件松耦合可插拔式設計理念