Spring Cloud Gateway路由增量添加失败,寻求解决方案
问题解决:Spring Cloud Gateway 动态添加路由不生效
你的代码核心问题是每次循环都创建了新的路由构建器实例,导致之前添加的路由全部丢失,最终返回的是空路由集合。
错误原因
每次调用builder.routes()都会生成一个全新的RouteLocatorBuilder.Builder对象,循环里的路由添加操作都是在临时实例上进行的,没有被持久化。最后返回的builder.routes().build()又是一个全新的空构建器,自然不会有任何路由生效。
修正后的代码
public class Route { String ip; String port; String uri; // constructor // getters and setters }
@Bean public RouteLocator myRoutes(RouteLocatorBuilder builder) { // 只初始化一次路由构建器并保存引用 RouteLocatorBuilder.Builder routeBuilder = builder.routes(); for (Route route : routes) { log.info("route is: " + route.toString()); // 拼接正确的目标URI,必须包含协议前缀(http/https) String targetUri = String.format("http://%s:%s", route.getIp(), route.getPort()); // 向同一个构建器实例添加路由 routeBuilder.route(r -> r.path(route.getUri()) .uri(targetUri)); } // 基于已添加路由的构建器生成最终RouteLocator return routeBuilder.build(); }
关键注意点
- 复用同一个
RouteLocatorBuilder.Builder实例,所有路由都添加到这个实例上 - 目标URI必须包含协议(如
http://),否则Spring Cloud Gateway无法识别目标服务地址 - IP和端口之间要加冒号,保证地址格式合法(例如
http://192.168.1.1:8080)
内容的提问来源于stack exchange,提问作者Karim Halayqa
相关产品推荐
相关产品推荐

