亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
慕課專欄

目錄

索引目錄

32 堂微服務架構設計與落地精講課

原價 ¥ 78.00

立即訂閱
06 開啟微服務,我們需要配齊多少設施?
更新時間:2021-01-04 15:22:39
誰和我一樣用功,誰就會和我一樣成功。——莫扎特

前言

微服務是一整套體系,并不是僅僅代碼上業務開發,為了開發的完整性,我們究竟得配置多少治理的設施。在這一章節,我們先了解這些設施的作用是什么,為何會存在和需要這些設施,以便在我們后面章節對這些設施做詳細講解有個概要的認識。

一個國家人多了就需要有一個政府,由這個政府組織起來各個行政部門負責起來各種行政職能,對企業人民進行管理和服務,保證企業的正常生產,人民的安居樂業。

圖片描述

在微服務體系也是如此,一個公司的微服務系統龐大多了,也是需要有對應支撐組織對業務模塊進行服務和治理。

下面我們就一起來看下,一個中大規模的公司,想要讓微服務能夠 “Drop in 業務開發”,需要多少的治理支撐。

圖片描述

1. 我們需要配齊多少設施

1.1 服務注冊發現

當我們開始使用微服務架構時,我們會將一個大的單體應用拆分成多個獨立的小服務,然后必須滿足每個小的服務之間能夠相互進行通信,假設我們沒有服務發現的支撐,我們只能用硬編碼的方式將需要通信的服務的網絡信息寫在調用方的服務中。

但是,這樣會出現一系列的問題:

  • 通信方式例如網絡地址有變化時無法及時通知消費者;
  • 在生產環境中,每個服務一般都會部署多個實例以實現負載均衡,當要對一組服務增加或減少實例,都得去相應改動消費者的編碼。

要解決這個問題,就必須引入一個服務注冊發現機制,服務生產者將自己的信息注冊到服務注冊中心,服務消費者再從注冊中心進行拉取。這樣,即使生產者的信息發生了變化,消費者也無需改動配置。

圖片描述

在微服務架構中,服務發現組件是一個非常重要的組件,目前常用的組件有以下幾種:

  • ZooKeeper;
  • EureKa;
  • Consule;
  • Nacos。

1.2 配置中心

配置中心,顧名思義,就是用統一管理項目中所有的配置系統。

在項目中,我們可以簡單理解程序 = 代碼 + 配置。我們在程序中需要對一些參數進行自定義的配置,但我們并不想把這些配置直接寫在代碼中,為了方便修改,并讓系統有更好的擴展性,我們會將這些配置寫在工程的配置文件中。

在單體應用中,我們可以把所有的配置項集中在某個問題或某幾個文件中,但是在微服務體系中,由于微服務眾多,服務之間又是相互調用相互依賴,為每個服務進行配置文件就顯得非常的難以管理。

如果沒有配置中心,我們強行將配合文件寫在各個工程中會有以下幾個的問題:

  1. 配置文件過于分散,難以管理;
  2. 配置文件無法區分環境,可能我們的代碼工程會運行在幾套環境中,可能每個環境的參數各不相同,就得靠手動進行維護;
  3. 靜態化配置,每次修改都必須通過修改文件并且重啟工程來進行生效;
  4. 配置文件無法追溯,除了用代碼本身的版本管理,否則無法進行追溯。

配置中心的思路就是把項目中各種配置,各種的參數都集中到一個地方進行統一的管理,并提供標準的接口。當服務需要獲取配置,就通過接口進行拉取,當配置中心的配置和參數有了變化,也能實時同步到各個服務。

也就是說,配置中心需要解決和滿足一下幾個問題:

  1. 配置集中管理;
  2. 在系統運行期間可以動態配置,并實時刷新到服務;
  3. 高可用。

我們常用的配置中心的組件有:Apollo,Nacos,Disconf,SpringCloud Config 等等。

1.3 負載均衡

在微服務架構中,負載均衡是必須使用的技術,通過它來實現系統的高可用、集群擴容等功能。

一般來說,在微服務中有 2 種模式的負載均衡,一種是中間件負載均衡,一種是客戶端負載均衡,這兩種都微服務開發都有充分的使用。

先說中間件負載均衡器:客戶先請求到負載均衡器,然后負載均衡器根據負載均衡算法將請求轉發到微服務,在接入層的 LB 就是一個典型的負載均衡器。

圖片描述

還有一種就是客戶端的負載均衡,客戶端本身維護服務提供者的列表,和自身進行負載均衡的算法對服務提供者進行調用。

SpringCloud Ribbon 就是基于客服端的負載均衡工具,它可以將面向服務的 REST 模板請求自動轉換成客戶端負載均衡的服務調用:

圖片描述

負載均衡算法有:輪訓、隨機、加權輪訓、加權隨機、地址哈希等等,這些將在后面章節詳細說到。

1.4 網絡通訊

在微服務中,使用什么協議來構建服務體系?一般由兩種選擇:RPC 和 REST API:

  • RPC:Remote Produce Call 遠程過程調用,基于原生的 TCP 通訊,速度快,效率高。
  • REST:是 Http 協議通訊,底層也是基于 TCP,規定了數據傳輸的格式,目前在 web 瀏覽器和服務器通訊大量使用,也可以用來進行遠程服務調用。

優劣對比:

  1. 從使用的方面來看,REST 接口只需要關注提供方,客戶端只要也用 Http 方式進行調用即可,可能不要考慮雙方使用的語言,客戶端只要通過接口發起調用即可,業務開發人員只需要關注業務方法,不需要關注網絡傳輸細節。
  2. 從性能角度來看,REST 接口使用 Http 協議進行傳輸,導致在網絡傳輸過程中,攜帶信息過多。而 RPC 服務一般只需要關注傳輸相關業務即可,傳輸數據更小,性能更高。

1.5 序列化

序列化是用來通信,服務端把數據序列化,發送到客戶端,客戶端把接受到的數據反序列化得到對應的數據,然后再講數據序列化后發送到服務端,服務端再反序列化得到相應的數據。說白了,數據需要經過序列化后變成二進制流才能在服務端和客戶端中傳輸。

常用的有下面幾種序列化:

  • Hessian2 序列化 : hessian 是一種跨語言的高效二進制序列化方式,它是 Dubbo RPC 協議默認的序列化方式;
  • Dubbo 序列化 : 并不成熟,Dubbo 序列化其實不是 Dubbo RPC 默認的序列化;
  • Java 序列化 :JDK 自帶的 Java 序列化實現,效果并不理想。

1.6 安全認證

有些服務并不希望所有的人都能去調用到,涉及到一些敏感信息,比例跟錢相關的信息,那么我們需要安全和訪問的控制策略,來限制對這些服務的訪問。

我們這里說的安全訪問指的是服務間的調用,而不是外部用戶的調用,外部用戶可以走 API 網關。

1.7 斷路限流

斷路,限流,降級,超時,隔離是一整套容錯的組合拳。

在介紹斷路之前,我們先了解微服務的雪崩效應。在微服務體系中由多個服務進行組成,服務之間的數據交互通過遠程調用完成,這樣帶來一個問題,假設服務 A 調用服務 B 和服務 C,服務 B 又調用了服務 D 和服務 E,服務 C 又調用服務 F,這樣就出現所謂的扇出,如果扇出的鏈路上某個服務調用出現不可用或者調用相應時間過長,那么服務 A 的調用資源會占用越來越多,因為服務 A 是入口資源,進而引起系統崩潰,這個就是所謂的雪崩效應。

圖片描述

當服務 E 出現問題,會導致服務 B 也出現問題,服務 B 出現問題會導致服務 A 出現問題,而的入口服務 A 的崩潰,就是整個系統的崩潰。

從可用性和可靠性觸發,為了防止系統的整體崩潰,必須采用對應該的技術手段,采用的手段都是從系統可用性,可靠性角度出發,盡量防止系統整體緩慢甚至癱瘓。

  • 服務熔斷:是對雪崩效應的一種微服務鏈路保護機制;
  • 服務降級:整體資源不夠用,主動關閉部分服務,或在出現熔斷情況下出現的兜底方案;
  • 服務限流:當出現流量超越了整體系統可以承接的流量,系統主動做出管控,只允許部分流量進入,拒絕或延后其他流量;

斷路降級限流,在微服務體系中是一個很大的保證性組件,在后續章節會作為一個大課題進行講解。

1.8 鏈路跟蹤

微服務將一個龐大的系統切分成各個小的服務,各個服務之間相互依賴,共同協同調用構建成整個系統。這個就是造成我們整個系統有復雜的調用鏈路,如果一個調用鏈路錯誤,如何快速定位錯誤資源,一個調用鏈路影響緩慢,如何快速定位其中延遲高的服務。
圖片描述

調用鏈漫長并且復雜,要了解每一個環節,我們需要全鏈路跟蹤,應用的原理也很簡單,就是在請求的開端,生成一個唯一的 ID,并將其傳遞到整個調用鏈,這樣就可以根據整個 ID 來跟蹤整個請求并獲取各個調用環節的性能指標。

1.9 監控報警

監控是微服務治理的一個重要環節,監控系統的完善程度直接影響到我們微服務質量的好壞,我們的微服務在線上運行的時候有沒有一套完善的監控體系能去了解到它的健康情況,對整個系統的可靠性和穩定性是非常重要。

微服務監控是一整套系統性的監控,一個比較完善得微服務監控體系需要涉及到哪些層次,以下劃分為 5 個層次的監控

  • 最底層基礎設施監控;
  • 系統層監控;
  • 應用層監控;
  • 業務監控;
  • 端用戶體驗監控。

這個后續章節我們會對各個監控層面進行詳細講解。

1.10 統一日志

微服務將原來的單體應用拆分成 N 個服務分布在不同的機器,原來的單個日志也被分布在 N 臺機器,日志對我們后期排查問題,定位問題非常關鍵,而分散的日志對監控和查看勢必造成巨大的困擾。

解決這個問題,其實比較簡單,只要解決 日志采集,日志存儲,日志分析可視化日志數據,市面上 ELK 是一套比較成熟方案。

1.11 API 文檔

在單體傳統的 API 文檔輸出,是由一個組或一個團隊統一的輸出,這個時候比較容易進行規范。但在微服務中,每個文檔都是由各個團隊進行輸出,這個時候容易出現:

  1. API 接口規則返回信息不明確;
  2. API 接口更新還關系到通知調用者,導致文檔更新交流不斷;
  3. 缺少在線接口測試,通常需要額外的 API 測試工具,例如 postman;
  4. 接口文檔太多,不便于管理。

解決以上問題,可以引入比較成熟的統一生成 API 文檔工具。例如 Swagger , 可以在較多層面解決上述問題,也便于統一管理。

1.12 統一異常

我們希望服務治理的環節能集成統一的服務異常處理的能力,這樣的化異常能夠達到更加標準化,出現問題能更好定位好屬于什么類型的問題。如果說沒有這樣的一個環節,大家各自的玩法不一樣,拋的異常各異,出現問題難以定位和無法標準化友好輸出。

1.13 代碼規范

現在在大規模開發的情況下,比較推從一個契約驅動開發的方法,開發人員先定立契約,代碼自動生成的方式生成對應的代碼腳手架,這個在大規模開發的時候更能確保代碼的一致和規整。

1.14 集成 DB MQ Cache

微服務治理的核心思路就是把上面講到的各個環節沉淀下來,變成平臺和框架的一部分,開發人員可以更加專注業務邏輯的實現,在實現業務邏輯的時候不需要去關注外部環節的,從而提升開發的效率,治理環節沉淀在框架之中有專門的平臺架構團隊去進行管控。

2. 小結

在這一節,我們初步了解了能讓我們業務代碼 “安居樂業” 配套的各個部門,從一個大概知道每個部門存在的意義是什么,在下面的章節中,我們會逐個敲開這些部門的大門,進入一探究竟。

}
立即訂閱 ¥ 78.00

你正在閱讀課程試讀內容,訂閱后解鎖課程全部內容

千學不如一看,千看不如一練

手機
閱讀

掃一掃 手機閱讀

32 堂微服務架構設計與落地精講課
立即訂閱 ¥ 78.00

舉報

0/150
提交
取消