SpringCloud-Alibaba 最新的 依賴版本管理組合以及 整合gateway遇到的問題


一般來說,cloud 與 alibaba 擁有版本組合說明文檔wiki,不過這里可以做一個最新的組合的分享。

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2020.0.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.4.6</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

cloud: 2020.0.1
cloud alibaba: 2021.1
springboot: 2.4.6
spring-cloud-starter-openfeign: 3.0.3
spring-cloud-starter-loadbalancer: 3.0.3

再跟着官網整合 gateway的時候,啟動網關報錯。發現網關作為一個服務的入口對內進行訪問肯定也是需要服務發現,那么也是需要遠程調用服務的,於是就需要引入openfeign以及后面ribbon的替換 loadbalancer

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

都修改完畢之后,發現網關服務可以正常啟動了,但是這個時候發現一件事,gateway 配置Path屬性之后嘗試不符合回報404,但是符合會報錯503提示沒有找到該服務。

經過百度了解到:
gateway 網關在發送請求之后會將Path后面的包含絕對匹配內容如/nacos-service/xxx 中的nacos-service也拼過去就會形成匹配到了,但是沒有找到對應的服務接口導致gateway給予503沒有可用資源。

yml 完整配置如下:


spring:
  application:
    name: gateway-test
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
      routes:
        - id: feign-consumer
          uri: lb://feign-consumer
          predicates:
            - Path=/consumer/**
          filters:
            - StripPrefix=1

        - id: nacos-test
          uri: lb://nacos-test
          predicates:
            - Path=/nacos/**
          filters:
            - StripPrefix=1
server:
  port: 8888

id作為一個標識
uri是lb = loadbalancer的縮寫,請求會自動負載均衡,nacos-test就是注冊中心所在的服務注冊中心的服務名稱。

解決503匹配到對應的服務中心之后對應的RPC遠程請求的時候會把/consumer也給拼上去,導致資源找不到

解決辦法有兩個:
第一種:
是在網關以外的請求服務模塊yml中新增一個server.servlet.context-path="/consumer" 這樣在完整轉發的時候就可以以資源開頭作為統一的訪問。
第二種:
是在網關的yml 配置匹配約束Path的時候,對請求資源完成一個過濾,

          filters:
            - StripPrefix=1

屬性就可以解決,漢譯:剝奪前綴。1就會剝奪前面的/consumer 而將后面的作為請求資源轉發過去。

個人認為第二種比較合適一些。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM