SpringCloudAlibaba 主要組件與nacos 填坑記錄

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
複製代碼

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章