廬山真面目之微服務的簡介和技術棧
微服務的簡介和技術棧
一、簡介
這些年軟體的設計規模越來越龐大,業務需求也越來越複雜,針對系統的效能、高吞吐率、高穩定性、高擴充套件等特性提出了更高的要求。可以說業務需求是軟體架構能力的第一推動力,由於這些因素導致了軟體架構思想和相關技術也在發生著鉅變。這些變化反應在軟體架構行業裡,就是我們開始越來越多的聽到了很多新的詞彙,比如:“分散式”、“SOA”、“微服務”、“中臺”等概念。
今天我就把我學習微服務的過程記錄下來,包括所有技術的實現細節和個人的理解。俗話說:好記性,不如爛筆頭,以防自己忘記,以後可以查詢。當然,這些東西有很多東西都是自己的理解,裡面的插圖也是自己畫的,可能會有一些有失偏頗的地方,當然希望有高手可以指正,不靈賜教,大家共同進步。
二、架構發展歷程
現在的科學技術可以說是日新月異,發展迅速。相對於我們軟體設計行業也在發生著鉅變,業務越來越複雜,需求越來越龐大、繁雜,軟體架構和部署的規模也發生著翻天覆地的變化,作為軟體架構思想之一的“微服務架構”也在按著自己的規律進化著,接下來我們就簡單的瞭解一下“微服務架構”發展經歷的三個時期,這些只是個人理解。
1、單體架構(Monolithic)
單體應用時代:應用程式無論如何分層,都是一個解決方案,或者說都是一個專案,這裡的“解決方案”和“專案”不是我們使用的 Visual Studio裡面的概念,最終的程式程式碼都會在一個程序裡執行。
如圖:
優點:開發簡單,集中管理,沒有分散式的損耗,都是系統程序內的通訊。
缺點:不好維護,升級困難,耦合嚴重,無法應付高併發和大資料場景,無法快捷迭代。
2、垂直拆分
隨著業務規模的越來越龐大,系統設計就越來越複雜,大的系統就開始進行業務的垂直拆分。比如:有專門做商品秒殺的部門,有專門做生鮮商品的部門,有專門做超市的部門,等等,當然這是根據部門天生劃分的,也有根據業務需求進行系統劃分的。
如圖:
優點:垂直拆分,系統獨立部署和維護,每個系統在自己程序內執行,分而治之。
缺點:拆分越多,儲存越複雜,系統間重複的東西也越多,單個系統還是單體模式。
3、分散式服務
隨著業務系統的越來越龐大,軟體系統設計起來越來越複雜。為了避免過度複雜的業務需求,開始對業務系統的進行垂直拆分,形成多個獨立的業務系統,如果多個系統之間要通訊,可以通過跨程序的技術完成通訊。但是垂直拆分也導致了大量重複程式碼、重複模組的產生,比如:使用者模組、日誌模組、支付模組、認證授權模組等,這樣分散的程式碼也給系統的維護和升級帶來了困難。我們對業務重新劃分,把獨立的模組介面化、服務化,提高重用,這個時候,我們就開始進入了分散式服務的時代。(分散式的第一要務就是不要分散式)
如圖:
優點:
1、獨立程序部署,獨立程序執行,獨立演化。服務之間可以做到高內聚,低耦合。
2、獨立開發和維護,業務解耦,無論是業務系統還是分散式服務都獨立演化。
3、分散式管理
4、隔離性增強
5、由一系列服務組裝成系統,不用重複建設,模組、程式碼可以複用。
缺點:
1、資料一致性(多服務完成一個任務)和系統的可用性(叢集)成為問題
2、資料庫也進行了拆分。
3、維護、設計、架構成本增加,除錯、糾錯更難。
4、網路傳輸分散式損耗成本
5、不適合高併發和大資料的環境。
4、微服務架構
微服務的出現時分散式架構已經很成熟了,架構中各種問題已經有了很成熟的解決方案,對於現在的業務系統來說,分散式架構已經變成了一種常規手段,這個時候,微服務就出現了。微服務架構是一個用分散式服務拆分業務邏輯,完成解耦的架構模式(架構風格)。微服務肯定是分散式的一種,是在分散式技術成熟之後,然後把分散式當成解耦手段來架構系統-----因為拆分的服務很細緻,服務數量規模開始變多了,服務的體量開始縮小了,由以前幾個大的服務,轉變為多個獨立執行的、原子性質的服務。
如圖:
微服務最重要的特性是:
(1)、可用性:描述一個系統在一段時間內提供有用資源的能力,從而減少停工時間,而保持其服務的高度可用性。
(2)、伸縮性:根據需求動態新增和刪除系統中資源的能力,是水平或垂直擴充套件的專門實現。
叢集(負載均衡)可以解決系統的高可用和伸縮特性。
5、SOA 面向服務架構
Service-Oriented Architecture 面向服務架構:是一個元件模型,它將應用程式的不同功能單元(稱為服務)進行拆分,並通過這些服務之間定義良好的介面和協議聯絡起來。
如圖:
三、微服務架構的發展歷程
我們要解決微服務的高可用和可伸縮的兩個問題,自然就會想到通過叢集來實現,這個思路沒有錯。如果我們實現了服務叢集,那另外兩個問題就會出現,這兩個問題也導致了微服務架構的發展版本的差異。第一個:服務的發現問題,呼叫方如何發現服務,有了新的服務,我們如何知道,有服務例項掉線,我們如何曉得,發現服務就很重要,這個是基礎問題,第一個問題不解決,第二個問題也沒有辦法實現;第二個:如何呼叫服務,如何管理那麼多的服務例項。有那麼多的叢集例項,也就有那麼多的服務例項,我們該怎麼去呼叫這些服務呢?多個服務呼叫的關係如何呢?
由於這些問題,那我們就看看微服務架構的三個版本是如何解決的。
1、集中式代理----Nginx(V1.0 版本(服務註冊/服務發現----手動))
(1)、服務發現,手動修改配置檔案,重新啟動。
(2)、負載均衡,可以輪訓、權重、雜湊等等。
(3)、服務新增無法發現,需要手動配置,服務掉線可以自動檢查。
(4)、客戶端的實現很簡單,不需要額外的程式碼,簡單,高效。
2、客戶端嵌入----Consul(V2.0版本(服務註冊/服務發現—自動---服務治理))
(1)、服務註冊與發現,動態增加,自動完成。
(2)、健康檢查,可以檢視損壞服務,去掉服務,自動完成。
(3)、負載均衡,Consul
返回所有活動服務例項,客戶端自己實現負載均衡。
功能強大,自動發現-自動下線,客戶端整合比較複雜,負載均衡在客戶端實現。
3、服務網格-Service Mesh(V3.0---技術不成熟,華為+唯品會,lstio)
SideCar服務管理服務例項的註冊和發現,服務例項的治理和呼叫。Service Mesh’s Control Plan 管理所有的 SideCar。這個技術我就不多談了,網上的資料也很多,目前這個技術還不是很成熟,使用的範圍也不是很廣,只有一些大的公司有過使用,比如:微軟等。
四、微服務架構必備技術棧
微服務是一種軟體設計、架構思想,當然,裡面也包含了相關技術點要解決當前要務。學習微服務,我們不能空口而談,一定要落實到具體的技術棧上。當今使用比較多兩個技術體系,一個是Java,另外一個就是Net,廢話不多說,我是使用微軟相關技術棧的軟體架構人員,當然使用的“微服務”架構技術棧也都是微軟的。今天我就把相關“微服務架構”所用到的技術棧羅列出來,我也要說明一下,微服務架構裡面的很多技術是和開發語言無關的,無論是 .Net 還是 Java 平臺都可以使用。以後,一步一步的針對每項技術在做深入研究。
1、微服務架構----服務通訊
WebService、WCF、WebAPI,甚至可以是 ASHX,ASPX,這都是微軟本身的技術體系,沒什麼可說的。
(1)、主動觸發
(2)、資料序列化傳遞
(3)、跨平臺。
(4)、跨語言
(5)、Http 穿透防火牆。
2、微服務架構----程序通訊
(1)、Net
Remoting:Net 平臺督郵的,不支援跨平臺。
(2)、gRPC:高效能、開源和通用
RPC框架,面向服務端和移動端,基於 HTTP/2 設計,推薦使用。
3、微服務架構---API閘道器服務(Ocelot)
API閘道器—— 它是系統的暴露在外部的一個訪問入口。這個有點像代理訪問的傢伙,就像一個公司的門衛承擔著定址、限制進入、安全檢查、位置引導、等等功能。Ocelot是一個用.NET Core實現並且開源的API閘道器,它功能強大,包括了:路由、請求聚合、服務發現、認證、鑑權、限流熔斷、並內建了負載均衡器與Service Fabric、Butterfly Tracing整合。這些功能只都只需要簡單的配置即可完成。
如圖:
官網:https://ocelot.readthedocs.io/en/latest/index.html
4、微服務架構—認證&授權
現在的應用開發層出不窮,基於瀏覽器的網頁應用,基於微信的公眾號、小程式,基於IOS、Android的App,基於Windows系統的桌面應用和UWP應用等等,這麼多種類的應用,就給應用的開發帶來的挑戰,我們除了分別實現各個應用外,我們還要考慮各個應用之間的互動,通用模組的提煉,其中身份的認證和授權就是每個應用必不可少的的一部分。而現在的網際網路,對於資訊保安要求又十分苛刻,所以一套統一的身份認證和授權就至關重要。
IdentityServer4就是這樣一個框架,IdentityServer4是為ASP.NET CORE量身定製的實現了OpenId Connect和OAuth2.0協議的認證授權中介軟體。
專案地址:https://github.com/IdentityServer/IdentityServer4
5、微服務架構—瞬態故障處理
Polly它一款強大的類庫,Polly是一種.NET彈性和瞬態故障處理庫,允許我們以非常順暢和執行緒安全的方式來執諸如行重試,斷路,超時,故障恢復等策略。 Polly針對
.NET 4.0,.NET 4.5和.NET Standard 1.1以及.NET Core實現,該專案作者現已成為.NET基金會一員,專案一直在不停迭代和更新,你值得擁有。
專案地址: https://github.com/App-vNext/Polly
6、微服務架構----分散式追蹤
隨著微服務架構的流行,一些微服務架構下的問題也會越來越突出,比如一個請求會涉及多個服務,而服務本身可能也會依賴其他服務,整個請求路徑就構成了一個網狀的呼叫鏈,而在整個呼叫鏈中一旦某個節點發生異常,整個呼叫鏈的穩定性就會受到影響,所以會深深的感受到
“銀彈” 這個詞是不存在的,每種架構都有其優缺點 。
面對以上情況, 我們就需要一些可以幫助理解系統行為、用於分析效能問題的工具,以便發生故障的時候,能夠快速定位和解決問題,這時候 APM(應用效能管理)工具就該閃亮登場了。
專案地址:https://github.com/SkyAPM/SkyAPM-dotnet
7、微服務架構----分散式日誌
一般我們需要進行日誌分析場景:直接在日誌檔案中 grep、awk 就可以獲得自己想要的資訊。但在規模較大也就是日誌量多而複雜的場景中,此方法效率低下,面臨問題包括日誌量太大如何歸檔、文字搜尋太慢怎麼辦、如何多維度查詢。需要集中化的日誌管理,所有伺服器上的日誌收集彙總。常見解決思路是建立集中式日誌收集系統,將所有節點上的日誌統一收集,管理,訪問。
大型系統通常都是一個分散式部署的架構,不同的服務模組部署在不同的伺服器上,問題出現時,大部分情況需要根據問題暴露的關鍵資訊,定位到具體的伺服器和服務模組,構建一套集中式日誌系統,可以提高定位問題的效率。
(1)、Exceptionless 是一個開源的實時的日誌收集框架,它可以應用在基於 ASP.NET,ASP.NET Core,Web Api,Web Forms,WPF,Console,MVC 等技術棧的應用程式中,並且提供了Rest介面可以應用在 Javascript,Node.js 中。它將日誌收集變得簡單易用並且不需要了解太多的相關技術細節及配置。在以前,我們做日誌收集大多使用 Log4net,Nlog 等框架,在應用程式變得複雜並且叢集的時候,可能傳統的方式已經不是很好的適用了,因為收集各個日誌並且分析他們將變得麻煩而且浪費時間。
現在Exceptionless團隊給我們提供了一個更好的框架來做這件事情,我認為這是非常偉大並且有意義的,感謝他們。
官網:http://exceptionless.com/
GitHub:https://github.com/exceptionless/Exceptionless
(2)、ELK是三個開源軟體的縮寫,分別為:Elasticsearch 、 Logstash以及Kibana , 它們都是開源軟體。不過現在還新增了一個Beats,它是一個輕量級的日誌收集處理工具(Agent),Beats佔用資源少,適合於在各個伺服器上搜集日誌後傳輸給Logstash,官方也推薦此工具,目前由於原本的ELK Stack成員中加入了 Beats 工具所以已改名為Elastic Stack。推薦使用。
8、微服務架構----分散式配置中心
Apollo(阿波羅)是攜程框架部門研發的配置管理平臺,能夠集中化管理應用不同環境、不同叢集的配置,配置修改後能夠實時推送到應用端,並且具備規範的許可權、流程治理等特性。
服務端基於 Spring Boot 和 Spring Cloud 開發,打包後可以直接執行,不需要額外安裝 Tomcat 等應用容器。
Java 客戶端不依賴任何框架,能夠運行於所有 Java 執行時環境,同時對 Spring 環境也有較好的支援。
.Net 客戶端不依賴任何框架,能夠運行於所有 .Net 執行時環境。
專案地址:https://github.com/ctripcorp/apollo/
9、微服務架構----分散式鎖
分散式鎖的解決方案有很多,我在這裡就羅列一些,我會在以後的實踐中實現這些技術點。
(1)、Consul 可以實現分散式鎖
(2)、Redis 可以實現分散式鎖,推薦使用。
(3)、Zookeeper 可以實現分散式鎖
(4)、資料庫 可以實現分散式鎖
10、微服務架構----分散式事務
分散式事務的實現方式也不少,以後努力學習吧。
(1)、2PC(two-phase
commit protocol,強一致性,沒有可用性)
(2)、3PC
(3)、TCC(Try-Confirm-Cancel)
(4)、本地訊息表,推薦
RabbitMQ。
(5)、Saga 模式
本地訊息表:MQ分散式事務—本地訊息表—基於訊息的一致性。
(1)、上有投遞訊息
(2)、下游獲取訊息
(3)、上游投遞穩定性
(4)、下游接受穩定性
11、微服務架構—容器化
Docker 是一個開源的應用容器引擎,可以打包應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的 Linux 和Windows 機器上,也可以實現虛擬化。
Docker 使用客戶端-伺服器 (C/S) 架構模式,使用遠端API來管理和建立Docker容器。Docker 容器通過 Docker 映象來建立。容器與映象的關係類似於面向物件程式設計中的物件與類。
Docker採用 C/S架構 Docker daemon 作為服務端接受來自客戶的請求,並處理這些請求(建立、執行、分發容器)。 客戶端和服務端既可以執行在一個機器上,也可通過 socket 或者RESTful API 來進行通訊。
Docker daemon 一般在宿主主機後臺執行,等待接收來自客戶端的訊息。 Docker 客戶端則為使用者提供一系列可執行命令,使用者用這些命令實現跟 Docker daemon 互動。
如圖:
12、微服務架構—容器編排
Kubernetes是Google開源的一個容器編排引擎,它支援自動化部署、大規模可伸縮、應用容器化管理。在生產環境中部署一個應用程式時,通常要部署該應用的多個例項以便對應用請求進行負載均衡。
在Kubernetes中,我們可以建立多個容器,每個容器裡面執行一個應用例項,然後通過內建的負載均衡策略,實現對這一組應用例項的管理、發現、訪問,而這些細節都不需要運維人員去進行復雜的手工配置和處理。
Kubernetes 也可以理解為Docker 的編排容器,是管理應用的全生命週期的工具,從建立應用/部署,應用提供服務,擴容縮容,更新,都非常的方便,而且可以做到故障自愈
中文社群:http://docs.kubernetes.org.cn/
官網:https://kubernetes.io/docs/home/
13、微服務架構—CI/CD
Jenkins 是一個開源的、提供友好操作介面的持續整合(CI)工具,主要用於持續、自動的構建/測試軟體專案、監控外部任務的執行。
官網: http://www.jenkins.org.cn/
五、 結束語
好了,今天就寫到這裡了,今天還是寫了不少東西,今天沒別的,就是做一下相關技術棧的記錄,以後有時間,再把每項技術仔細研究,可能是每項技術,也可能是以一個專案來研究,這個專案中可能包含很多其他的技術,到時候,再決定。每天進步一點,加油。