3.1 微服務架構的核心關鍵點
1. 微服務的服務治理

除上圖之外,對于微服務架構應用來說還有一個重要考量因素:快速水準擴充;
Q:但是在進行快速擴充時,我們不可能預先知道所有的服務執行個體位址并告知服務消費者,而且也無法确定有哪些,有多少消費者會來消費
解決上述問題的方案,服務治理(服務注冊以及服務發現)。
通過服務發現,消費者可以在預先不知道服務提供者實體位址的情況下,僅 通過相應的服務名稱就可以實作服務調用。
通過服務注冊,可以讓服務提供者在上線時将所提供的服務資訊注冊到服務治理伺服器中,供服務消費者使用。當服務下線時将自己從伺服器中登出,避免服務消費者調用而造成的異常。
2. 微服務的負載均衡
說起負載均衡,我們基本都是通過Ngnix反向代理方式來實作。
在微服務架構下,負載均衡就不僅僅指的是使用者請求入口,還包含了微服務之間的調用。
是以,對于微服務的負載均衡:我們提出了用戶端負載均衡也成為 軟負載均衡
核心思想核心思想就是在服務消費者(也就是用戶端)儲存有一份服務者清單,這份服務者清單通常是從服務治理伺服器中動态擷取,也可以采用固定配置方式,然後通過某種負載均衡政策來決定每次服務調用時所使用的具體服務執行個體,進而實作微服務之間的負載均衡。
3. 微服務的統一入口
API服務網關為微服務提供了一個統一的入口,并能夠附加一些路由規則,使得不同的微服務通過路由規則提供一緻的通路入口;
4. 微服務的容錯
微服務的架構的應用是一種高度分布式架構應用,各微服務之間的調用是通過網絡完成的,但是網絡通路是不可靠的. 是以,
如何在一個微服務不可用時不會影響其它微服務以及調用者?
如何有效防止服務調用失敗而引起的雪崩?
如何在一個服務不可用時能對使用者更友好,使整個應用非常具有彈性?
核心思想針對以上問題, 在微服務架構的容錯機制中,提出了斷路器、服務降級等模式。來防止微服務調用失敗引起的連鎖反應,保證核心業務的正常運作;
5. 微服務的統一配置
6. 微服務的監控
微服務架構下,調試将變得非常艱難。
如何将分散在多個日志之間的調用串聯起來,形成一個完整的請求調用鍊,将是另外一個非常大的挑戰。
針對這個問題及需求:
在微服務監控中提供了日志聚合,日志可視化分析,調用鍊跟蹤等解決方案;
7. 微服務的部署
- Docker:快速部署
- k8s:建構自動化部署編排
3.2 Spring Cloud 技術概覽
Spring Cloud 是在 Netflix OSS等多家開源的基礎上,将這些微服務架構 SpringBoot化,然後整合;
核心功能:- 基于 Netflix 實作服務治理、用戶端負載均衡和聲明式調用;
- 服務網關;
- 微服務容錯管理;
- 整合消息中間件提供消息驅動式開發;
- 基于Spring Security 提供微服務安全、單點登入功能;
- 分布式、版本化的統一配置管理;
3.2.1 SpringCloud 子項目
1. Spring Cloud 與 Spring Boot
Spring Boot
是微服務架構的核心技術之一。
其優點:
- 快速啟動
- 通過在Spring Boot應用中添加 Spring MVC依賴,可以快速實作基于REST架構的服務接口,并可以提供HTTP标準動作的支援;
- 預設提供JackJson序列化支援,可以讓服務接口輸入、輸出支援JSON
2. Spring Cloud 與服務治理
服務治理是Spring Cloud 的核心,關于服務治理 Spring Cloud 為我們提供了兩個選擇 Consul 和 Eureka
一般我們使用Eureka
Eureka 提供了服務注冊中心、服務發現用戶端,以及注冊服務的UI界面應用。
Eureka 做到了,節點之間互相平等,有部分注冊中心“挂掉” 也不會對整個應用造成影響。即使叢集隻剩一個節點存貨,也可以正常的治理服務。即使所有服務注冊中心都當機,Eureka用戶端中所緩存的服務執行個體清單資訊,也可讓服務消費者能夠正常工作,進而保證微服務之間互相調用的健壯性和應用的彈性;
3. Spring Cloud 與用戶端負載均衡
Spring Cloud 通過對Netflix微服務開源項目中的Ribbon再次封裝,實作了用戶端負載均衡。
Ribbon 預設與 Eureka 無縫整合,當用戶端啟動時, 從 Eureka 伺服器中擷取一份服務注冊清單并維護在本地,當服務消費者需要調用服務時,Ribbon 就會根據負載均衡政策選擇一個合适的服務提供者執行個體并進行通路。
Spring Cloud 通過內建 Netflix 的 Feign 項目,為開發者提供了聲明式服務調用。預設Feign項內建了Ribbon,使得聲明式調用也支援用戶端負載均衡功能;
4. Spring Cloud 與 微服務容錯、降級
微服務容錯、降級旨在為微服務架構提供更大的彈性,通過內建Netflix下的子項目 Hystrix,通過所提供的**@HystrixCommand**注解可以輕松為我們所開發的微服務提供容錯、回退、降級等功能。
Hystrix 是根據“斷路器“模式建立。當Hystrix 監控到某服務單元發生故障之後,就會進入服務熔斷處理,并向調用方傳回一個符合預期的服務降級處理(fallback),而不是長時間的等待或者抛出調用異常,進而保障服務調用方的線程不會被長時間、不必要的占用,避免故障在應用中的蔓延造成的雪崩效應。
而Hystrix 的儀表盤項目(Dashboard),可以監控各個服務調用所消耗的時間、請求數、成功率等。通過近乎實時的監控和告警,可以及時發現系統中潛在問題并進行處理。
5. Spring Cloud 與服務網關
Spring Cloud 通過內建 Netflix 中的Zuul 實作API服務網關功能,提供對請求的路由和過濾兩個功能;
路由功能 負責将外部請求轉發到具體的微服務執行個體上 ,是實作外部通路統一入口的基礎。
過濾器功能則負責對請求的處理過程進行幹預,是實作請求校驗、服務聚合等功能的基礎。
通過 Zuul 可以将細粒度的服務組合起來提供一個粗粒度的服務,所有請求都導入到一個統一的入口,對完整個服務隻需要暴露一個API接口,屏蔽了服務端的實作細節。
通過 Zuul 的反向代理功能,可以實作路由尋址,将請求轉發到後端的粗粒度服務上,并做一些通用的邏輯處理。
此外,Zuul 預設會與 Eureka 伺服器進行整合,自動從Eureka 伺服器中擷取所有注冊的服務并進行路由映射,實作API服務網關自動配置;
6. Spring Cloud 與消息中間件
Spring Cloud 中的 Stream 子項目,通過建立消息應用抽象層,建構了消息收發、分組消費和消息分片等功能處理,将業務應用中的消息收發與具體消息中間件進行解耦,使微服務應用開發中可以非常友善的與 Kafka 和 RabbitMQ 等消息中間件進行內建。
此外,Spring Cloud Bus 基于 Stream 進行拓展,可以作為微服務之間的事件、消息總線,用于服務叢集中狀态變化的傳播。比如 Spring Cloud Config 借助 Bus, 可以實作配置的動态重新整理處理。
7. Spring Cloud 與分布式配置中心
針對微服務架構下的配置檔案管理需求,Spring Cloud 提供了 Config 子項目。
它具有 中心化、版本控制、支援動态更新和語言獨立等特性。
在Config子項目中将微服務應用分為兩種角色:配置伺服器(Config Server)和 配置用戶端(Config Client)。
使用配置伺服器集中的管理所有配置屬性檔案,配置服務中心可以将配置屬性檔案存儲到 Git、SVN等具有版本管理倉庫中,也可以存放在檔案系統中。預設Git。
8. Spring Cloud 與微服務鍊路追蹤
-
子項目 Sleuth
Sleuth 為開發者提供了微服務之間調用的鍊路追蹤。
核心思想通過一個全局的ID将分布在各微服務服務節點上的請求處理串聯起來,還原了調用關系,并借助資料埋點,實作對微服務調用鍊路上的性能資料的采集。
- 子項目 Zipkin
通過将Sleuth 采集的資料發送給 Zipkin 進行存儲、統計和分析,進而可以實作可視化的分析和展示。
9. Spring Cloud 與 微服務安全
Spring Cloud Security 為我們提供了一個認證和鑒權的安全架構,實作了資源授權、令牌管理等功能,同時結合Zuul 可以将認證資訊在微服務調用過程中直接傳遞,簡化了我們進行安全管控的開發。
- spring Cloud Security 預設支援 OAuth 2.0認證協定,是以單點登入容易實作
- OAuth2.0所生成的令牌可以使用JWT的方式,進一步簡化了微服務中的安全管理。
10. Spring Cloud 的其他子項目
- Spring Cloud Cli: 提供了以指令行和腳本的方式來管理微服務;
- Spring Cloud Data Flow: 用于開發、執行大資料處理的同意程式設計模型和托管服務。
- Spring Cloud Task: 用于短時的任務管理和排程微服務管理,通常與Data Flow一起使用。
- Spring Cloud Starters: 類似于Spring Boot的 啟動項目,為基于Spring Cloud 的微服務開發提供開箱即用的依賴管理。
- Spring Cloud Contract: 這是面向Java的七月架構,消費者驅動的,旨在幫助開發者完成微服務測試的子項目。