一般來說,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
而將后面的作為請求資源轉發過去。
個人認為第二種比較合適一些。