1. 程式人生 > >微服務學習筆記(二):Spring Cloud

微服務學習筆記(二):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