在构建面向企业项目、多端的内容聚合类在线服务API设计的过程当中,因为其定制特色,采用常规的restful开发模式,一般会致使大量雷同API重复开发的窘境,本文介绍一种GraphQL查询语言+网关编排联合的实践,解决大量重复定制的问题。数据库
早期与车厂合做过程当中,基于高德已有的数据、引擎能力和一些较为重要的相关CP服务(如停车场、加油站、天气等),造成的在线服务协做模式是针对客户需求,采用REST API提供针对每一个车厂、每一个项目以及每一个终端提供不一样的API实现,然而数据核心独立服务实际上就有十余种,然而因为车线业务维护周期长,定制多,2-3年下来,API规模已达几百个,并且持续发散级增加,这给持续开发和维护带来不小挑战。缓存
分解业务开发过程,无非两类工做,业务需求能力数据的获取和非业务诉求可是必不可少的如鉴权等通用化能力,当前来看,其实这两个问题是几乎全部业务团队都会遇到的问题,所以解决方案也基本相似,如服务聚合、流程编排、API网关等。服务器
本文简要介绍下车联网在线服务改造旧架构的一些实践。restful
车线业务在线服务旧架构以下:架构
面临如下问题:负载均衡
针对上述问题,主要从如下几个方面思考改进:函数
下面分别介绍。工具
实现稳定、独立演进的原子能力服务spa
对已有的服务进行梳理,抽象出不一样应该独立开发、部署演进的核心能力,对于引擎能力没有什么工做,重点是对于一些历史对接的外部CP,主要实现如下目标:插件
这部分工做主要是解决历史遗留的一些服务组合不合理,跟随业务过分定制的问题。
定制代码开发转换为定义查询语句
这里主要目的就是将服务聚合、定制逻辑等原来须要的代码开发转换为编写查询语言的方式实现,只须要编写出声明式的查询语句即完成服务发布,特性以下:
本文选择GraphQL做为查询语言基础,然而,直接采用GraphQL有这样两个主要问题须要解决:
须要经过嵌入简单的DSL实现:
这里嵌入DSL须要控制好度,由于DSL若是过于复杂,那么,使用者或者发布者没法快速写出查询的话,对比写代码提效就会打折扣,偏离原本的价值,因此基本原则是简单、可扩展。
因为以前每一个API的定制开发基本全部功能混合在一块儿,能复用部分就是鉴权提供装饰器,常规性的响应格式定制提供一些工具函数,任何需求变动都须要变动代码,走发布流程,有了上面第一步的改造,这个步骤指望将非业务数据部分的定制功能抽象出处理链,每一个处理节点提供多实现(包含通用和定制),经过数据库存储插件链实现编排。
车线业务因为鉴权方式须要根据客户定制,所以存在多样性,实现上是经过Web中间件实现多种鉴权插件:
对于API网关来讲,这些鉴权插件并无什么不一样之处,只是工程要处理一些定制场景,好比对于不一样车厂的JWK管理刷新策略,JWT验证策略等,具体须要根据业务诉求抽象建模,经过插件属性来实现配置控制。
另外,网关还实现了一些变换器,主要用于将GraphQL的输出变换为REST API接口透出,这一方面因为一些旧接口要作兼容支持,另外,一些重点客户的全球化架构背景下本身已经彻底定义好了接口式样,目前主要实现了:
而插件的使用则经过控制台或API实现将插件配置信息存储于数据库中进行管理,使用时根据请求特征从DB中提取并缓存起来使用。
改造后的新架构以下:
经过上述改造,将车联网在线服务开发模式进行了升级,实现API控制台动态发布,大幅提高定制开发效率:
原文连接 本文为云栖社区原创内容,未经容许不得转载。