SpringCloudAlibaba 主要功能 與 實現組件
(1)SpringCloudAlibaba 主要功能 與 實現組件
【功能與實現組件:】
服務限流降級:
基本說明:
默認支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降級功能的接入,
可以在運行時通過控制檯實時修改限流降級規則,還支持查看限流降級 Metrics 監控。
實現組件:
Sentinel: 把流量作爲切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
服務註冊與發現:
基本說明:
適配 Spring Cloud 服務註冊與發現標準,默認集成了 Ribbon 的支持。
實現組件:
Nacos: 一個更易於構建雲原生應用的動態服務發現和服務管理平臺。
分佈式配置管理:
基本說明:
支持分佈式系統中的外部化配置,配置更改時自動刷新。
實現組件:
Nacos: 一個更易於構建雲原生應用的配置管理平臺。
消息驅動能力:
基本說明:
基於 Spring Cloud Stream 爲微服務應用構建消息驅動能力。
實現組件:
RocketMQ: 一款開源的分佈式消息系統,基於高可用分佈式集羣技術,提供低延時的、高可靠的消息發佈與訂閱服務。
分佈式事務:
基本說明:
使用 @GlobalTransactional 註解, 高效並且對業務零侵入地解決分佈式事務問題。
實現組件:
Seata: 阿里巴巴開源產品,一個易於使用的高性能微服務分佈式事務解決方案。
阿里雲對象存儲:
基本說明:
阿里雲提供的海量、安全、低成本、高可靠的雲存儲服務。支持在任何應用、任何時間、任何地點存儲和訪問任意類型的數據。
實現組件:
Alibaba Cloud OSS: 阿里雲對象存儲服務(Object Storage Service,簡稱 OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲存儲服務。您可以在任何應用、任何時間、任何地點存儲和訪問任意類型的數據。
分佈式任務調度:
基本說明:
提供秒級、精準、高可靠、高可用的定時(基於 Cron 表達式)任務調度服務。同時提供分佈式的任務執行模型,如網格任務。網格任務支持海量子任務均勻分配到所有 Worker(schedulerx-client)上執行。
實現組件:
Alibaba Cloud SchedulerX: 阿里中間件團隊開發的一款分佈式任務調度產品,提供秒級、精準、高可靠、高可用的定時(基於 Cron 表達式)任務調度服務。
阿里雲短信服務:
基本說明:
覆蓋全球的短信服務,友好、高效、智能的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。
實現組件:
Alibaba Cloud SMS: 覆蓋全球的短信服務,友好、高效、智能的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。
(2)開發中常使用的技術搭配
【開發中使用的技術:】
在平時開發中使用的技術搭配,我一般採用一下方案:
SpringCloud:
OpenFeign: 聲明式 HTTP 客戶端(即 遠程服務調用)。
Ribbon: 負載均衡(OpenFeign 中已集成,無需單獨引入)。
Gateway: API 網關。
Sleuth: 分佈式鏈路追蹤(即 請求調用鏈監控)。
SpringCloudAlibaba:
Nacos: 註冊中心 以及 配置中心(即 服務註冊、發現 以及 動態配置管理)。
Sentinel: 服務容錯(即限流、降級、熔斷)。
Seata: 解決分佈式事務。
注:
通過前面幾篇博客的學習,知道了 OpenFeign、Ribbon、Sleuth、Sentinel 相關操作。
OpenFeign、Ribbon 相關操作詳見:https://www.cnblogs.com/l-y-h/p/14238203.html
Sleuth 相關操作詳見:https://www.cnblogs.com/l-y-h/p/14447473.html#_label4
Sentinel 相關操作詳見:https://www.cnblogs.com/l-y-h/p/14364167.html#_label2
情景再現:
在阿里雲服務器上,想使用 docker-compose 一次性啓動三個 Nacos Server 以及 mysql,結果一直啓動失敗。
坑一:
nacos-mysql:8.0.16 無法啓動,更換成 nacos-mysql:5.7 之後正常啓動。
但若 nacos-mysql:8.0.16 是事先就啓動好的(即不跟隨 Nacos Server 啓動),那麼連接是正常的。
爲什麼會出現這種情況,沒有仔細研究,此處僅簡單記錄一下可能存在的問題。
坑二:
訪問 http://120.26.184.41:8850/nacos,可以成功登錄進去。
但點擊 “集羣管理” =》 “節點列表”,依次點擊 “節點元數據”,可以發現其 "state" 均爲 "CANDIDATE"。
即 集羣中三個節點 並未選舉成功,未成功選舉出 LEADER、FOLLOWER。
坑三:
集羣節點 "state" 均爲 "FOLLOWER",沒有 "LEADER"。選舉仍然失敗。
出現了 8848 端口,貌似其被選擇爲 LEADER。
坑四:
當前覺得你的配置沒有問題了,但是 選舉依然失敗,這邊建議你更換一下鏡像看看。
此處 nacos/nacos-server:1.4.1 選舉總是失敗,更換 nacos/nacos-server:1.3.0 之後沒問題了。
具體原因沒有深入研究,此處僅記錄一下可能存在的問題。
S1:
將 nacos-mysql:8.0.16 鏡像替換爲 nacos-mysql:5.7 後,重新啓動即可。
S2:填坑記錄二:
若在控制檯頁面中,看見節點 “state” 均爲 “CANDIDATE”。這是選舉出問題了,可以查看 nacos 日誌(naming-raft.log、nacos.log)。
【nacos.log 錯誤日誌爲:(如下兩句語句循環出現)】 java.lang.IllegalStateException: can not find peer: 172.22.0.3:8848 java.lang.IllegalStateException: can not find peer: 172.22.0.5:8848 【naming-raft.log 錯誤日誌爲:】 ERROR NACOS-RAFT vote failed: 500, url: http://120.26.184.41:8850/nacos/v1/ns/raft/vote ERROR NACOS-RAFT vote failed: 500, url: http://120.26.184.41:8851/nacos/v1/ns/raft/vote WARN [IS LEADER] no leader is available now! 【分析:】 通過 nacos.log 的 ip 地址,可以猜測當前 nacos 讀取到的是內網 IP。 而集羣列表中不存在這個 IP,所以無法連接到其餘 節點(無法通信),進而選舉失敗。 【解決:】 既然獲取不到 IP 地址,那就手動輸入 IP 地址。 在環境變量中,通過 NACOS_SERVER_IP 指定當前主機的 IP 即可。 比如: - NACOS_SERVER_IP=120.26.184.41
S3:填坑記錄三
通過上面截圖,可以看到三個節點狀態均從 "CANDIDATE" 變爲了 "FOLLOWER",爲什麼沒有選舉出 "LEADER"?
【查看 naming-raft.log 日誌如下:】 2021-03-25 17:45:09,770 INFO received approve from peer: {"ip":"120.26.184.41:8848","voteFor":"120.26.184.41:8848","term":9,"leaderDueMs":18440,"heartbeatDueMs":2000,"state":"FOLLOWER"} 2021-03-25 17:45:09,772 INFO received approve from peer: {"ip":"120.26.184.41:8848","voteFor":"120.26.184.41:8848","term":9,"leaderDueMs":18531,"heartbeatDueMs":5000,"state":"CANDIDATE"} 2021-03-25 17:45:09,788 INFO received approve from peer: {"ip":"120.26.184.41:8848","voteFor":"120.26.184.41:8848","term":9,"leaderDueMs":18671,"heartbeatDueMs":5000,"state":"FOLLOWER"} 2021-03-25 17:45:15,001 WARN [IS LEADER] no leader is available now! 2021-03-25 17:45:28,123 INFO vote 120.26.184.41:8848 as leader, term: 10 【分析:】 通過日誌可以看到貌似 120.26.184.41:8848 這個東西被選爲了 LEADER, 而實際上 我開放的是 8849、8850、8851 三個端口,但是這三個端口並沒有被訪問。 【解決:】 默認端口號爲 8848。既然獲取不到端口,那就手動設置端口。 在環境變量中,通過 NACOS_APPLICATION_PORT 指定當前主機需要訪問的端口即可。 修改 NACOS_APPLICATION_PORT 後,端口映射 ports 也需要修改。 比如: environment: - NACOS_APPLICATION_PORT=8851 ports: - 8851:8851
(4)連接 Nacos 集羣
在 Nacos Client 配置文件中,直接通過 server-addr 設置節點地址即可,多個節點之間可使用 逗號 隔開。
若使用 Nginx 做代理,則 server-addr 設置 Nginx 訪問地址即可。
Nginx 在 Nacos 真集羣版中使用(請繼續往下看)。
【比如:】 spring: cloud: nacos: discovery: server-addr: 120.26.184.41:8849,120.26.184.41:8850,120.26.184.41:8851 config: server-addr: 120.26.184.41:8849,120.26.184.41:8850,120.26.184.41:8851 【bootstrap.yml】 server: port: 7100 spring: application: name: nacos-client-config cloud: nacos: discovery: # 配置 nacos server 地址(作爲註冊中心) # server-addr: 120.26.184.41:8848 server-addr: 120.26.184.41:8849,120.26.184.41:8850,120.26.184.41:8851 config: # 配置 nacos server 地址(作爲配置中心) # server-addr: 120.26.184.41:8848 server-addr: 120.26.184.41:8849,120.26.184.41:8850,120.26.184.41:8851 # 設置配置文件前綴,默認爲 ${spring.application.name} prefix: ${spring.application.name} # 設置配置文件後綴名 file-extension: yml shared-configs[0]: data-id: test-0-dev.yml shared-configs[1]: data-id: test-1-dev.yml shared-configs[2]: data-id: test-2-dev.yml group: DEFAULT_GROUP refresh: true