1、什麼是微服務
Java微服務是一種架構風格,透過將單個Spring Boot應用程式拆分為一組小型、獨立的Spring Boot服務來構建分散式系統。每個微服務都執行在自己的程序中,並使用輕量級通訊機制(如HTTP或訊息佇列)來進行相互之間的通訊。微服務的設計目標是提高系統的靈活性、可伸縮性和可維護性。透過將應用程式拆分為多個微服務,可以實現更好的團隊協作和並行開發。每個微服務都可以由不同的開發團隊負責開發和維護,因此可以快速迭代和部署,而不會對整個系統產生太大的影響。
拆分微服務的特點:
- 獨立部署:每個微服務都可以獨立部署,因為它們是獨立的程序。這意味著當某個微服務需要進行更改或調整時,只需重新部署該微服務,而不需要重新部署整個系統。
- 松耦合:由於微服務之間使用輕量級通訊機制進行通訊,它們可以相對獨立地演化和擴充套件。每個微服務都可以根據需要進行擴充套件,而不會對其他微服務造成影響。
- 垂直劃分:微服務架構鼓勵將應用程式按業務領域劃分為多個微服務。這種垂直劃分使得每個微服務都可以專注於解決特定的業務問題,提高開發和維護的效率。
- 彈性和容錯:微服務架構使用一些彈性和容錯機制來提高系統的穩定性。例如,可以使用負載均衡、熔斷器和容錯機制來處理異常情況,並保護系統免受單個微服務的故障影響。
- 中心化治理:微服務架構通常使用一些中心化的工具和元件來處理服務註冊和發現、負載均衡、監控和日誌等功能。
微服務的弊端:
- 分散式系統複雜性:拆分成多個微服務後,系統的複雜性得到加劇。需要考慮服務之間的通訊、資料一致性、服務呼叫鏈的監控等問題。因此,微服務架構需要更高的開發和運維技術水平,同時也需要投入更多的成本和資源進行管理和維護。
- 服務呼叫開銷:由於微服務之間需要進行網路通訊,會帶來一定的效能開銷。每個服務呼叫都需要經過網路傳輸,並可能受到網路延遲和故障的影響。因此,需要在設計和實現中考慮減少服務之間的呼叫次數,以提高效能和可靠性。
- 資料管理複雜性:由於資料在不同的微服務中被分散儲存,資料一致性和事務處理變得更加困難。需要採用一些分散式資料管理策略,如事件驅動架構或分散式事務,來確保資料的一致性和可靠性。
總體而言,Java微服務架構使得開發人員可以更好地構建、部署和維護分散式系統。透過拆分應用程式為多個小型服務,並使用適當的工具和模式來管理這些服務之間的通訊和協調,提高系統的彈性、可伸縮性和可維護性。但是在決定將單體應用程式轉換為微服務時,需要仔細評估和權衡成本和利益,確保有足夠的資源和技術能力來應對微服務架構所帶來的挑戰。微服務架構帶來的分散式系統的複雜性,包括服務發現、通訊、資料一致性等方面的問題還是值得我們去謹慎考慮的。
2、微服務常見元件和功能
Spring Cloud是一個用於構建分散式系統的開發工具集合,基於Spring框架,提供了一系列的解決方案和工具,使得開發者能夠更輕鬆地構建、部署和管理分散式系統中的微服務。一套完整的微服務架構需要以下相關元件:
- 註冊中心:服務的註冊與發現,服務可以註冊自己的資訊到註冊中心,並且可以從註冊中心獲取其他服務的資訊,從而實現服務之間的通訊和協作。
- 配置中心:集中式的配置管理解決方案,可以實現對分散式系統中各個微服務的配置進行集中管理,實現配置的動態重新整理。
- 閘道器: 統一的介面訪問路徑,實現請求的轉發、鑑權、限流、請求轉換等功能。
- 負載均衡: 使得服務能夠根據負載情況自動分配流量,並提供了一些策略和配置選項來實現高效的負載均衡。
- 遠端呼叫:遠端呼叫是微服務架構中的重要部分,它使得服務之間可以相互協作並提供複雜的業務功能。
- 熔斷器:熔斷器可以防止分散式系統中的故障蔓延,透過快速失敗和回退機制,保護呼叫方免受故障影響。
- 鏈路追蹤: 實現分散式系統中的鏈路追蹤和請求跟蹤。透過鏈路追蹤,可以跟蹤請求在分散式系統中的傳遞和處理路徑,便於故障排查和效能最佳化。
- 訊息佇列: 訊息佇列可以用於在微服務之間進行訊息的傳遞和通訊,實現解耦和非同步通訊。
- 任務排程:對定時任務進行管理和排程的過程。任務排程涉及到確定任務的執行時間、執行頻率、任務優先順序以及任務間的依賴關係等。幫助我們管理和排程任務,提高系統的效率和可靠性。
- 服務監控:用於監控微服務的效能指標、錯誤和故障資訊。常用監控工具:Prometheus和Grafana 。
- 容器化和編排:容器化和編排工具用於將微服務部署到容器中,並管理容器化應用程式的生命週期。Docker和Kubernetes是常見的容器化和編排工具。
以上就是微服務常見元件和功能,實際上,微服務技術棧可以根據特定的需求和技術棧進行靈活的組合和擴充套件。選擇正確的微服務棧元件取決於應用程式的要求、團隊的技術能力和可用的資源。
總的來說微服務分為服務核心元件和服務治理兩個方面,架構圖如下:
透過使用五大核心元件,微服務已經搭建成功了,但並不算是一個完整的微服務。如果沒有服務治理方面的元件,很難確保系統穩定性、安全性和可擴充套件性的。
3、微服務技術棧
現在微服務有兩套實現分別為Spring Cloud Netflix和Spring Cloud Alibaba兩個大版本。Spring Cloud Netflix版一些重要元件如註冊中心Euraka、Ribbon、Zuul、Feign已經不再迭代更新了,而Spring Cloud Alibaba已經慢慢的孵化出了一套自己的相關元件。
3.1、Spring Cloud Netflix相關元件說明
主要由:Eureka、Ribbon、Feign、Hystrix、Zuul|Gateway、Config等元件組成。還有一些補充元件Spring Cloud Config(分散式配置管理)、Spring Cloud Bus(訊息匯流排)、Spring Cloud Security(安全管理)等。
- Eureka:Eureka是一個服務註冊和發現元件。服務提供者可以將自己註冊到Eureka伺服器,而服務消費者可以從Eureka伺服器中獲取可用的服務列表。Eureka提供了負載均衡和故障轉移的能力。
- Spring Cloud Config:配置中心,集中式的配置管理解決方案。
- Feign:Feign是一個宣告式的HTTP客戶端。它簡化了對其他微服務的呼叫,比如使用Feign可以輕鬆地定義RESTful介面並將其對映到實際的服務呼叫。Feign整合了Ribbon和Hystrix,提供了負載均衡和容錯的能力。目前Feign已經不迭代更新,可以使用OpenFeign。
- Ribbon:Ribbon是一個客戶端負載均衡元件。它可以根據配置的負載均衡策略,從服務註冊中心(如Eureka)獲取可用服務列表,並將請求分發給這些服務例項。Ribbon支援多種負載均衡演算法,並提供了靈活的配置選項。
- Hystrix:Hystrix是一個容錯和延遲容忍的庫。它可以防止分散式系統中的故障導致級聯故障。Hystrix透過使用斷路器模式,可以在服務呼叫失敗時提供回退機制,並提供了實時的監控和度量指標。
- Zuul:Zuul是一個閘道器元件,可以實現請求的路由、過濾和負載均衡等功能。它可以作為一個單一入口點,代理客戶端請求並將其路由到後端的微服務。同時,Zuul還支援動態路由配置和服務的自動發現。服務閘道器,多個服務提供唯一的訪問介面。目前Zuul不迭代更新,可以使用Gateway。
總之,Spring Cloud Netflix提供了一套完整的、基於Netflix OSS的分散式系統解決方案。透過使用這些元件,可以更輕鬆地構建和管理微服務架構,並提供負載均衡、容錯和服務發現等核心功能。但是由於許多元件已經不再迭代更新了,所以不推薦全部使用基於Netflix的一套微服務解決方案。需要透過別的元件配合使用。
3.2 Spring Cloud Alibaba相關元件說明
Spring Cloud Alibaba是Spring Cloud的一套擴充框架,它提供了一系列與阿里巴巴生態系統整合的元件,用於構建微服務架構。主要由:Nacos、Sentinel、Seata、RocketMQ、Dubbo等元件組成。目前RocketMQ、Dubbo和Seata這三個專案都已經捐贈給了Apache軟體基金會(Apache Software Foundation)。
- Nacos:Nacos是一個服務發現和配置管理的平臺,可以實現服務註冊、發現、配置和管理。Nacos可以作為一個類似於Eureka和Spring Cloud Config的解決方案,同時還提供了更豐富的配置管理能力。有圖形化介面,簡化了微服務架構的複雜度。
- Sentinel:Sentinel是一個輕量級的流量控制和熔斷降級框架。它可以實時監控應用的流量和系統狀態,並提供實時的流量控制、熔斷降級和系統負載保護等功能。多個維度保護服務的穩定性。
- Seata:高效能微服務分散式事務解決方案。
- RocketMQ:RocketMQ是阿里巴巴開源的分散式訊息佇列系統。它提供了低延時、高可靠性、高吞吐量的訊息傳遞服務,適用於大規模分散式系統的訊息通訊。
- Dubbo:高效能 RPC 框架。類似於OpenFeign。
- Alibaba Cloud OSS(Object Storage Service):是阿里雲提供的海量、安全、低成本、高可靠的雲端儲存服務。Spring Cloud Alibaba支援將OSS作為檔案儲存和物件儲存的解決方案,並提供了便利的API和工具,用於在微服務中使用OSS進行檔案上傳、下載和儲存操作。
- Alibaba Cloud SMS(Short Message Service):是阿里雲提供的簡訊服務。Spring Cloud Alibaba提供了整合SMS的元件,可以輕鬆地傳送簡訊通知和驗證碼等訊息。覆蓋全球的簡訊服務,友好、高效、智慧的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。
- Alibaba Cloud SchedulerX:阿里中介軟體團隊開發的一款分散式任務排程產品,提供秒級、精準、高可靠、高可用的定時(基於 Cron 表示式)任務排程服務。
OSS、SMS、SchedulerX等主要是阿里雲的商業化產品,需要付費才能夠使用。總之阿里巴巴生態系統的元件整合,為我們提供了更多的選擇和功能。可以輕鬆地構建阿里巴巴風格的微服務應用,並利用阿里巴巴生態系統的資源進行擴充套件和整合。也是目前最流行的一套微服務架構解決方案。
4、微服務技術選擇
透過上面我們瞭解到微服務使用的相關技術棧,我們可以透過結合Spring Cloud Netflix和Spring Cloud Alibaba相關元件。選擇出一套基於自己想要搭建的微服務技術棧:
- 註冊中心和配置中心:使用Spring Cloud Alibaba Nacos
- 負載均衡:使用LoadBalancer。Spring Cloud LoadBalancer是Spring Cloud官方推薦的負載均衡器,這是一個全新的負載均衡解決方案。它提供了多種負載均衡演算法(如輪詢、隨機等),並支援與服務註冊中心整合,以獲取服務例項列表。
- 服務呼叫:使用OpenFeign或者Dubbo,OpenFeign是宣告式的HTTP客戶端,Dubbo是RPC框架。
- 熔斷降級:使用Spring Cloud Alibaba Sentinel
- 訊息佇列:使用RocketMQ
- 分散式事務:使用Spring Cloud Alibaba Seata
- API閘道器:使用Gateway。Spring Cloud Gateway是一個高效能、可擴充套件的API閘道器,用於路由、轉發和過濾進入的HTTP請求。
- 任務排程:使用xxl-job, xxl-job是一個功能豐富、易用的分散式任務排程平臺,可以實現定時任務的排程和執行。它可以作為一個獨立的服務叢集,對任務進行統一的管理和排程,並支援任務的動態新增、修改和刪除, 適用於各種定時任務的場景.
- 鏈路追蹤 : 使用Zipkin ,Zipkin是一個開源的分散式系統跟蹤系統,用於收集、檢索和展示微服務架構中的請求鏈路資訊。它可以追蹤和分析請求路徑,識別效能問題和排查故障。
- 服務監控:使用Prometheus和Grafana ,Prometheus和Grafana是兩個常用的監控和視覺化工具,常用於對系統和應用程式進行監控和資料視覺化。
以上就是搭建微服務專案技術棧所需要的元件。另外也可以把註冊中心替換為Eureka,配置中心使用攜程開源的分散式配置中心Apollo,它們都是不錯的選擇,具體實現可以根據特定的需求進行靈活的組合和擴充套件。具體使用元件取決於應用程式的要求、團隊的技術能力和可用的資源。透過這些以選擇正確的微服務技術棧。
5、總結
總之,希望我們在搭建微服務的過程中,不要盲目的去使用任何一個元件,更不要因為那個元件比較流行就使用那個元件。每個微服務元件都有它們的使用場景,也有它們的利與弊。在使用之前一定要考慮它的使用成本以及是否有足夠的資源支撐和團隊的技術能力是否達標。如果滿足所有條件,在考慮使用它。最後希望不管是企業使用也好還是個人自己使用,都可以正確的選擇一套適用於自己或者企業的微服務技術實踐方案。