管理Spring Cloud Gateway中的多条路由



我知道Spring Cloud Gateway有多种配置路由的方法:

  • 使用基于java的DSL(eg: using RouteLocatorBuilder)和/或
  • 基于属性的配置。

Spring Cloud Gateway官方文档使用属性来管理路由。

我的问题是:

  • 在一个文件中为2-3个微服务配置路由很简单,但是拥有如此多微服务的企业应用程序如何有效地管理路由呢?

  • 建议如何配置路由?

  • 如果使用Java DSL,使用具有相同返回类型的多个Beans是一个好做法吗?比如:

@Bean
RouteLocator bookRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("book_route", r -> r.method(HttpMethod.GET)
.and().path("/api/book/**")
.uri("lb://book-service"))
.build();
}
@Bean
RouteLocator chapterRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("chapter_route", r -> r.method(HttpMethod.GET)
.and().path("/api/chapter/**")
.uri("lb://chapter-service"))
.build();
}

这是一个不错的老帖子,但这是我最近遇到的一些事情,想分享一个解决方案。

暴露多个bean将不起作用——这两个RouteLocator实例将相互碰撞导致错误,或者你可以允许spring覆盖另一个bean——无论哪种方式,它都不会为你工作。

相反,暴露一个路由器,它引用了其他类,这些类暴露了创建你的路由的函数。下面是Kotlin

中的一个示例Routes.kt

@Configuration
class Routes(
private val purchaseRoute: PurchaseRoute
) {
@Bean
fun router(routeLocatorBuilder: RouteLocatorBuilder): RouteLocator {
return routeLocatorBuilder.routes()
.route("purchase", purchaseRoute.route())
.build()
}
}

路由器。Kt接口所有子路由将实现

interface Router {
fun route(): Function<PredicateSpec, Buildable<Route>>
}

PurchaseRoute.kt

@Configuration
class PurchaseRoute() : Router {
override fun route(): Function<PredicateSpec, Buildable<Route>> =
Function {
it.path("/api/purchase/**")
it.filters {
stripPrefix(1)
dedupeResponseHeader("Access-Control-Allow-Origin", "RETAIN_FIRST")
}
it.uri(routeConfigProperties.uri)
}
}

然后创建任意多的路由类。拆分为多个文件极大地清理了我维护的网关服务。