1. 程式人生 > >為什麽使用微服務?

為什麽使用微服務?

存在 monitor 透明 啟動 高效 進制 ret 升級sp 前端

技術為業務而生,架構也為業務而出現。隨著業務的發展、用戶量的增長,系統數量增多,調用依賴關系也變得復雜,為了確保系統高可用、高並發的要求,系統的架構也從單體時代慢慢遷移至服務SOA時代,根據不同服務對系統資源的要求不同,我們可以更合理的配置系統資源,使系統資源利用率最大化。
技術分享圖片
系統架構演進
單一應用架構
當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。
此時,用於簡化增刪改查工作量的 數據訪問框架(ORM) 是關鍵。
垂直應用架構
當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相幹的幾個應用,以提升效率。
此時,用於加速前端頁面開發的 Web框架(MVC) 是關鍵。
分布式服務架構
當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。
此時,用於提高業務復用及整合的 分布式服務框架(RPC) 是關鍵。
流動計算架構
當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基於訪問壓力實時管理集群容量,提高集群利用率。
此時,用於提高機器利用率的 資源調度和治理中心(SOA) 是關鍵。
平臺隨著業務的發展從 All in One 環境就可以滿足業務需求(以Java來說,可能只是一兩個war包就解決了);發展到需要拆分多個應用,並且采用MVC的方式分離前後端,加快開發效率;在發展到服務越來越多,不得不將一些核心或共用的服務拆分出來,提供實時流動監控計算等,其實發展到此階段,如果服務拆分的足夠精細,並且獨立運行,這個時候至少可以理解為SOA(Service-Oriented Architecture)架構了。

2.2 服務帶來的挑戰

當迎來服務SOA時代,我們面臨要解決的問題會很多,比如:系統的復雜度上升、服務依賴關系、服務性能監控、全鏈路日誌、容災、斷路器、限流等。那麽面對這些問題為什麽還要做分布式服務呢?因為在未來只有砥礪前行,才能走的更高更遠。不過看到這些問題不要氣餒,先不管這些問題,讓我們一步步來梳理下現存有什麽問題,我們要完成什麽目標,問題自然會迎刃而解。

根據現在團隊的業務系統情況,首先我們要梳理出現存的問題是什麽:

多種調用傳輸方式:HTTP方式、WebService方式;
服務調用依賴關系:人工記錄,查看代碼分析;
服務調用性能監控:日誌記錄,人工查看時間;
服務與應用緊耦合:服務掛掉,應用無法可用;
服務集群負載配置:Nginx配置,存在單點問題;
在去選擇技術框架時,技術框架最基本要解決上面現存問題,同時我們也要確認出我們的期望,要達到的目標是什麽:

支持當前業務需求,這是最最基本的條件;
服務避免單點問題,去中心化;
服務高可用、高並發,解耦服務依賴;
服務通用化,支持異構系統調用服務;
服務依賴關系自維護,可視化;
服務性能監控自統計,可視化;
服務需自帶註冊、發現、健康檢查、負載均衡等特性;
開發人員關註度高,上手快,簡單輕量,低侵入;
還有最重要一點,這也是往往很多技術人員進入的誤區,“對於技術,不要為了使用而使用,用最簡單合適的技術實現解決問題才是正道”。架構是服務於業務的,能快速方便的滿足業務需求的架構才是好的架構。沒有最好的,只有適合自己的。

沒有最好的,只有適合自己的
2.3 服務未來的趨勢

一談到服務,可能大家很多聽說過SOA、MSA等服務的概念名詞,近幾年MSA炒的比較火,其實每一個概念的背後都在解決不同的問題。此類名詞的最大特點就是 一解釋就懂,一問就不知,一討論就打架。

兩者說到底都是對外提供接口的一種架構設計方式。我倒覺得微服務其實就是隨著互聯網的發展,復雜的平臺、業務的出現,導致SOA架構向更細粒度、更通用化程度發展,就成了所謂的微服務了。以這種說法做為根據,我覺得SOA與微服務的區別在於如下幾個方面:

微服務相比於SOA更加精細,微服務更多的以獨立的進程的方式存在,互相之間並無影響;
微服務提供的接口方式更加通用化,例如HTTP RESTful方式,各種終端都可以調用,無關語言、平臺限制;
微服務更傾向於分布式去中心化的部署方式,在互聯網業務場景下更適合;
微服務與SOA有很多相同之處。兩者都屬於典型的、包含松耦合分布式組件的系統結構。在圍繞著服務的概念創建架構這一方面,微服務提供了一種更清晰、定義更良好的方式。微服務的原則與敏捷軟件開發思想是高度一致的,而它與SOA原則的演化的目標也是相同的,則減少傳統的企業服務總線開發的高復雜性。兩者之間最關鍵的區別在於,微服務專註於以自治的方式產生價值。但是兩種架構背後的意圖是不同的:SOA嘗試將應用集成,一般采用中央管理模式來確保各應用能夠交互運作。微服務嘗試部署新功能,快速有效地擴展開發團隊。它著重於分散管理、代碼再利用與自動化執行。

功能                 SOA                                           微服務
組件大小          大塊業務邏輯                                 單獨任務或小塊業務邏輯
耦合                通常松耦合                              總是松耦合
公司架構          任何類型                                   小型、專註於功能交叉的團隊
管理                著重中央管理                                 著重分散管理
目標                確保應用能夠交互操作                 執行新功能,快速拓展開發團隊
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 框架

現在業界比較成熟的服務框架有很多,比如:Hessian、CXF、Dubbo、Dubbox、Spring Cloud、gRPC、thrift等技術實現,都可以進行遠程調用,具體技術實現優劣參考以下分析,這也是具體在技術方案選擇過程中的重要依據。

3.1 服務框架對比

Dubbo 是阿裏巴巴公司開源的一個Java高性能優秀的服務框架,使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,可以和 Spring框架無縫集成。不過,略有遺憾的是,據說在淘寶內部,dubbo由於跟淘寶另一個類似的框架HSF(非開源)有競爭關系,導致dubbo團隊已經解散,反到是當當網的擴展版本Dubbox仍在持續發展,墻內開花墻外香。其它的一些知名電商如當當、國美維護了自己的分支或者在dubbo的基礎開發,但是官方的庫缺乏維護,相關的依賴類比如Spring,Netty還是很老的版本(Spring 3.2.16.RELEASE, netty 3.2.5.Final),倒是有些網友寫了升級Spring和Netty的插件。

Dubbox和Dubbo本質上沒有區別,名字的含義擴展了Dubbo而已,以下擴展出來的功能,也是選擇Dubbox很重要的考察點。

支持REST風格遠程調用(HTTP + JSON/XML);
支持基於Kryo和FST的Java高效序列化實現;
支持基於Jackson的JSON序列化;
支持基於嵌入式Tomcat的HTTP remoting體系;
升級Spring至3.x;
升級ZooKeeper客戶端;
支持完全基於Java代碼的Dubbo配置;
Spring Cloud完全基於Spring Boot,是一個非常新的項目,2016年推出1.0的release版本,目前Github上更新速度很快. 雖然Spring Cloud時間最短, 但是相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系統解決方案。Spring Cloud 為開發者提供了在分布式系統(配置管理,服務發現,熔斷,路由,微代理,控制總線,一次性token,全局瑣,leader選舉,分布式session,集群狀態)中快速構建的工具,使用Spring Cloud的開發者可以快速的啟動服務或構建應用.它們將在任何分布式環境中工作,包括開發人員自己的筆記本電腦,裸物理機的數據中心,和像Cloud Foundry雲管理平臺。在未來引領這微服務架構的發展,提供業界標準的一套微服務架構解決方案。

缺點是項目很年輕,很少見到國內業界有人在生產上成套使用,一般都是只有其中一兩個組件。相關的技術文檔大部分是英文的,案例也相對較少,使用的話需要摸索的時間會長一些。

下圖是Spring Cloud和Dubbo對比:
技術分享圖片
Spring Cloud和Dubbo對比
Motan是新浪微博開源的一個Java 框架。它誕生的比較晚,起於2013年,2016年5月開源。Motan 在微博平臺中已經廣泛應用,每天為數百個服務完成近千億次的調用。與Dubbo相比,Motan在功能方面並沒有那麽全面,也沒有實現特別多的擴展。用的人比較少,功能和穩定性有待觀望。對跨語言調用支持較差,主要支持java。

Hessian采用的是二進制RPC協議,適用於發送二進制數據。但本身也是一個Web Service框架對RPC調用提供支持,功能簡單,使用起來也方便。基於Http協議進行傳輸。通過Servlet提供遠程服務。通過Hessain本身提供的API來發起請求。響應端根據Hessian提供的API來接受請求。

Hessian優點:

整個jar很小,輕量;
配置簡單;
功能強大,拋開了soap(simple object access protocal 簡單對象訪問協議)、ejb,采用二進制來傳遞對象;
rpcx是Go語言生態圈的Dubbo, 比Dubbo更輕量,實現了Dubbo的許多特性,借助於Go語言優秀的並發特性和簡潔語法,可以使用較少的代碼實現分布式的RPC服務。

gRPC是Google開發的高性能、通用的開源RPC框架,其由Google主要面向移動應用開發並基於HTTP/2協議標準而設計,基於ProtoBuf(Protocol Buffers)序列化協議開發,且支持眾多開發語言。本身它不是分布式的,所以要實現上面的框架的功能需要進一步的開發。

thrift是Apache的一個跨語言的高性能的服務框架,也得到了廣泛的應用。

以上RPC框架功能比較:

功能HessianMontanrpcxgRPCThriftDubboDubboxSpring Cloud
開發語言 跨語言 Java Go 跨語言 跨語言 Java Java Java
分布式(服務治理) × × ×
多序列化框架支持 hessian √(支持Hessian2、Json,可擴展) × 只支持protobuf) ×(thrift格式)
多種註冊中心 × × ×
管理中心 × × ×
跨編程語言 ×(支持php client和C server) × × × ×
支持REST × × × × × ×
關註度
上手難度
運維成本
開源機構 Caucho Weibo Apache Google Apache Alibaba Dangdang Apache

實際場景中的選擇

Spring Cloud : Spring全家桶,用起來很舒服,只有你想不到,沒有它做不到。可惜因為發布的比較晚,國內還沒出現比較成功的案例,大部分都是試水,不過畢竟有Spring作背書,還是比較看好。
Dubbox:相對於Dubbo支持了REST,估計是很多公司選擇Dubbox的一個重要原因之一,但如果使用Dubbo的RPC調用方式,服務間仍然會存在API強依賴,各有利弊,懂的取舍吧。
Thrift: 如果你比較高冷,完全可以基於Thrift自己搞一套抽象的自定義框架吧。
Montan:可能因為出來的比較晚,目前除了新浪微博16年初發布的,
Hessian:如果是初創公司或系統數量還沒有超過5個,推薦選擇這個,畢竟在開發速度、運維成本、上手難度等都是比較輕量、簡單的,即使在以後遷移至SOA,也是無縫遷移。
rpcx/gRPC:在服務沒有出現嚴重性能的問題下,或技術棧沒有變更的情況下,可能一直不會引入,即使引入也只是小部分模塊優化使用。
3.2 RPC vs REST(JAX-RS)

由於Dubbo是基礎框架,其實現的內容對於我們實施微服務架構是否合理,也需要我們根據自身需求去考慮是否要修改,比如Dubbo的服務調用是通過RPC實現的,但是如果仔細拜讀過Martin Fowler的microservices一文,其定義的服務間通信是HTTP協議的REST API。那麽這兩種有何區別呢?

服務提供方與調用方接口依賴方式太強:我們為每個微服務定義了各自的service抽象接口,並通過持續集成發布到私有倉庫中,調用方應用對微服務提供的抽象接口存在強依賴關系,因此不論開發、測試、集成環境都需要嚴格的管理版本依賴,才不會出現服務方與調用方的不一致導致應用無法編譯成功等一系列問題,以及這也會直接影響本地開發的環境要求,往往一個依賴很多服務的上層應用,每天都要更新很多代碼並install之後才能進行後續的開發。若沒有嚴格的版本管理制度或開發一些自動化工具,這樣的依賴關系會成為開發團隊的一大噩夢。而REST接口相比RPC更為輕量化,服務提供方和調用方的依賴只是依靠一紙契約,不存在代碼級別的強依賴,當然REST接口也有痛點,因為接口定義過輕,很容易導致定義文檔與實際實現不一致導致服務集成時的問題,但是該問題很好解決,只需要通過每個服務整合swagger,讓每個服務的代碼與文檔一體化,就能解決。所以在分布式環境下,REST方式的服務依賴要比RPC方式的依賴更為靈活。

服務對平臺敏感,難以簡單復用:通常我們在提供對外服務時,都會以REST的方式提供出去,這樣可以實現跨平臺的特點,任何一個語言的調用方都可以根據接口定義來實現。那麽在Dubbo中我們要提供REST接口時,不得不實現一層代理,用來將RPC接口轉換成REST接口進行對外發布。若我們每個服務本身就以REST接口方式存在,當要對外提供服務時,主要在API網關中配置映射關系和權限控制就可實現服務的復用了。

相信這些痛點也是為什麽當當網在dubbox(基於Dubbo的開源擴展)中增加了對REST支持的原因之一。

Dubbo實現了服務治理的基礎,但是要完成一個完備的微服務架構,還需要在各環節去擴展和完善以保證集群的健康,以減輕開發、測試以及運維各個環節上增加出來的壓力,這樣才能讓各環節人員真正的專註於業務邏輯。

而Spring Cloud依然發揚了Spring Source整合一切的作風,以標準化的姿態將一些微服務架構的成熟產品與框架揉為一體,並繼承了Spring Boot簡單配置、快速開發、輕松部署的特點,讓原本復雜的架構工作變得相對容易上手一些。所以,如果選擇Dubbo請務必在各個環節做好整套解決方案的準備,不然很可能隨著服務數量的增長,整個團隊都將疲於應付各種架構上不足引起的困難。而如果選擇Spring Cloud,相對來說每個環節都已經有了對應的組件支持,可能有些也不一定能滿足你所有的需求,但是其活躍的社區與高速的叠代進度也會是你可以依靠的強大後盾。

微服務結構圖
技術分享圖片
4. Dubbox帶來什麽

4.1 Dubbo服務治理
技術分享圖片
Dubbo服務治理

特性                   描述
透明遠程調用  就像調用本地方法一樣調用遠程方法;只需簡單配置,沒有任何API侵入;
負載均衡機制  Client端LB,可在內網替代F5等硬件負載均衡器;
容錯重試機制  服務Mock數據,重試次數、超時機制等;
自動註冊發現  註冊中心基於接口名查詢服務提 供者的IP地址,並且能夠平滑添加或刪除服務提供者;
性能日誌監控  Monitor統計服務的調用次調和調用時間的監控中心;
服務治理中心  路由規則,動態配置,服務降級,訪問控制,權重調整,負載均衡,等手動配置。
自動治理中心  無,比如:熔斷限流機制、自動權重調整等;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4.2 Dubbox擴展特性

支持REST風格遠程調用(HTTP + JSON/XML);
支持基於Kryo和FST的Java高效序列化實現;
支持基於Jackson的JSON序列化;
支持基於嵌入式Tomcat的HTTP remoting體系;
升級Spring至3.x;
升級ZooKeeper客戶端;
支持完全基於Java代碼的Dubbo配置;

原創不易,如果感覺不錯,希望給個推薦!您的支持是我寫作的最大動力!
版權聲明:
作者:Ken
企鵝交流群:790845561 791372870
騰訊課堂直播:https://ke.qq.com/course/144677?flowToken=1003848
如果你對生活感覺到了絕望,請不要氣餒。因為這樣只會讓你更加絕望! 所謂的希望往往都是在絕望中萌發的,所以,請不要放棄希望!

為什麽使用微服務?