整個項目採用前後端分離開發,外網部署前臺項目、內網部署後臺項目。本文以客戶使用客戶端訪問網站,向後臺發送請求這一條線索對上圖進行分析。
文章目錄
一、Nginx集羣→API網關
請求首先到達Nginx集羣
,並由Nginx將請求轉交給API網關
。
項目中使用SpringCloud Gateway技術作爲API網關。
二、API網關→服務模塊
第二步,API網關
拿到請求後進行認證授權,如果認證合法,就由API網關將請求動態路由到指定的業務模塊
。
動態路由
:因爲這條請求可能是調用商品服務、購物車服務、搜索服務、等衆多服務中的一種,所以需要動態路由。
認證授權
:由網關進行。
1.Ribbon實現負載均衡
由API網關
將請求動態路由到指定的業務模塊
時,如果該業務模塊存在多個,就需要在業務集羣中使用負載均衡技術進行統籌管理。
業務集羣中使用
Ribbon組件
實現負載均衡。
2.Sentinel進行熔斷降級
由API網關
將請求動態路由到指定的業務模塊
時,如果某些服務出現問題,就需要在API網關中使用熔斷降級進行管理。
API網關中使用
Sentinel組件
進行熔斷降級。(該技術由 Spring Cloud Alibaba提供)
- 注:Sentinel組件在本項目中還實現了令牌限流的功能。
三、服務模塊對請求進行處理
請求路由到服務模塊後,服務模塊對請求進行處理。
SpringBoot
:每個微服務模塊都是使用SpringBoot技術進行編寫。
遠程調用
:使用SpringCloud 的Feign組件
進行遠程調用。(服務之間可能會有互相調用,如訂單服務調用商品服務查詢商品信息。)
OAuth2.0認證中心
:除了一般的登錄,還使用OAuth2.0整合了社交登錄。(額外判斷了某些請求是否需要登陸後才能進行處理)
SpringSecurity
:使用SpringSecurity進行安全與權限控制。
四、數據存儲解決方案
1.存儲數據
服務處理請求時,免不了要使用數據庫與緩存進行數據的存儲
。
Redis集羣
:使用Sentinel分片集羣+Shard哨兵集羣
進行緩存處理。
MySQL集羣
:持久化數據使用MySQL集羣,可以使用 讀寫分離 也可以使用 分庫分表。
2.消息隊列
模塊集羣中,服務模塊與服務模塊之間的通信,需要使用消息隊列進行異步解耦,和分佈式事務的最終一致性。
RabbitMQ集羣
:使用RabbitMQ集羣做消息對立,完成服務與服務之間的 異步解耦 、分佈式事務的最終一致性。
3.全文檢索
有些服務模塊需要進行檢索,如對商品信息進行檢索。
ElasticSearch
:使用ElasticSearch進行檢索。
4.OSS雲存儲
有些服務需要存儲圖片,視頻等大文件,可以使用阿里雲的對象存儲服務OSS。
OSS:使用阿里雲的對象存儲服務OSS進行圖片、視頻的雲存儲。
五、日誌管理
項目上線以後,爲了快速定位項目中可能出現的問題,需要進行日誌管理。
ELK
:使用ELK對日誌進行處理。
LogStash
:使用LogStash蒐集業務中的各種日誌,將他們放入ES中。再使用Kibana可視化界面,從ES中檢索出相關的日誌信息。快速定位項目中的問題。
六、註冊中心&配置中心
分佈式系統中,由於每一個服務都可能部署在很多臺機器,服務與服務之間要互相調用,這就需要指導彼此都在哪裏。推薦將所有服務註冊到註冊中心,這樣服務之間就可以從註冊中心發現彼此。
每一個服務的配置衆多,爲了集中管理這些配置,也需要使用Nacos作爲配置中心,這樣,所有的服務都可以從配置中心中動態的獲取其配置。
Nacos註冊中心
:使用Nacos作爲服務的註冊中心。(該技術由 Spring Cloud Alibaba提供)
Nacos配置中心
:同樣使用Nacos作爲服務的配置中心。(該技術由 Spring Cloud Alibaba提供)
七、服務追蹤
服務在調用期間,可能會出現問題。比如:...→訂單服務→商品服務→庫存服務→...
,可能某一個鏈路出現了問題,就需要對整個服務調用鏈進行追蹤,查看哪裏出現了問題,這就需要使用服務追蹤。
使用
Sleuth+Zipkin+Metrics
進行服務追蹤,將每一個服務的信息交給開源的Prometheus
進行聚合分析後,由Grafana
進行可視化展示。再通過Prometheus提供的Altermanager
實時得到服務的告警信息,以郵件或者短信的方式通知開發或運維人員。
八、持續集成&持續部署
項目發佈時,由於微服務衆多,每一個都打包部署到服務器上過於麻煩,使用持續集成與持續部署可以簡化這些流程。
持續集成CI/持續部署CD
:開發人員可以將修改後的代碼提交給Github,運維人員通過自動化工具Jenkins從Github中獲取代碼,將其打包成Docker鏡像。最終使用k8s集成整個Docker服務。以服務Docker容器的方式來運行。