springcloud gateway無法路由問題的解決

前言

昨天小夥伴問我springcloud gateway 無法路由轉發的問題,現在記錄一下

現在企業微服務架構基本上都是用springcloud體系瞭,在國內基本上新項目都用springcloud alibaba,而且基本上都是所有服務聚合在一個父項目中。

springcloud gateway可以實現路由負載均衡等等功能,但是應用過程中,會有一些坑。

描述問題

配置的沒問題如下:

server:
  port: 9999
spring:
  application:
    name: gateway-server
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.229.7:8848
    gateway:
      discovery:
        locator:
          enabled: true ##開啟瞭會自動匹配路由規則
      routes: ##配置瞭手動路由規則,上面的自動開啟失效
        - id: nacos-provider
          uri: lb://nacos-provider
          predicates:
            - Path=/mmm/**

provider代碼:

@RestController
@RequestMapping("/mmm")
public class MMMController {
    @Value("${server.port}")
    private String port;
    @GetMapping("/get")
    public String get(){
        return port;
    }
}

但是測試始終無效:

分析原因

springcloud項目基本上都聚合到一個父項目中,裡面各種子模塊如provider、consumer、sentinel、gateway…,其他模塊都沒問題,但是springcloud gateway有點特殊,因為它依賴瞭web webflux ,就會有沖突,所以基本上在pom中就要排除web,這樣就不會應該父項目依賴瞭web導致沖突瞭

springcloud gateway 的pom排除web

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
    <exclusions>
        <exclusion>
			<groupId>org.springframework.boot</groupId>
        	<artifactId>spring-boot-starter-web</artifactId>
        </exclusion>
    </exclusions>
</dependency>

啟動會成功,但是項目會有報錯提示:

**********************************************************

Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway at this time. Please remove spring-boot-starter-web dependency.

**********************************************************

最後路由不到指定url。

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Mar 17 16:34:53 CST 2023
There was an unexpected error (type=Not Found, status=404).
No message available

解決思路

如何解決呢?我的意見是把springcloud gateway項目獨立出來,不要聚合到父項目中,這樣就不會有web以來沖突瞭

獨立的springcloud gateway

pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.13.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.mmm.springcloud.study</groupId>
    <artifactId>spring-cloud-gateway-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <version>2.2.3.RELEASE</version>
        </dependency>
    </dependencies>
</project>

因為沒有聚合到父項目中,所以不需要額外提出web,啟動後直接訪問,成功!

總結

到此這篇關於springcloud gateway無法路由問題解決的文章就介紹到這瞭,更多相關springcloud gateway無法路由內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: