文章

踩坑记录 | Spring Cloud Gateway 网关依赖问题

今天在项目中尝试引入 Spring Cloud Gateway 网关时,遇到了一个奇怪的问题——按照官方文档插入了 demo 代码后,出现了多处报错,特别是 Cannot resolve symbol 'RouteLocator',让我一度感到困惑。

问题描述:

我在项目中按照 Spring Cloud Gateway 官方文档的示例,尝试插入一些基本的网关代码。代码如下:

package com.nx.nxapigateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;

/**
 * nxapi gateway application
 *
 * @author nx-xn2002
 */
@SpringBootApplication
public class NxapiGatewayApplication {

	public static void main(String[] args) {
		SpringApplication.run(NxapiGatewayApplication.class, args);
	}
	@Bean
	public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
		return builder.routes()
				.route("path_route", r -> r.path("/get")
						.uri("http://httpbin.org"))
				.route("host_route", r -> r.host("*.myhost.org")
						.uri("http://httpbin.org"))
				.build();
	}
}

但是 IDEA 到处爆红:

报错信息中提到 Cannot resolve symbol 'RouteLocator',这让我怀疑是不是依赖没有正确引入,或者版本不兼容。

问题分析:

经过一番排查,我发现问题出在引入的依赖上。

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-gateway-mvc</artifactId>
</dependency>

根据官方文档,应该引入 spring-cloud-starter-gateway 这个依赖,而 IDEA 中自动引入的是 spring-cloud-starter-gateway-mvc,这显然是导致报错的原因。

在官方文档中也明确提到:

要运行您自己的网关,请使用 spring-cloud-starter-gateway 依赖项。

https://springframework.org.cn/projects/spring-cloud-gateway/

spring-cloud-starter-gateway-mvc 是一个为集成 Spring MVC 特别设计的模块,缺少一些基础的网关功能,比如 RouteLocator,因此会导致此类问题。

解决方案:

我按照官方建议,更改了项目的依赖文件,删除了 spring-cloud-starter-gateway-mvc,并引入了正确的 spring-cloud-starter-gateway 依赖,具体修改如下:

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

修改后,重新启动项目,网关成功启动,报错问题也解决了

总结:

这个问题让我意识到,在使用框架时,特别是涉及到微服务架构的第三方组件时,依赖的选择十分关键。虽然 spring-cloud-starter-gateway-mvc 也包含了网关相关功能,但它不适用于此处独立网关场景,反而可能导致功能缺失。引入正确的依赖 spring-cloud-starter-gateway 后,问题迎刃而解

反思:

在进行项目依赖更新或引入新依赖时,一定要注意:

  • 查阅官方文档:有些库在不同的版本或不同的功能场景下,依赖会发生变化

  • 依赖版本和功能:一些小版本的更新可能会将某些功能分离成独立的依赖,需要留意是否有需要额外引入的模块

  • 错误信息的提示:面对报错时,要善于从错误信息中提取关键信息,快速定位问题的根本原因

以上是我今天遇到的 Spring Cloud Gateway 依赖问题,希望对大家有所帮助

License:  CC BY 4.0