今天介绍一下API路由系统的设计思路,包括我们当时做这个系统的初衷,路由系统在架构中的发挥的作用,以及能给我们带来的便利。
API路由系统的初心
做API路由系统的起因是摇旺的业务系统需要与集团的金融后台(天鼋系统)进行打通,涉及到天鼋系统多个API的调用。所以我们需要一个系统,来统一调用摇旺外部的API做统一的认证、授权、以及访问控制。
路由系统的设计目标
1. 内外隔离,作为业务系统的边界,让内外系统隔离开,除了通过路由系统,系统间无法直接通信。
2. 系统解耦,通过解耦,使得内部微服务系统能够独立和灵活的调整,不用担心影响功能本身。业务各个微服务可以随时做伸缩性调整,更换IP等操作等等。
3. 脚手架,统一对Request和Response进行数据格式的转换和处理。
路由系统的设计方案
摇旺内部的各个子服务基于Dubbo构建,所以路由系统与子服务的通信沿用Dubbo协议。路由系统作为服务Provider处理摇旺系统对外的请求服务。具体的情况如下图:
路由系统会统一对外调用的请求进行校验和参数组装,并记录访问日志。对于返回结果同样会进行统一处理和组装,异常情况会定义统一的Error Code。
以计算收益为例,API调用的流程如下图:
调用路由的代码示例
@TestpublicvoidtestRouterService() {// String[] 为请求路由目标接口入参泛型,可不传RouterRequest<String[]> routerRequest =newRouterRequest();// 路由目标接口类全路径 + 接口方法名(#分隔类名和方法名)routerRequest.setRequestInterface(RedeemFacade.class.getName() +"#redeemRequest");// 路由接口请求参数routerRequest.setParams(newString[]{"test param1","test param2"});// CommonResponse<RedeemApplyResultDTO> 为目标接口返回值泛型RouterResult<CommonResponse<RedeemApplyResultDTO>> objectRouterResult = routerService.requestRouter(routerRequest);Assert.assertFalse("router success", routerRequest ==null);}
启用路由系统后,会给我们带来以下便利:
1. 路由系统对内部和外部系统进行了隔离,保障了后台服务的安全性。
2. 降低内部服务与天鼋服务的耦合,彼此服务可以独立运维,通过路由来做映射。
3. 为服务熔断,灰度发布提供了一套可行方案。
4. 内部微服务便于横向扩展,实现系统伸缩性。
5. 便于监控,通过路由系统的日志集中监控服务调用的状态。
总结
通过路由系统,让内外服务解耦,便于不同的开发团队保持工作的独立性,减低运维的难度和成本。目前路由的功能还比较简单,会持续进行优化,提供更多的基础功能,并进一步提升路由系统本身的高可用性。
扫描二维码或手动搜索微信公众号【架构栈】: ForestNotes
欢迎转载,带上以下二维码即可