微服務架構
- 微服務是一種分布式系統架構,是一種思想,是一種設計原則。通過springboot來建立服務,而Spring Cloud是關注全局的服務治理架構。
- springboot不是微服務
- 就目前而言對于微服務業界沒有一個統一的,标準的定義.但通常而言,微服務是一種架構模式或者說是一種架構風格,它提倡單一應用程式劃分為一組小的服務,每個服務在其獨立的自己的程序中,服務之間互相協調,互相配合,為使用者提供最終價值.服務之間采用輕量級的通信機制互相溝通(基于Http的Restful API)每個服務都圍繞着具體的業務進行建構,并且能夠被獨立的部署到生産環境,類生産環境進行建構,可以有一個非常輕量級的集中式管理來協調這些服務,可以使用不同的語言來編寫服務,也可以使用不同的資料存儲.
- 優勢
- 複雜度可控:即便再複雜的應用開發,我們把它拆分成多個小的微服務,就很簡答的進行分組開發,大大的提高效率。
- 獨立部署:由于微服務具備獨立的運作程序,是以每個微服務也可以獨立部署。
- 容錯性能好:因為單個服務,是以即便出了故障,那麼我們bug也會僅僅停留在某個服務中,不會影響其他服務的正常使用。
- 擴充性高:我們需要什麼功能直接增加服務就好了。
Spring Cloud 是什麼
- 基于SpringBoot提供了一套微服務(microservices)解決方案,包括服務注冊與發現。
- 是分布式微服務架構下的一站式解決方案,是各個微服務架構落地技術的結合體,俗稱為微服務全家桶。
- spring cloud 為開發者提供了一套快速開發分布式系統的元件,Spring Cloud并不推薦重複造輪子,主張利用Spring Boot将其他公司較成熟的元件進行封裝。
與spring boot的關系和差別
1、SpringBoot專注于友善的開發單個個體微服務
2.SpringCloud是關注于全局的微服務協調治理架構,它将SpringBoot開發的一個個單體微服務整合并管理起來,為各個微服務之間提供配置管理、服務發現、斷路器、路由、微代理、事件總線,、決策競選、分布式會話等內建服務。
3.SpringBoot可以離開SpringCloud單獨使用,而SpringCloud離不開SpringBoot。
Spring Cloud 核心概念
配置中心
微服務系統中,存在很多功能開關和各種參數的配置項,傳統的配置檔案、資料庫等方式無法滿足開發人員對配合管理的需求,此時,分布式配置中心應運而生。
特點:
-
統一管理
配置中心服務端負責配置的管理(新增、修改、删除、釋出),內建了配置中心用戶端的微服務程式可以統一從配置中心服務端拉取配置,進而實作整個微服務系統的統一配置管理。
-
區分環境
一個微服務應用中的某些配置項,在不同的環境(開發、測試、生産)通常是不同的,作為分布式配置中心需要具有隔離不同環境的功能,使得同一個微服務在不同環境能拉取到對應的配置。
-
實時重新整理
當配置中心服務端中的配置發生了修改時,配置中心用戶端需要能實時監聽到配置的改變,使得微服務應用程式可以實時擷取到最新配置,并且不用重新部署應用程式。
-
權限控制
在配置中心中,可以針對不同的角色或使用者設定對應的權限,比如張三可以建立配置項,但不能釋出配置;比如小明可以檢視配置項,但不能修改配置
-
版本控制
在使用配置中心的過程中,難免會出現誤操作,而這個時候就需要進行版本回退,是以作為配置中心,是一定要支援版本控制的。
-
灰階釋出
在需要釋出一項配置時,如果需要釋出到多個執行個體(叢集),那麼此時可以指釋出到部分執行個體,待測試通過後,再釋出到全部執行個體,這就是配置的灰階釋出。
常用配置中心元件
- Spring Cloud Config
-
阿裡Nacos
Nacos預設内置配置中心,配置資訊采用存儲儲存在指定的資料庫中
- 攜程Apollo
- 谷歌consul
注冊中心
注冊中心相當于微服務架構中的位址通訊錄,每個微服務會将服務及其位址注冊到注冊中心,服務消費者在調用某個微服務之前會先從注冊中心查找服務位址,然後進行調用
特點
- 服務的自動注冊
微服務應用在啟動時,通過注冊中心用戶端元件,将服務相關資訊自動注冊給注冊中心服務端。
- 服務的健康檢查
當已經注冊到注冊中心的微服務執行個體當機後,注冊中心服務端能發現執行個體已經當機,并把相關的資訊從注冊中心删除掉。
- 服務的自動發現
服務消費者需要能實時監聽到注冊中心中服務資訊的變更,以能在真正調用服務時不會出現錯誤。
常見注冊中心元件
- Zookeeper
- Eureka
-
Nacos
Nacos提供了一組簡單易用的特性集,幫助您較快速實作動态服務發現、服務配置、服務中繼資料及流量管理
- Consul
服務網關
服務網關是整個微服務架構中對外的統一入口,所有的用戶端都通過統一的網關是用微服務,服務網關起到了隔離外部通路和内部系統的作用,服務網關是微服務架構中的一個标配元件。
特點
-
高并發
作為微服務架構中的對外入口,必須能支援高并發,能承擔更高的并發量,并保證高性能
-
安全
服務網關通常具有權限認證,黑名單、白名單等保證網關安全的功能。
-
路由轉發
服務網關接收到外部請求後,要求服務網關能根據請求和配置将請求轉發到對應的後端微服務上去。
-
監控與限流
作為整個系統的流量入口,服務網關要能監控流量情況,遇到突發情況時能及時限流,保證整個系統的穩定。
-
灰階釋出
當某個微服務有新版本更新上線時,可以利用服務網關進行流量的切換,實作該微服務的灰階釋出。
-
服務重試
當服務網關調用某個微服務失敗後,可以通過服務網關設定重試政策來重新嘗試調用該服務。
-
服務别名
可以在服務網關中給某個或某些微服務設定别名,進而對外屏蔽内部微服務相關資訊。
常見服務網關元件
- Kong
- Zuul
- Spring Cloud Gateway
負載均衡
負載均衡是指将通路流量根據負載均衡算法分發到後端伺服器的流量分發控制服務,通過負載均衡可以提高微服務的可用性以及性能
常見負載均衡算法
-
簡單輪詢
将請求按順序分發給後端伺服器上,不關心伺服器目前的狀态,比如後端伺服器的性能、目前的負載
-
權重輪詢
根據伺服器自身的性能給伺服器設定不同的權重,将請求按順序和權重分發給後端伺服器,可以讓性能高的機器處理更多的請求
-
簡單随機
将請求随機分發給後端伺服器上,請求越多,各個伺服器接收到的請求越平均
-
權重随機
根據伺服器自身的性能給伺服器設定不同的權重,将請求按各個伺服器的權重随機分發給後端伺服器
-
一緻性hash
根據請求的用戶端ip、或請求參數通過雜湊演算法得到一個數值,利用該數值取模映射出對應的後端伺服器,這樣能保證同一個用戶端或相同的參數的請求每次都使用同一台伺服器
-
最小活躍數
統計每台伺服器上目前正在處理的請求數,也就是請求的活躍數,将請求分發給活躍數最少的背景伺服器
常見的負載均衡元件
- nginx
- lvs
- ribbon
-
Nacos服務端均衡
與Ribbon在調用端負載均衡不同,Nacos是在服務發現的同時利用負載均衡傳回服務節點資料
RPC調用
RPC就是遠端過程調用,對于java程式而言,RPC就是遠端方法調用,表示一個方法調用遠端的另一個方法,微服務架構中一個服務調用另外一個服務就可以用RPC調用
RPC調用與http調用的差別
- http調用使用的是http協定,是網絡7層中的應用層協定,http協定規定了資料傳輸的格式,Restful風格就可以通過http協定來實作;
- RPC不是網絡層面的協定,而是更上層的更靈活的通信協定,RPC調用可以自定義資料格式、資料傳輸方式,隻要能保證調用的遠端方法即可。
常用的RPC調用元件或架構
-
Dubbo
Alibaba預設對自家的RPC架構Dubbo也給予支援,為服務見通訊提供了另一種選擇
- gRPC
- Thrift
- Feign
服務熔斷
服務熔斷是指,當服務A調用的某個服務B不可用時,上遊服務A為了保證自己不受影響,進而不再調用服務B,直接傳回一個結果,減輕服務A和服務B的壓力,直到服務B恢複
常見熔斷器元件
- Hystrix
-
Sentinel
Sentinel功能更為強大,實作系統保護相較Hystrix更加優雅,而且擁有更友好的管理UI
熔斷器的三種狀态
-
Closed:關閉狀态
當調用失敗次數達到門檻值時則啟動熔斷器
-
Open:狀态
此時不會真正的調用下遊服務,而是直接傳回,當過了 某段時間後,熔斷器會進入到半打開狀态
-
Half-Open:半打開狀态
此時會有部分請求通路下遊服務,如果這些請求都調用成功了,則認為下遊服務恢複了,那麼則關閉熔斷器,否則熔斷器回到打開狀态
服務降級
當發現系統壓力過載時,可以通過關閉某個服務,或限流某個服務來減輕系統壓力,這就是服務降級
服務降級和服務熔斷的差別
- 都是為了防止系統崩潰
- 都讓使用者體驗到某些功能暫時不可用
- 熔斷是下遊服務故障觸發的,降級是為了降低系統負載
服務雪崩
服務A調用服務B,服務B調用服務C,此時大量請求突然調用服務A,假如服務A能扛住這些請求,但是服務C扛不住,導緻服務C請求堆積,進而服務B請求堆積,進而服務A不可用,這就是服務雪崩,解決方式就是服務降級和服務熔斷。
服務限流
服務限流是指在高并發請求下,為了保護系統,可以對通路服務的請求進行數量上的限制,進而防止系統不被大量請求壓垮,在秒殺中,限流是非常重要的。
常用的限流算法
- 固定視窗計數器
- 滑動視窗計數器
- 令牌桶
- 漏桶
全局鎖
全局鎖就是我們常說的分布式鎖,是分布式、微服務架構中的一種鎖機制,通過全局鎖可以很好的在分布式系統中互斥使用共享資源。
全局鎖的實作原理
- Zookeeper:利用Zookeeper的watch機制與臨時節點特性
- Redis:利用Redis的消費訂閱機制與資料逾時特性
常用的全局鎖元件
- Redisson
- Curator
控制總線
控制總線也稱為消息總線,是微服務系統中用來連接配接系統中所有服務節點的,微服務中的所有服務節點可以通過控制總線來進行通訊
應用場景
- 目前,Spring Cloud Bus 就是控制總線的具體實作,某個微服務可以通過Spring Cloud Bus來廣播事件,而其他微服務可以接收到事件并進行相關處理。
消息隊列
元件
- RabbitMQ
- ActiveMQ
- Kafka
- RocketMQ:Spring Cloud Alibaba在原有Spring Cloud支援的MQ前提下,對自己的消息隊列産品RocketMQ進行內建
分布式事務
在一次請求中,所涉及的分散在多個微服務上的操作要保證同時成功或同時失敗,這就是分布式事務。
實作分布式事務的方式
- 直接通過資料庫
- 通過消息隊列
- 兩階段送出
- 三階段送出
分布式事務中的三個角色
- 事務協調器
- 事務管理者
- 資源管理者
常用的分布式事務架構
- seata
- seata是Alibaba開源分布式事務中間件,内置AT、TCC與SAGA三種模式适用不同的分布式事務場景
- Icn
- bytetcc
服務安全
對于一個企業來說,微服務系統中的服務安全性越來越重要,服務的認證和授權是企業必須具備的,spring cloud security是Spring Cloud提供的微服務安全元件
特性
- 可擴充、可配置的認證和授權
- 單點登入
- 防止會話固定、點選劫持、跨網站請求僞造攻擊
- 與Servlet API內建
鍊路追蹤
鍊路追蹤為微服務系統提供了完整的調用鍊路還原、調用請求量統計、鍊路拓撲、應用依賴分析等功能,可以幫助開發者快速分析和診斷微服務架構下的性能瓶頸
功能
- 分布式調用鍊查詢和診斷
- 應用性能實時彙總
- 分布式拓撲動态發現
- 多語言開發程式接入
- 豐富的下遊對接場景
常用的鍊路追蹤技術
Sleuth
Zipkin
叢集管理
對于微服務系統中的某個服務叢集所提供的針對集權管理的功能,Spring Cloud Cluster的職責就是叢集管理
功能
- 上司者選舉
- 一緻性存儲
- 叢集狀态管理
- 一緻性tokens
事件驅動
事件驅動就是消息驅動,在Spring Cloud中提供了Spring Cloud Stream來實作事件驅動,有了事件驅動,在微服務系統中可以友善的通過發送消息來進行通信。
目标綁定器:目标指的是kafka或rabbitmq
綁定橋梁:連接配接消息系統和應用程式
消息:應用程式和消息系統之間傳遞的資料
特點:
- 異步處理
- 流量削峰
- 服務解耦
任務排程
元件
- Alibaba Cloud SchedulerX
- 阿裡中間件團隊開發的一款分布式任務排程産品,提供秒級、精準、高可靠、高可用的定時排程服務
分布式存儲
元件
- Alibaba Cloud OSS
- 阿裡雲對象存儲服務,是阿裡雲提供的海量、安全、低成本、高可靠的雲儲存服務
- FastDFS
雲連接配接器
雲連接配接器可以用來更友善的連接配接部署在雲上的各種服務,Spring Cloud中Spring Cloud Connectors就是雲連接配接器的元件實作
目前支援多的雲平台
- Spring Cloud Cloud Foundry
- Spring Cloud Heroku
函數計算
函數j計算也稱為函數式程式設計,是實作Serverless的一種手段,企業如果能使用函數計算能大大節約成本,在Spring Cloud中提供了Spring Cloud Function來開發基于雲平台的函數計算
特點:
- 支援響應式等程式設計風格
- 輸入輸出類型透明轉化
- 流資料處理
- 同一個jvm中運作多版本函數
- 打包函數到指定雲平台