開篇以前先聲明我對微服務的幾點態度:前端
架構模式有不少,微服務不是惟一的選擇也不是什麼銀彈。國內絕大多數中小公司引入微服務都是在盲目追新,也能看出作此種技術選型的工程師基礎架構素質的不足。數據庫
「你必須長的足夠高才能使用微服務」。微服務基礎設施,尤爲是容器技術、自動化部署、自動化測試這些不完備,微服務形同虛設,不會帶來什麼質的提高。編程
微服務架構的關鍵不在於具體的實現,而在於如何合理地劃分服務邊界以及組織架構是否相匹配。不考慮研發團隊的規模和組成就盲目上微服務是不良的技術選型。設計模式
Spring Boot是Spring全家桶的上層封裝,並非什麼嶄新的技術,也不是什麼值得以爲成爲本身殺手鐗的技術。瀏覽器
Spring Cloud中Spring Cloud Netflix的組件是通過生產環境驗證的,其餘的則建議慎重選擇。安全
微服務起源於2005年Peter Rodgers博士在雲端運算博覽會提出的微Web服務(Micro-Web-Service),根本思想相似於Unix的管道設計理念。2014年,由Martin Fowler 與 James Lewis共同提出了微服務的概念,定義了微服務架構風格是一種經過一套小型服務來開發單個應用的方法,每一個服務運行在本身的進程中,並經過輕量級的機制進行通信(HTTP API)。關鍵的三點是small、automated以及lightweight。網絡
對比SOA,微服務能夠看作是SOA的子集,是輕量級的SOA,粒度更細的服務,獨立進程、數據分離,更注重敏捷、持續交付、DevOps以及去中心化實踐。其共同的架構原理:架構
特色:app
優勢:負載均衡
缺點:
是否選擇微服務取決於你要設計的系統的複雜度。微服務是用來把控複雜系統的,可是隨之而來的就是引入了微服務自己的複雜度。須要解決包括自動化部署、監控、容錯處理、最終一致性等其餘分佈式系統面臨的問題。即便已經有一些廣泛使用的解決方案,可是仍然是有不小的成本的。
生產力和複雜度的關係如圖所示,可見系統越複雜,微服務帶來的收益越大。此外,不管是單體應用仍是微服務,團隊的技能都須要可以把控住。
馬丁.福勒的一個觀點是:除非管理單體應用的成本已經太複雜了(太大致使很難修改和部署),不然都不要考慮微服務。大部分應用都應該選擇單體架構,作好單體應用的模塊化而不是拆分紅服務。
所以,系統一開始採用單體架構,作好模塊化,以後隨着系統變得愈來愈複雜、模塊/服務間的邊界愈來愈清晰,再重構爲微服務架構是一個合理的架構演化路徑。
四個能夠考慮上微服務的狀況:
此外,根據康威定律和逆康威定律(技術架構倒逼組織架構改進),組織架構也是一個很關鍵的因素。對應於微服務架構,組織架構須要遵循如下原則:
微服務的推行須要依賴於不少底層基礎設施,包括提供微服務的編譯、集成、打包、部署、配置等工做,採用PaaS平臺解決微服務從開發到運行的全生命週期管理,同時提供異構環境管理、容器資源隔離與互通、服務伸縮漂移、服務升級與回退、服務熔斷與降級、服務註冊與發現。
最基本的基礎設施
提高外部服務對接效率和內部開發效率
提高測試和運維效率
進一步提高運維效率
在微服務數量不多的狀況下,以上基礎設施的優先級自上而降低低。不然,僅僅依賴人工操做,則投入產出比會很低。
還須要提到的是Docker容器技術。雖然這個對於微服務並非必須的,可是容器技術輕量級、靈活、與應用依存、屏蔽環境差別的特性對於持續交付的實現是相當重要的,即便對於傳統的單體應用也可以給其帶來交付效率的大幅提高。
在引入微服務以後,傳統的單體應用變爲了一個一個服務,以前一個應用直接提供接口給客戶端訪問的架構再也不適用。微服務架構下,針對不一樣設備的接口作爲BFF層(Backend For Frontend),也叫作用戶體驗適配層,負責聚合、編排微服務的數據轉換成前端須要的數據。服務之間的調用則在容許的狀況下(容許延遲)儘量使用異步消息傳遞方式,如此造成面向用戶體驗的微服務架構設計模式。以下圖所示:
Client -> API Gateway -> BFF(Backend For Frontend) -> Downstream Microservices
微服務架構最核心的環節,主要是對服務的橫向拆分。服務拆分就是講一個完整的業務系統解耦爲服務,服務須要職責單一,之間沒有耦合關係,可以獨立開發和維護。
服務拆分不是一蹴而就的,須要在開發過程當中不斷地理清邊界。在徹底理清服務以前,儘可能推遲對服務的拆分,尤爲是對數據庫的拆分。
其中,對於沒法修改的遺留系統,採用絞殺者模式:在遺留系統外面增長新的功能作成微服務方式,而不是直接修改原有系統,逐步的實現對老系統替換。
上面講述了微服務架構的衆多基礎設施,若是每個基礎設施都須要本身開發的話是很是巨大的開發工做。目前市面上已經有很多開源的微服務框架能夠選擇。
Spring Boot是用來簡化新Spring應用的初始搭建以及開發過程的。其雖然不是微服務框架,但其設計的初衷本質就是微應用的底層框架,所以很是適合用於微服務基礎設施的開發以及微服務的應用開發。尤爲對於Spring技術棧的團隊來講,基於Spring Boot開發微服務框架和應用是天然而然的一個選擇。
Dubbo阿里開源的服務治理框架。其出如今微服務理念興起以前,能夠看作是SOA框架的集大成之做。但其僅僅包含了微服務基礎設施的部分功能,諸如熔斷、服務跟蹤、網關等都沒有實現。
Motan則是微博開源的相似Dubbo的RPC框架,與Dubbo相比更輕量級。
Spring Cloud是基於Spring Boot實現的微服務框架,也能夠看作一套微服務實現規範。基本涵蓋了微服務基礎設施的方方面面,包括配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分佈式會話和集羣狀態管理等。其基於Spring生態,社區支持很是好。但其不少組件都沒有通過生產環境驗證,須要慎重選擇。
Spring Cloud Netflix是Spring Cloud的一個子項目,是Spring對Netflix OSS的集成實現。基於Netflix的大規模使用,其中的已經被普遍使用的組件包括:
此外,另外一個子項目Spring Cloud Alibaba則是Alibaba開源的基於Spring Boot的微服務框架,主要是對阿里雲服務的支持。
上述的微服務框架都是侵入式的,服務化的過程都須要進行代碼改造。Service Mesh則是下一代微服務架構,最明顯的特徵就是無入侵。採用sidecar模式來解決系統架構微服務化後的服務間通訊和治理問題。以下如所示:
目前主流的開源實現包括:
限於Service Mesh帶來的性能延遲的開銷以及sidecar對分佈複雜性的增長,其對大規模部署(微服務數目多)、異構複雜(交互協議/開發語言類型多)的微服務架構帶來的收益會更大。
Linkerd和Envoy:以 sidecar 爲核心,關注如何作好proxy,並完成一些通用控制平面的功能。缺少對這些sidecar的管理和控制。
Istio和Conduit:目前最爲流行的Service Mesh實現方案,集中在更增強大的控制平面(sidecar被稱爲數據平面)功能。前者由Google和IBM合做,並使用了Envoy做爲sidecar部分的實現;後者則是Linkerd做者的做品。相比起來,Istio有巨頭背景,功能強大,但可用性和易用性一直不高,Conduit則相對簡單、功能聚焦。
螞蟻金服開源的構建金融級分佈式架構的一套中間件。包括微服務開發框架、RPC框架、服務註冊中心、全鏈路追蹤、服務監控、Service Mesh等一整套分佈式應用開發工具。
特別值得一提的是SOFAMesh。其實對下一代微服務架構Service Mesh的大規模落地方案實踐,基於 Istio改進和擴展而來,應該是國內最爲成熟的開源Service Mesh方案。
此外,須要提到Kubernetes(K8s),其自己提供了部分的微服務特性支持(經過域名作服務發現),對代碼無侵入。但服務調用、熔斷這些都須要本身實現。
綜上,目前公司技術團隊技術棧是Spring,而且已有服務的實現都是基於Dubbo,所以選擇Spring Cloud Netflix作爲基礎的微服務框架,對其中不成熟或者缺少的組件,選擇業界更爲成熟的組件替代便可。
來源:https://www.talkwithtrend.com...