今天使用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上展示的不一致。
