最近整理云服务网关,通过图形界面配置实现动态路由、动态权限、限流配额等功能,为项目提供统一的外网调用管理。总结如下:
网关的架构设计模式
传统的没有网关参与的互联网架构,是通过负载均衡期分发http请求到后端的服务系统,缺点是无法对后端服务进行统一的管理。
基于云服务开发框架的互联网架构引入了服务注册中心,后端服务均注册到服务注册中心,网关本身也注册到服务注册中心,网关可以从服务注册中心获取后端服务列表。服务注册中心的引入,可以有效管理后端服务,但是作为网关产品,需要处理异构系统的系统,如果强制使用服务注册中心,对其他系统具有侵入性。
网关产品架构采用URL链接转发形式(不采用映射到服务名的模式),这样能接入各种异构系统。
实现动态路由
动态路由需要达到可持久化配置,动态刷新的效果。如架构图所示,不仅要能满足从配置文件properties加载路由信息,还需要从数据库加载我们的配置。另外一点是,路由信息在容器启动时就已经加载进入了内存,我们希望配置完成后,实施发布,动态刷新内存中的路由信息,达到不停机维护路由信息的效果。
实现动态路由,可以通过扩展SimpleRouteLocator类并实现RefreshbleRouterLocator来实现自动动态刷新。在子类中Overide locateRoutes方法,从数据库中读取路由信息,并合并到从配置文件中读取的路由配置信息中返回。这样就实现了通过图形界面将路由表保存到数据库的功能。
实现动态路由刷新,可以自定义一个Service注入到Spring,在Service中生成RouteRefreshEvent事件,通过事件可以触发网关内部一系列的路由表刷新流程。
在界面中添加手动触发路由刷新功能的按钮。
locateRoutes方法默认在一分钟左右自动执行一次刷新(触发的机制暂时不清楚),更改路由配置后,在自动刷新执行前,路由配置不起作用。因此在图形界面中添加了手动出发刷新的按钮,在后台添加Rest接口,调用步骤2中的Service生成RouteRefreshEvent事件,从而完成触发。
加强路由刷新Rest接口的安全性
因为路由刷新Rest接口是写在网关模块中的,不同于其他业务模块的Rest接口需要通过网关进行路由映射和转发,用户可以直接请求网关的Rest接口,这样就绕过了网关的权限认证处理。为避免带来安全性的问题,通过WebMvcConfigurerAdapter添加拦截器,对用户的token进行验证,未登录的用户不能调用路由刷新接口。该拦截器不同于网关的filter,网关的filter对指定前缀的url请求进行过滤,拦截器对发送给Contorller的请求进行拦截。
领取专属 10元无门槛券
私享最新 技术干货