车联网服务non-RESTful架构改造实践

在构建面向企业项目的过程中,多端内容聚合在线服务API设计,由于其自定义功能,使用传统的restful开发模型,通常会导致很多类似的API复制开发,本文介绍了一个GraphQL查询语言+网关编排结合了解决大量重复定制问题的实践。

在与汽车制造商的早期合作中,基于现有数据,发动机功能和一些重要的相关CP服务(如停车场,加油站,天气等),在线服务协作模式基于客户需求并采用休息。 API为每个库,每个项目和每个终端提供不同的API实现。但是,实际上有十多种数据核心独立服务。但是,由于汽车线路服务的维护周期长,定制更多,2 - 3年下降。 API的规模已经达到数百个,并且持续的分歧水平增长给持续开发和维护带来了挑战。

分解业务开发过程,没有两种类型的工作,即业务需求能力数据的获取和非业务上诉,但是必要的泛化能力,例如认证。目前,几乎所有业务团队都遇到了这两个问题。问题所在,解决方案基本相似,如服务聚合,流程编排,API网关等。

本文简要介绍了转换在线服务的旧架构的一些实践。

GraphQL:GraphQL既是API的查询语言,也是满足数据查询的运行时。 GraphQL提供了API中数据的完整且易于理解的描述,使客户能够准确地获得所需的数据而无需任何冗余,并使API更容易随着时间的推移而发展。用于构建强大的开发工具。

DSL:指专注于应用程序域的计算机语言。也翻译为特定领域的语言。与通用的跨域通用计算机语言(GPL)不同,域特定语言仅用于某些特定区域。例如,用于显示网页的HTML和Emacs使用的Emac LISP语言。

API网关:API网关是服务器,是系统的唯一入口。从面向对象的设计角度来看,它类似于外观和感觉模式。 API网关封装了系统的内部体系结构,并为每个客户端提供自定义API。它还可能具有其他职责,例如身份验证,监视,负载平衡,缓存,请求碎片和管理以及静态响应处理。

汽车线业务在线服务的旧架构如下:

面对以下问题:

针对上述问题,主要从以下几个方面考虑改进:

服务能力的原子化:目标是稳定,让上层通过组合实现业务需求;

构建查询引擎:支持强大的查询组合功能,实现原子服务功能的任意聚合和定制;

API网关:提供非业务数据功能要求的抽象,以实现插件编排。

以下是单独介绍的。

实现原子能力服务的稳定,独立发展

整理现有服务,并且抽象出应该独立开发,部署和发展的核心功能。发动机功能没有任何作用。重点是一些历史上相关的外部CP,主要实现以下目标:

提供稳定的接口,屏蔽底层复杂性(数据访问,多源差异);

以位置为中心进行有机整合,构建一整套雾化功能。

这部分工作主要是为了解决历史遗留下来的一些服务组合不合理,并遵循业务过度定制的问题。

自定义代码开发转换为定义查询语句

这里的主要目的是将服务聚合和自定义逻辑所需的原始代码开发转换为编写查询语言的方式。它只需要编写一个声明性查询语句来完成服务发布。其特点如下:

提供标准化的查询语言

实现原子能力组合

总结业务共性,完善定制模型,提高重用性

本文选择graphql作为查询语言的基础。但是,有两个主要问题需要直接用graphql解决:

Fackbook提出的数据加载器直接解决了数据查询n+1放大问题。原则是批量添加缓存;

graphql规范限制了一些难以实现的定制,例如:

参数定制:如参数关联、类型转换等;

输出格式:字段显示形式,如时间、经纬度等;

配置表定制:主要是部分业务逻辑需要根据配置表进行定制,如深度返回字段;

模型连接:原子能力服务尽可能独立,无法枚举定义模型关系。然而,定制业务需求要求大量的关联是透明的,从而减少了服务请求和延迟。因此,由于最终的查询控制是内部的,并且暴露了剩余的API,因此无模型关联能力是必要的,因此,不关联自由度导致的不可理解性不是一个问题。

需要通过嵌入一个简单的DSL来实现:

内置和自定义功能特性;

模型动态关联查询,上下文参数获取;

扩展自定义功能很方便。

在这里嵌入DSL需要良好的控制。由于DSL过于复杂,如果用户或发布者无法快速编写查询,则比较代码将打折并偏离原始值,因此基本原理简单且可扩展。

由于每个API的自定义开发的所有功能已经混合在一起,因此可重用部分是提供装饰的身份验证器。传统的响应格式定制提供了一些工具功能。任何需求更改都需要更改代码并完成发布过程。通过上述第一步的转换,此步骤期望将非业务数据部分的定制功能抽象出处理链。每个处理节点提供多种实现(包括通用和自定义),并通过数据库存储插件链进行排列。

由于认证方法需要根据客户要求定制,因此车线业务具有多样性。在实现中,通过Web中间件实现多个身份验证插件:

HTTP签名,请参考此处:主要针对ToB(汽车厂后台,合作伙伴)请求;

JWT认证:主要用于汽车电话和手机等终端;

API密钥。

对于API网关,这些身份验证插件没有什么不同,除了项目必须处理一些自定义方案,例如针对不同制造商的JWK管理刷新策略,JWT验证策略等,需要根据需要进行抽象建模。商业呼吁。用于实现配置控制的插件属性。

此外,网关还实现了一些转换器,主要用于将GraphQL的输出转换为REST API接口。这方面与一些旧接口兼容。此外,一些关键客户拥有自己的全球化架构背景。界面风格已完全定义,现在主要实现:

输入参数转换:使用REST API参数填充GraphQL查询模板;

标题转换:主要用于适应不同的客户规范;

JSON转换,使用场景如下:

可重复使用的标准接口,但不同的客户响应结构规范不一致

自定义非标准接口,需要转换GraphQL输出

插件的使用存储在数据库中以供控制台或API管理,并根据请求功能从DB中提取和缓存。

转型后的新架构如下:

通过上述改造,汽车网络的在线服务开发模式得到了升级,API控制台动态发布,大大提高了定制开发的效率:

改进的开发:正交化原子容量编排,用轻量级定义替换自定义代码开发:

定制开发减少了60%;

单个界面开发从2-3人日→2-3人。

协议兼容性:混合REST解决方案,在外部提供标准协议并支持现有的适配协议。

作者:德国高科技小弟弟

阅读原文

本文是云栖社区的原创内容,未经许可,不得转载。

阿里云云栖社区

2.4

2019.08.29 17: 59

字数2353

在构建面向企业项目的过程中,多端内容聚合在线服务API设计,由于其自定义功能,使用传统的restful开发模型,通常会导致很多类似的API复制开发,本文介绍了一个GraphQL查询语言+网关编排结合了解决大量重复定制问题的实践。

在与汽车制造商的早期合作中,基于现有数据,发动机功能和一些重要的相关CP服务(如停车场,加油站,天气等),在线服务协作模式基于客户需求并采用休息。 API为每个库,每个项目和每个终端提供不同的API实现。但是,实际上有十多种数据核心独立服务。但是,由于汽车线路服务的维护周期长,定制更多,2 - 3年下降。 API的规模已经达到数百个,并且持续的分歧水平增长给持续开发和维护带来了挑战。

分解业务开发过程,没有两种类型的工作,即业务需求能力数据的获取和非业务上诉,但是必要的泛化能力,例如认证。目前,几乎所有业务团队都遇到了这两个问题。问题所在,解决方案基本相似,如服务聚合,流程编排,API网关等。

本文简要介绍了转换在线服务的旧架构的一些实践。

GraphQL:GraphQL既是API的查询语言,也是满足数据查询的运行时。 GraphQL提供了API中数据的完整且易于理解的描述,使客户能够准确地获得所需的数据而无需任何冗余,并使API更容易随着时间的推移而发展。用于构建强大的开发工具。

DSL:指专注于应用程序域的计算机语言。也翻译为特定领域的语言。与通用的跨域通用计算机语言(GPL)不同,域特定语言仅用于某些特定区域。例如,用于显示网页的HTML和Emacs使用的Emac LISP语言。

API网关:API网关是服务器,是系统的唯一入口。从面向对象的设计角度来看,它类似于外观和感觉模式。 API网关封装了系统的内部体系结构,并为每个客户端提供自定义API。它还可能具有其他职责,例如身份验证,监视,负载平衡,缓存,请求碎片和管理以及静态响应处理。

汽车线业务在线服务的旧架构如下:

面对以下问题:

针对上述问题,主要从以下几个方面考虑改进:

服务能力的原子化:目标是稳定,让上层通过组合实现业务需求;

构建查询引擎:支持强大的查询组合功能,实现原子服务功能的任意聚合和定制;

API网关:提供非业务数据功能要求的抽象,以实现插件编排。

以下是单独介绍的。

实现原子能力服务的稳定,独立发展

整理现有服务,并且抽象出应该独立开发,部署和发展的核心功能。发动机功能没有任何作用。重点是一些历史上相关的外部CP,主要实现以下目标:

提供稳定的接口,屏蔽底层复杂性(数据访问,多源差异);

以位置为中心进行有机整合,构建一整套雾化功能。

这部分工作主要是为了解决历史遗留下来的一些服务组合不合理,并遵循业务过度定制的问题。

自定义代码开发被转换为定义查询语句

这里的主要目的是将服务聚合和自定义逻辑所需的原始代码开发转换为编写查询语言的方式。它只需要编写声明性查询语句来完成服务发布。功能如下:

提供标准化查询语言

实现原子能力组合

总结业务共性,改进自定义模型并改进重用

本文选择GraphQL作为查询语言的基础。但是,有两个主要问题需要使用GraphQL直接解决:

数据查询N + 1放大问题由Fackbook提出的数据加载器直接解决。原则是批量添加缓存;

GraphQL规范限制了一些自定义很难实现,例如:

自定义参数:如参数关联,类型转换等;

输出格式:字段显示形式,如时间,经度和经度等;

配置表定制:主要是部分业务逻辑需要根据配置表进行定制,如深度返回字段;

模型连接:原子能力服务尽可能独立,并且不可能枚举定义模型关系。但是,自定义业务要求要求大量关联透明,从而减少服务请求并减少延迟。因此,模型自由关联功能是必要的,因为最终的Query控件是内部的并暴露了REST API,因此由不相关的自由度引起的不可理解性不是问题。

需要通过嵌入简单的DSL来实现:

内置和自定义功能;

模型动态关联查询,上下文参数获取;

扩展自定义功能很方便。

在这里嵌入DSL需要良好的控制。由于DSL过于复杂,如果用户或发布者无法快速编写查询,则比较代码将打折并偏离原始值,因此基本原理简单且可扩展。

由于每个API的自定义开发的所有功能已经混合在一起,因此可重用部分是提供装饰的身份验证器。传统的响应格式定制提供了一些工具功能。任何需求更改都需要更改代码并完成发布过程。通过上述第一步的转换,此步骤期望将非业务数据部分的定制功能抽象出处理链。每个处理节点提供多种实现(包括通用和自定义),并通过数据库存储插件链进行排列。

由于认证方法需要根据客户要求定制,因此车线业务具有多样性。在实现中,通过Web中间件实现多个身份验证插件:

HTTP签名,请参考此处:主要针对ToB(汽车厂后台,合作伙伴)请求;

JWT认证:主要用于汽车电话和手机等终端;

API密钥。

对于API网关,这些身份验证插件没有什么不同,除了项目必须处理一些自定义方案,例如针对不同制造商的JWK管理刷新策略,JWT验证策略等,需要根据需要进行抽象建模。商业呼吁。用于实现配置控制的插件属性。

此外,网关还实现了一些转换器,主要用于将GraphQL的输出转换为REST API接口。这方面与一些旧接口兼容。此外,一些关键客户拥有自己的全球化架构背景。界面风格已完全定义,现在主要实现:

输入参数转换:使用REST API参数填充GraphQL查询模板;

标题转换:主要用于适应不同的客户规范;

JSON转换,使用场景如下:

可重复使用的标准接口,但不同的客户响应结构规范不一致

自定义非标准接口,需要转换GraphQL输出

插件的使用存储在数据库中以供控制台或API管理,并根据请求功能从DB中提取和缓存。

转型后的新架构如下:

通过上述改造,汽车网络的在线服务开发模式得到了升级,API控制台动态发布,大大提高了定制开发的效率:

改进的开发:正交化原子容量编排,用轻量级定义替换自定义代码开发:

定制开发减少了60%;

单个界面开发从2-3人日→2-3人。

协议兼容性:混合REST解决方案,在外部提供标准协议并支持现有的适配协议。

作者:德国高科技小弟弟

阅读原文

本文是云栖社区的原创内容,未经许可,不得转载。

在构建面向企业项目的过程中,多端内容聚合在线服务API设计,由于其自定义功能,使用传统的restful开发模型,通常会导致很多类似的API复制开发,本文介绍了一个GraphQL查询语言+网关编排结合了解决大量重复定制问题的实践。

在与汽车制造商的早期合作中,基于现有数据,发动机功能和一些重要的相关CP服务(如停车场,加油站,天气等),在线服务协作模式基于客户需求并采用休息。 API为每个库,每个项目和每个终端提供不同的API实现。但是,实际上有十多种数据核心独立服务。但是,由于汽车线路服务的维护周期长,定制更多,2 - 3年下降。 API的规模已经达到数百个,并且持续的分歧水平增长给持续开发和维护带来了挑战。

分解业务开发过程,没有两种类型的工作,即业务需求能力数据的获取和非业务上诉,但是必要的泛化能力,例如认证。目前,几乎所有业务团队都遇到了这两个问题。问题所在,解决方案基本相似,如服务聚合,流程编排,API网关等。

本文简要介绍了转换在线服务的旧架构的一些实践。

GraphQL:GraphQL既是API的查询语言,也是满足数据查询的运行时。 GraphQL提供了API中数据的完整且易于理解的描述,使客户能够准确地获得所需的数据而无需任何冗余,并使API更容易随着时间的推移而发展。用于构建强大的开发工具。

DSL:指专注于应用程序域的计算机语言。也翻译为特定领域的语言。与通用的跨域通用计算机语言(GPL)不同,域特定语言仅用于某些特定区域。例如,用于显示网页的HTML和Emacs使用的Emac LISP语言。

API网关:API网关是服务器,是系统的唯一入口。从面向对象的设计角度来看,它类似于外观和感觉模式。 API网关封装了系统的内部体系结构,并为每个客户端提供自定义API。它还可能具有其他职责,例如身份验证,监视,负载平衡,缓存,请求碎片和管理以及静态响应处理。

汽车线业务在线服务的旧架构如下:

面对以下问题:

针对上述问题,主要从以下几个方面考虑改进:

服务能力的原子化:目标是稳定,让上层通过组合实现业务需求;

构建查询引擎:支持强大的查询组合功能,实现原子服务功能的任意聚合和定制;

API网关:提供非业务数据功能要求的抽象,以实现插件编排。

以下是单独介绍的。

实现原子能力服务的稳定,独立发展

整理现有服务,并且抽象出应该独立开发,部署和发展的核心功能。发动机功能没有任何作用。重点是一些历史上相关的外部CP,主要实现以下目标:

提供稳定的接口,屏蔽底层复杂性(数据访问,多源差异);

以位置为中心进行有机整合,构建一整套雾化功能。

这部分工作主要是为了解决历史遗留下来的一些服务组合不合理,并遵循业务过度定制的问题。

自定义代码开发被转换为定义查询语句

这里的主要目的是将服务聚合和自定义逻辑所需的原始代码开发转换为编写查询语言的方式。它只需要编写声明性查询语句来完成服务发布。功能如下:

提供标准化查询语言

实现原子能力组合

总结业务共性,改进自定义模型并改进重用

本文选择GraphQL作为查询语言的基础。但是,有两个主要问题需要使用GraphQL直接解决:

数据查询N + 1放大问题由Fackbook提出的数据加载器直接解决。原则是批量添加缓存;

GraphQL规范限制了一些自定义很难实现,例如:

自定义参数:如参数关联,类型转换等;

输出格式:字段显示形式,如时间,经度和经度等;

配置表定制:主要是部分业务逻辑需要根据配置表进行定制,如深度返回字段;

模型连接:原子能力服务尽可能独立,并且不可能枚举定义模型关系。但是,自定义业务要求要求大量关联透明,从而减少服务请求并减少延迟。因此,模型自由关联功能是必要的,因为最终的Query控件是内部的并暴露了REST API,因此由不相关的自由度引起的不可理解性不是问题。

需要通过嵌入简单的DSL来实现:

内置和自定义功能;

模型动态关联查询,上下文参数获取;

扩展自定义功能很方便。

在这里嵌入DSL需要良好的控制。由于DSL过于复杂,如果用户或发布者无法快速编写查询,则比较代码将打折并偏离原始值,因此基本原理简单且可扩展。

由于每个API的自定义开发的所有功能已经混合在一起,因此可重用部分是提供装饰的身份验证器。传统的响应格式定制提供了一些工具功能。任何需求更改都需要更改代码并完成发布过程。通过上述第一步的转换,此步骤期望将非业务数据部分的定制功能抽象出处理链。每个处理节点提供多种实现(包括通用和自定义),并通过数据库存储插件链进行排列。

由于认证方法需要根据客户要求定制,因此车线业务具有多样性。在实现中,通过Web中间件实现多个身份验证插件:

HTTP签名,请参考此处:主要针对ToB(汽车厂后台,合作伙伴)请求;

JWT认证:主要用于汽车电话和手机等终端;

API密钥。

对于API网关,这些身份验证插件没有什么不同,除了项目必须处理一些自定义方案,例如针对不同制造商的JWK管理刷新策略,JWT验证策略等,需要根据需要进行抽象建模。商业呼吁。用于实现配置控制的插件属性。

此外,网关还实现了一些转换器,主要用于将GraphQL的输出转换为REST API接口。这方面与一些旧接口兼容。此外,一些关键客户拥有自己的全球化架构背景。界面风格已完全定义,现在主要实现:

输入参数转换:使用REST API参数填充GraphQL查询模板;

标题转换:主要用于适应不同的客户规范;

JSON转换,使用场景如下:

可重复使用的标准接口,但不同的客户响应结构规范不一致

自定义非标准接口,需要转换GraphQL输出

插件的使用存储在数据库中以供控制台或API管理,并根据请求功能从DB中提取和缓存。

转型后的新架构如下:

通过上述改造,汽车网络的在线服务开发模式得到了升级,API控制台动态发布,大大提高了定制开发的效率:

改进的开发:正交化原子容量编排,用轻量级定义替换自定义代码开发:

定制开发减少了60%;

单个界面开发从2-3人日→2-3人。

协议兼容性:混合REST解决方案,在外部提供标准协议并支持现有的适配协议。

作者:德国高科技小弟弟

阅读原文

本文是云栖社区的原创内容,未经许可,不得转载。

http://www.sugys.com/bdsWRY03