文章目錄
- 一,網絡
- 二,網關
- 1,網關選型
- 2,認證鑒權
- 3,動態路由
- 4,限流
- 5,負載均衡
- 6,熔斷降級
- 三,微服務
- 四,存儲層
- 五,服務治理
- 六,日志系統
- 七,自動化部署
這一節的內容是介紹項目的架構圖,這是從上帝視角看整個項目,非常重要、非常關鍵。
這一節應該不止看一遍,在學習的過程中經常回過頭來溫習一遍,看看自己當前學習的是架構圖中的哪部分,做到胸中有數。
這是一個結構非常完整的微服務架構圖,基本上所有的微服務都類似,掌握其中精髓,萬變不離其宗,無論是以后架構新的項目還是重構舊的項目,都可以參考這個架構。
谷粒商城-微服務架構圖原圖如下。
根據各部分作用的不同,我將這個架構圖分為7個部分,接下來逐一介紹。
一,網絡
雖然網絡主要是運維同事負責,作為開發人員也應該了解項目的網絡部署,在排查線上問題時,可能會起到關鍵作用。
從圖中可以看出,整個項目的網絡部署有內外網之分,絕大部分都部署在內網,極少數部署在外網。
內網無法通過公網直接訪問,這是出于安全考慮,包括網絡安全、數據安全等等。
前端項目一般部署在外網,因為前端是整個系統的入口,是開放給公網用戶訪問的。
后端服務包括所有的商城服務、數據存儲、日志、數據治理服務、K8S等等,全部都部署在內網,與外網隔離,拒絕外網直接訪問。
二,網關
網關相當于商城系統的后臺門戶,是極其重要的一部分。
商城頁面上所有的后臺請求都要經過網關,網關擔負的主要職責如下:
- 認證鑒權
- 動態路由
- 限流
- 負載均衡
- 熔斷降級
1,網關選型
這個項目選用SpringCloud Gateway作為網關。
2,認證鑒權
商城的有些操作是需要客戶登錄后操作的,比方說加購物車、下單、付款,這些操作都需要鑒權,判斷用戶是否登錄。
再比如后臺管理系統,涉及到庫存、商品的管理,所有的操作都有對應的權限,庫存管理員只能管理庫存,商品管理員只能管理商品。類似這種權限控制都在網關進行。
3,動態路由
大多數服務都是集群部署,分布在多臺機器上。
比如商品服務,可能部署在10臺服務器上,當前端發出一個商品服務請求時,只需要一臺服務器接收請求,從多臺服務器中選取一臺服務器接收響應,稱之為路由
。
網關具備路由的能力,可以配置多種路由策略,比如隨機路由、輪詢、最小連接數、Hash等等。
4,限流
限流是指在高峰期或者發現黑客攻擊,就要對請求進行流量控制,或者讓請求排隊等候處理,或者直接拒絕請求,避免整個系統癱瘓失去響應。
限流有很多種方式,常見的有令牌限流、漏桶限流。
- 令牌限流。系統生成固定數量的令牌,給每個請求發放令牌,只有得到令牌的請求才能進入系統,沒有令牌的請求將被拒絕。
- 漏桶限流。漏桶相當于一個緩存,請求先進入漏桶等待,后端服務以恒定速率從漏桶中取出、處理請求,超出桶容量的請求會被丟棄。
5,負載均衡
因為網關是后臺服務的門戶,有動態路由的能力,所以也可以實現負載均衡,將請求均勻的分發到后臺服務器上。
6,熔斷降級
網關可以收集后臺服務的響應情況,在滿足某種規則的情況下,攔截熔斷請求,避免后臺服務資源耗盡。
三,微服務
這是業務核心,包括商品服務、訂單服務、庫存服務、描述服務、搜索服務等等,這些服務在啟動后,會將自身信息包括服務名稱和IP注冊到注冊中心。
這些服務之間也需要相互調用,這個項目使用feign完成內部服務間的相互調用。
四,存儲層
這個項目中,存儲層選用多個中間件。
- 持久化存儲選用了MySQL,搭建了MySQL集群,采用讀寫分離的策略。
- 緩存選用了Redis,搭建了Redis集群。
- 消息中間件選用了RabbitMQ。
- 日志存儲選用了Elasticsearch。
- 商品搜索存儲選用了Elasticsearch。
- 圖片存儲使用阿里云的OSS。
五,服務治理
- 注冊中心Nacos
- 配置中心Nacos
- 鏈路追蹤Sleuth、Zipkin
- 降級熔斷限流Sentinal
六,日志系統
日志記錄了系統運行過程中的各種信息,是排查線上問題的必備資料。
這個項目使用ELK作為日志采集、管理、查詢系統。
- Logstash收集日志
- 存儲到Elasticsearch中
- 用可視化工具Kibana作為前端工具搜索、展示日志
七,自動化部署
- K8S提供容器管理功能
- Jenkins實現從Git代碼倉庫拉取代碼,自動打包,生成Docker容器
- KubeSphere提供簡單易用的容器編排功能
流水線作業的原理和流程示例:
-
① 源代碼變更:
- 開發者提交代碼到版本控制系統,觸發 Jenkins pipeline。
-
② 構建和測試:
- Jenkins 根據 pipeline 規則拉取最新代碼,構建 Docker 鏡像,并運行測試。
- 如果測試通過,Jenkins 將構建的鏡像推送到私有或公共的 Docker Registry,如 Harbor 或 Docker Hub。
-
③ 部署到 Kubernetes:
- Jenkins 使用 Kubernetes 的 API 或 CLI (kubectl) 將更新后的鏡像部署到目標環境(如開發、測試或生產環境)。
- 這一步可能涉及更新 Kubernetes 的 Deployment、StatefulSet 或其他資源。
-
④ 監控和反饋:
- 部署完成后,Jenkins 可以通知相關人員,同時 KubeSphere 提供監控和日志功能,便于跟蹤應用狀態和問題排查。
通過這種方式,Jenkins、Kubernetes 和 KubeSphere 形成一個緊密合作的體系,實現了從代碼變更到應用部署的自動化流程,大大提高了開發效率和運維的靈活性。