微服務學習筆記(二):Spring Cloud
2. Spring Cloud
Spring Cloud作為Java語言的微服務框架,依賴於Spring Boot,具有快速開發、持續交付、易於部署等特點。
2.1 微服務應該具備的功能
微服務的特點:
- 按照業務劃分服務。每個微服務執行在獨立的程序中,有獨立的資料庫等元件。
- 通過輕量級機制如HTTP通訊。
- 有一套服務治理解決方案,服務之間不耦合。
- 單個微服務能夠叢集化部署,有負載均衡能力。
- 有一個完整的安全機制。
- 有鏈路追蹤能力。
- 有一套完整的實時日誌系統。
微服務的功能主要體現在:
- 服務註冊和發現
- 服務負載均衡
- 服務容錯
- 服務閘道器
- 服務配置統一管理
- 鏈路追蹤
- 實時日誌
2.1.1 服務的註冊和發現
微服務系統由大量微服務構成,每個微服務有眾多例項,服務之間相互依賴成網狀,需要服務註冊中心來統一管理微服務例項。
服務註冊是指向服務註冊中心一個服務例項,服務提供者將服務資訊(服務名、IP地址等)告知服務註冊中心。
服務發現是指當服務消費者需要消費另一個服務時,服務註冊中心告知服務消費者其消費的服務的例項資訊。
通常情況下,一個服務既是服務提供者也是服務消費者。
服務註冊中心提供服務的健康檢查方式。通常一個服務例項註冊後會定時向服務註冊中心傳送心跳,表明處於可用狀態。當一個服務例項停止向服務註冊中心提供心跳一段時間後,服務註冊中心認為該服務例項不可用,將其剔除服務註冊列表。如果服務例項繼續向註冊中心提供信條,服務註冊中心會將其重新加入服務註冊列表。
2.1.2 服務的負載均衡
微服務系統中,所有的服務向服務註冊中心註冊,服務註冊中心持有每個服務的服務名和IP地址等資訊,同時每個服務也會獲取服務註冊列表資訊。服務消費者整合負載均衡元件,向服務消費者獲取服務註冊列表資訊,每隔一段時間重新整理獲取該列表。當服務消費者消費服務時,負載均衡元件獲取服務提供者所有例項註冊資訊,並通過一定的負載均衡策略選擇一個服務提供者例項,向該例項進行服務消費,這樣就實現了負載均衡。
由於服務註冊中心不但需要定時接收服務的心跳,還需要向服務提供註冊列表資訊,當服務例項數量較大時服務註冊中心負載較重,此時需要實現服務註冊中心高可用。一般做法是將服務註冊中心叢集化,每個服務註冊中心的資料實時同步。
2.1.3 服務的容錯
這裡主要指分散式系統為解決雪崩效應引進的熔斷器機制。當一個服務處理使用者請求失敗次數超過設定閥值時,開啟熔斷器,所有的請求不執行業務邏輯而直接執行快速失敗。處於開啟狀態的熔斷器,一段時間後會處於半開啟狀態,熔斷器檢測一部分請求是否正常,如果執行的請求成功,則關閉熔斷器正常提供服務。
熔斷器機制的優點:
- 將資源進行隔離。某服務的某個API藉口故障只會隔離該API介面而不會影響到其他API介面。
- 服務降級。如果大量的請求短時間內湧入超過了服務的處理能力,開啟熔斷器將服務降級。
- 自我修復能力。自動檢查請求處理情況控制熔斷器開閉。
2.1.4 服務閘道器
微服務系統介面資源通常由服務閘道器統一暴露,內部服務不直接對外提供API介面。API閘道器通常有請求轉發的作用,並可能負責一定的安全驗證。服務閘道器層之前可能需要加負載均衡層(Nginx雙機熱備),通過一定的路由策略將請求轉發到閘道器層,經過一系列的身份驗證和許可權判斷轉發到具體的服務。
閘道器層的功能特性:
- 將所有服務API介面統一聚合、對外暴露,保護內部微服務單元API藉口。
- 可以作使用者身份認證、許可權驗證。
- 監控功能,記錄日誌。
- 流量監控。
- 便於執行測試。
2.1.5 服務配置統一管理
微服務架構中需要有統一管理配置檔案的元件。
首先,Config Server配置服務讀取配置檔案倉庫的配置資訊,配置檔案倉庫可以是本地倉庫也可以是遠端Git倉庫;啟動服務時,服務向配置服務讀取配置資訊;當服務配置資訊執行修改後,向配置服務傳送Post請求進行重新整理,此時服務會向配置服務重新讀取配置檔案。
對於叢集化的服務可以使用訊息匯流排來重新整理多個服務例項。
2.1.6 服務鏈路追蹤
微服務架構中需要實現分散式鏈路追蹤,來跟蹤一個請求有哪些服務參與、參與的順序如何,從而使請求鏈路清晰可見。
Google2010年發表的論文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》是業內實現鏈路追蹤的標杆和理論基礎。常見的鏈路追蹤元件有Dapper(Google)/Zipkin(Twitter)/Eagleeye(Alibaba)。
2.2 Spring Cloud
Spring Cloud是基於Spring Boot的。Spring Boot簡化了Spring複雜的配置和依賴管理,通過起步依賴和內建Servlet容器能夠使開發者迅速搭建一個Web工程。Spring Cloud的首要目標就是通過一系列開發元件和框架,幫助開發者迅速搭建一個分散式的微服務系統,通過包裝一系列技術框架,實現了一套基於註解、Java配置和基於模板開發的微服務框架,提供了服務註冊發現、配置中心、熔斷器、智慧路由、微代理、控制匯流排、全域性鎖、分散式會話等常用元件。
-
服務註冊發現元件Eureka
-
熔斷元件Hystrix
Hystrix除了基本的熔斷器功能外,還能夠實現服務降級、服務限流功能,另外還提供了熔斷器健康監測。Hystrix Dashboard提供單個服務熔斷器的健康狀態資料UI,Hystrix Turbine提供多個服務熔斷器的健康狀態資料UI。
-
負載均衡元件Ribbon
Ribbon通常和Eureka、Zuul、RestTemplate、Feign配合使用。
-
路由閘道器Zuul
Zuul有智慧路由和過濾的功能。Zuul與Ribbon結合能夠做到負載均衡、智慧路由。過濾功能是通過攔截請求實現的。
-
Spring Cloud Config
提供配置檔案統一管理功能。通常情況下,Spring Cloud Config和Spring Cloud Bus相互配合重新整理指定Client或所有Client的配置檔案。
-
Spring Cloud Security
是對Spring Security的封裝,提供使用者許可權驗證。通常會配合Spring Security OAuth2使用。
-
Spring Cloud Sleuth
分散式鏈路追蹤元件,封裝了Dapper、Zipkin、Kibana等。
-
Spring Cloud Stream
資料流操作包,可以封裝RabbitMQ、ActiveMQ、Kafka等訊息元件。
一個簡單的由Spring Cloud搭建的微服務系統通常由服務註冊中心Eureka、閘道器Zuul、配置中心Config和授權服務Auth構成。
其他元件:
- Feign 宣告式遠端排程元件
- Spring Cloud Bus訊息匯流排元件
- Spring Cloud Consul/Zookeeper服務註冊發現元件
- Spring Cloud Task 基於Spring Task,提供任務排程和任務管理功能
2.3 Dubbo
Dubbo是阿里巴巴開源的分散式服務框架。包含如下核心內容:
- RPC遠端呼叫:封裝長連線NIO框架如Netty等。
- 叢集容錯:提供基於介面方法的遠端呼叫,並實現負載均衡功能。
- 服務發現:整合Apache Zookeeper。
與Spring Cloud比較:
關注點 | Spring Cloud | Dubbo |
---|---|---|
配置管理 | Spring Cloud Config | - |
服務發現 | Eureka/Consul/Zookeeper | Zookeeper |
負載均衡 | Ribbon | 自帶 |
閘道器 | Zuul | - |
分散式追蹤 | Spring Cloud Sleuth | - |
容錯 | Hystrix | 不完善 |
通訊方式 | HTTP、Message | RPC |
安全模組 | Spring Cloud Security | - |
2.4 Kubernetes
Kubernetes是Google開發的容器叢集管理系統,具有以下特點:
- Planet Scale大容量
- Never Outgrow永不過時
- Run Anywhere隨時隨地執行
Kubernetes提供的功能:
- Automatic Binpacking自動包裝
- Self-healing自我修復
- Horizontal Scaling橫向擴充套件
- Service Discovery and Load Balancing服務發現和負載均衡
- Automated Rollouts and Rollbacks自動部署或回滾
- Secret and Configuration Management配置管理
- Storge Orchestration儲存編排
- Batch execution批量處理
Kubernetes完全可以成為構建和部署為服務的一個工具,是從服務編排上實現的。
與Spring Cloud對比:
關注點 | Spring Cloud | Kubernetes |
---|---|---|
配置管理 | Spring Cloud Config | Kubernetes ConfigMap |
服務發現 | Eureka/Consul/Zookeeper | Kubernetes Services |
負載均衡 | Ribbon | Kubernetes Services |
閘道器 | Zuul | Kubernetes Services |
分散式追蹤 | Spring Cloud Sleuth | Open tracing |
容錯 | Hystrix | Kubernetes Health Check |
安全模組 | Spring Cloud Security | - |
分散式日誌 | ELK | EFK |
任務管理 | Spring Batch | Kubernetes Jobs |