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

简介: 导读在构建面向企业项目、多端的内容聚合类在线服务API设计的过程中,由于其定制特点,采用常规的restful开发模式,通常会导致大量雷同API重复开发的窘境,本文介绍一种GraphQL查询语言+网关编排联合的实践,解决大量重复定制的问题。

导读

在构建面向企业项目、多端的内容聚合类在线服务API设计的过程中,由于其定制特点,采用常规的restful开发模式,通常会导致大量雷同API重复开发的窘境,本文介绍一种GraphQL查询语言+网关编排联合的实践,解决大量重复定制的问题。

早期与车厂合作过程中,基于高德已有的数据、引擎能力和一些较为重要的相关CP服务(如停车场、加油站、天气等),形成的在线服务协作模式是针对客户需求,采用REST API提供针对每个车厂、每个项目以及每个终端提供不同的API实现,然而数据核心独立服务实际上就有十余种,然而由于车线业务维护周期长,定制多,2-3年下来,API规模已达几百个,而且持续发散级增长,这给持续开发和维护带来不小挑战。

分解业务开发过程,无非两类工作,业务需求能力数据的获取和非业务诉求但是必不可少的如鉴权等通用化能力,当前来看,其实这两个问题是几乎所有业务团队都会遇到的问题,因此解决方案也基本类似,如服务聚合、流程编排、API网关等。

本文简要介绍下车联网在线服务改造旧架构的一些实践。

有关名词

  • GraphQL:GraphQL既是一种用于API的查询语言也是一个满足数据查询的运行时。GraphQL对API中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让API更容易地随着时间推移而演进,还能用于构建强大的开发者工具。
  • DSL:指的是专注于某个应用程序领域的计算机语言。又译作领域专用语言。不同于普通的跨领域通用计算机语言(GPL),领域特定语言只用在某些特定的领域。 比如用来显示网页的HTML,以及Emacs所使用的Emac LISP语言。
  • API网关:API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。

存在的问题

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

1

面临以下问题:

2

改进

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

  • 服务能力原子化:目标是做稳,让上层通过组合实现业务需求;
  • 构建查询引擎:支持强大的查询组合能力,实现原子服务能力任意聚合和定制;
  • API网关:对非业务数据能力需求进行抽象提供插件,实现插件编排。

下面分别介绍。

实现稳定、独立演进的原子能力服务

对已有的服务进行梳理,抽象出不同应该独立开发、部署演进的核心能力,对于引擎能力没有什么工作,重点是对于一些历史对接的外部CP,主要实现以下目标:

  • 向上提供稳定接口,向下屏蔽底层复杂性(数据访问,多源差异);
  • 以位置为中心有机整合,构建完备原子化能力集合。

这部分工作主要是解决历史遗留的一些服务组合不合理,跟随业务过度定制的问题。

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

这里主要目的就是将服务聚合、定制逻辑等原来需要的代码开发转换为编写查询语言的方式实现,只需要编写出声明式的查询语句即完成服务发布,特性如下:

  • 向上提供标准化查询语言
  • 向下实现原子能力组合
  • 归纳业务共性,提炼定制模式,提升复用

3

本文选择GraphQL作为查询语言基础,然而,直接采用GraphQL有这样两个主要问题需要解决:

  • 数据查询N+1放大问题,直接采用Fackbook提出的dataloader来解决,原理是批量加缓存;
  • GraphQL规范限制,一些定制难以实现,如:
  1. 入参定制:如参数关联,类型转换等;
  2. 输出格式:字段展现形式,如时间、经纬度等;
  3. 配置表定制:主要是部分业务逻辑需要根据配置表定制,如深度返回字段等;
  4. 模型连接:原子能力服务尽可能独立,同时也无法枚举定义模型关系,但是定制业务需求需要大量关联透出,减少业务请求降低延时,所以模型自由关联能力是必要的,由于本方案最终的查询控制在内部,对外暴露REST API,因此不会关联自由度造成的难理解性并不是一个问题。

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

  • 内置和自定义函数功能;
  • 模型动态关联查询,上下文参数获取;
  • 可以方便扩展自定义函数。

4

这里嵌入DSL需要控制好度,因为DSL如果过于复杂,那么,使用者或者发布者无法快速写出查询的话,对比写代码提效就会打折扣,偏离本来的价值,所以基本原则是简单、可扩展。

业务无关功能通过API网关插件配置化

由于之前每个API的定制开发基本所有功能混合在一起,能复用部分就是鉴权提供装饰器,常规性的响应格式定制提供一些工具函数,任何需求变更都需要变更代码,走发布流程,有了上面第一步的改造,这个步骤期望将非业务数据部分的定制功能抽象出处理链,每个处理节点提供多实现(包含通用和定制),通过数据库存储插件链实现编排。

5

车线业务由于鉴权方式需要根据客户定制,因此存在多样性,实现上是通过Web中间件实现多种鉴权插件:

  • HTTP签名,参考这里:主要面向ToB(车厂后台、合作方)的请求;
  • JWT认证:主要面向车机、手机等终端;
  • API Key。

对于API网关来说,这些鉴权插件并没有什么不同之处,只是工程要处理一些定制场景,比如对于不同车厂的JWK管理刷新策略,JWT验证策略等,具体需要根据业务诉求抽象建模,通过插件属性来实现配置控制。

另外,网关还实现了一些变换器,主要用于将GraphQL的输出变换为REST API接口透出,这一方面由于一些旧接口要做兼容支持,另外,一些重点客户的全球化架构背景下自己已经完全定义好了接口式样,目前主要实现了:

  • 入参变换:使用REST API参数填充GraphQL查询模板;
  • Header变换:主要用于适配不同客户规范;
  • JSON变换,使用场景如下:
  1. 可复用标准接口,但是不同客户的响应结构规范不一致
  2. 定制非标接口,需要对GraphQL输出进行转换

而插件的使用则通过控制台或API实现将插件配置信息存储于数据库中进行管理,使用时根据请求特征从DB中提取并缓存起来使用。

改造后的新架构如下:

6

小结

通过上述改造,将车联网在线服务开发模式进行了升级,实现API控制台动态发布,大幅提升定制开发效率:

  • 提效开发:正交化原子能力编排,通过轻量级定义取代定制化代码开发:
  1. 定制化开发占比下降60%;
  2. 单接口开发从2-3人日→2-3人时。
  • 协议兼容:混合REST方案,对外提供标准协议、支持既有适配协议。
相关文章
|
30天前
|
负载均衡 测试技术 持续交付
高效后端开发实践:构建可扩展的微服务架构
在当今快速发展的互联网时代,后端开发扮演着至关重要的角色。本文将重点探讨如何构建可扩展的微服务架构,以及在后端开发中提高效率的一些实践方法。通过合理的架构设计和技术选型,我们可以更好地应对日益复杂的业务需求,实现高效可靠的后端系统。
|
14天前
|
Kubernetes 安全 Java
构建高效微服务架构:从理论到实践
【4月更文挑战第9天】 在当今快速迭代与竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性及容错性,成为众多企业转型的首选。本文将深入探讨如何从零开始构建一个高效的微服务系统,覆盖从概念理解、设计原则、技术选型到部署维护的各个阶段。通过实际案例分析与最佳实践分享,旨在为后端工程师提供一套全面的微服务构建指南,帮助读者在面对复杂系统设计时能够做出明智的决策,并提升系统的可靠性与维护效率。
|
7天前
|
消息中间件 运维 监控
现代化软件开发中的微服务架构设计与实践
本文将深入探讨现代化软件开发中微服务架构的设计原则和实践经验。通过分析微服务架构的优势、挑战以及常见的设计模式,结合实际案例,帮助开发者更好地理解如何构建可靠、可扩展、高效的微服务系统。
|
7天前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【4月更文挑战第17天】Spring Cloud是Java微服务治理的首选框架,整合了Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(熔断器)、Zuul(API网关)和Config Server(配置中心)。通过Eureka实现服务注册与发现,Ribbon提供负载均衡,Hystrix实现熔断保护,Zuul作为API网关,Config Server集中管理配置。理解并运用Spring Cloud进行微服务治理是现代Java开发者的关键技能。
|
8天前
|
敏捷开发 监控 前端开发
深入理解自动化测试框架Selenium的架构与实践
【4月更文挑战第16天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加快迭代速度的关键手段。Selenium作为一种广泛使用的自动化测试工具,其开源、跨平台的特性使得它成为业界的首选之一。本文旨在剖析Selenium的核心架构,并结合实际案例探讨其在复杂Web应用测试中的高效实践方法。通过详细解读Selenium组件间的交互机制以及如何优化测试脚本,我们希望为读者提供深入理解Selenium并有效运用于日常测试工作的参考。
14 1
|
10天前
|
Linux 数据安全/隐私保护
Linux基础与服务器架构综合小实践
【4月更文挑战第9天】Linux基础与服务器架构综合小实践
1233 8
|
20天前
|
消息中间件 监控 API
构建高性能微服务架构:从理论到实践
【4月更文挑战第4天】 在当今互联网应用的快速迭代和高并发需求下,传统的单体应用架构已不足以满足市场的灵活性与扩展性要求。微服务架构以其独立部署、弹性伸缩、技术多样性等优势,成为众多企业转型升级的首选方案。本文将深入探讨如何构建一个高性能的微服务系统,涵盖关键组件的选择、系统设计的考量以及性能优化的策略,旨在为开发者和架构师提供一套实用的指导思路和具体实践步骤。
|
22天前
|
消息中间件 安全 API
构建高效微服务架构:策略与实践
【4月更文挑战第1天】在数字化转型的浪潮中,微服务架构已成为企业追求敏捷、可扩展和灵活部署的重要技术手段。本文将深入探讨如何通过合理的设计原则和先进的技术栈,构建一个高效的微服务系统。我们将剖析微服务设计的核心要点,包括服务的划分、通信机制、数据一致性以及安全性问题,并结合案例分析,展示如何在现实世界中应用这些策略以提升系统的可靠性和性能。
|
23天前
|
设计模式 API 持续交付
构建高效微服务架构:从理论到实践
在当今快速迭代和部署的软件开发环境中,微服务架构已成为一种流行的设计模式,它允许开发团队以模块化的方式构建、维护和扩展应用程序。本文将深入探讨微服务的核心概念,包括其定义、优势、挑战以及如何在实际项目中实施。我们将通过一个实际案例来展示如何将传统的单体应用拆分成一系列独立、松耦合的服务,并通过容器化、服务发现、API网关和持续集成/持续部署(CI/CD)等技术手段来管理这些服务。
|
25天前
|
XML JSON 安全
谈谈你对RESTful API设计的理解和实践。
RESTful API是基于HTTP协议的接口设计,通过URI标识资源,利用GET、POST、PUT、DELETE等方法操作资源。设计注重无状态、一致性、分层、错误处理、版本控制、文档、安全和测试,确保易用、可扩展和安全。例如,`/users/{id}`用于用户管理,使用JSON或XML交换数据,提升系统互操作性和可维护性。
18 4