1.背景
我们的应用场景是,网关的路由断言配置都是由客户自己定义,由于前期配置规则约束较少。这样就会由于某个用户配置的错误路由,影响到全局的配置,导致整个网关启动错误。
Gateway版本:2.2.0.BUILD-SNAPSHOT
2.分析
通过查看源码,发现网关加载路由配置信息代码如下:
在类org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator中,加载路由方法:
某个路由信息转换加载:
发现,单个路由信息加载无任何处理异常,如果出现异常将直接影响到全局加载。
3.思考及解决方案
其实这种设计并不一定有问题,只是不适合于我们的应用场景。那么,最暴力的解决办法,修改源码,在convertToRoute方法内进行异常处理,不进行抛出。当然,这样做的副作用会有好多,关于版本升级,后续的维护性等等都是问题。(一般不建议直接修改源码来解决问题)
那么我们再想其他办法。我们在配置加载前,把类进行重写。我们可以通过springAOP,将getRoutes()方法重写,在convertToRoute出现异常时,不抛出。