Nacos集成spring cloud gateway

今天使用Nacos集成spring cloud gateway,记录一下
最开始我创建了一个module :cloud-gateway,并且在pom文件里配置这样(部分代码截取):

 <parent>
        <groupId>com.example</groupId>
        <artifactId>demo</artifactId>
        <version>1.0.0</version>
    </parent>

然后启动的时候,就说已经使用了gateway,让去掉spring-boot-starter-web的依赖,因为我的父级pom里引入了spring-boot-starter-web。

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

然后我就把 改了,

<?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 https://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.3.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>cloud-gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloud-gateway</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring.cloud-version>Hoxton.SR9</spring.cloud-version>
        <spring.boot-version>2.3.5.RELEASE</spring.boot-version>
        <spring.cloud.alibaba-version>2.2.3.RELEASE</spring.cloud.alibaba-version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud-version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring.cloud.alibaba-version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.2.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

然后再启动,又说没有什么config,或者启动了之后请求也会报错:
在这里插入图片描述

后来引入了spring-cloud-starter-alibaba-nacos-discovery才可以

  <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>

有的文档说要把gateway注册到nacos注册中心,也就是加下边的配置

cloud:
  nacos:
    discovery:
      server-addr: localhost:8848

并且要在启动类中加注释

@EnableDiscoveryClient

但是我都没有做,启动后请求也能成功,这里我还不知道什么原理。

断言那里好多配置项,我只是试了几个,比如

 cloud:
    gateway:
      discovery:
        locator:
          enabled: true # 让gateway可以发现nacos中的微服务
      routes:
        - predicates:
            - Path=/gateway/**
            - Method=GET #通过请求方式匹配  POST、GET、PUT、DELETE 等不同的请求方式来进行路由
            - Query=wocao #通过请求参数匹配 {一个属性名 一个属性值} 属性值可以为正则表达式,如下面这个,只要请求汇总带有 wocao 参数即会匹配路由,不带 wocao 参数则不会匹配。
          filters:
            - StripPrefix=1
          uri: lb://cloud-product

我的请求地址是
http://localhost:8089/gateway/product/getProductById/4?wocao=1
在这里插入图片描述
断言主要参考这位大神的文章:
Nacos集成Spring Cloud Gateway使用第一章:理解解释

补充一下:
前边说不加@EnableDiscoveryClient也能正常访问,但是后来整合了feign了之后,不加不行,说找不到要访问的路径,报404,加上又重新编译才可以的。

再补充,gateway启动成,也能访问指定的路径,但是post请求会报错。

在这里插入图片描述

开始以为是请求类型的问题,查网上有好多说post请求要特殊处理。但是后来发现是pom文件的问题。
因为我的项目根pom引入了web,但是gateway与web冲突,所以我单独写了gateway的pom,没有继承父类,然后呢,我的gateway的pom里有这两个依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>

去掉这两个依赖就没问题了,大神说这里边可能有冲突。
然后如果去掉undertow,启动的时候就使用默认的Netty了

在这里插入图片描述
在这里插入图片描述
2021-2-7补充:
我发现我用postman测试的时候总会报503,然后刷几次又可以正常访问了。后来发现是gateway中配置的服务的id与nacos上展示的不一致。
在这里插入图片描述
在这里插入图片描述


版权声明:本文为wuniangzhanyan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。