Spring Cloud Gateway提供了添加、删除和查询路由的API,通过API添加的路由默认存储在内存之中。应用重启时,通过API添加的路由会丢失,进而导致应用的功能受损。如果应用有多个实例,Spring Cloud Gateway也没有提供路由同步机制,多个实例之间的路由信息不一致,影响正常的业务。由于Spring Cloud Gateway默认实现在可靠性和一致性方面存在不足,进而无法直接部署在生产环境,为此需要自定义实现路由的存储和同步机制。
Spring Cloud Gateway的路由加载机制
在Spring Cloud Gateway中一个RouteDefinition对象定义一个路由。Spring Cloud Gateway启动时首先加载所有的RouteDefinition,然后生成路由并讲路由加载到内中(有缓存机制,主要目的是提供路由匹配的效率)。Spring Cloud Gateway可以从四个数据源加载RouteDefinition:配置文件,Fluent Route API,RouteDefinitionRepository和DiscoveryClient(Spring Cloud定义的服务发现接口)。从路由的加载机制可以看出,能够实现动态添加、删除、修改路由的方式就是自定义实现RouteDefinitionRepository,从而可以保证在Spring Cloud Gateway启动时加载之前已经添加过的路由。
应用通过代码,配置文件以及基于服务发现添加的路由无法被修改
Spring Cloud Gateway的路由刷新通知机制。
Spring Cloud Gateway定义了一个RouteRefreshListener用来监听路由变化事件RefreshRoutesEvent,因此在添加、删除、更新路由后只需要发布一个RefreshRoutesEvent事件以让所有存储路由的组件更新路由即可。
动态路由实现
实现机制
实现步骤:
第一步:客户端发送路由创建、删除、修改的请求到一个SCG1应用。
第二步:SCG1将路由信息写入到持久存储
第三步:SCG1通知内部组件加载新路由
第四步:SCG1通知SCG2路由有刷新
第五步:SCG2通知内部组件加载新路由
实现源码
基于mysql的实现源码参考Spring Cloud Gateway Example