如何实现一套优雅的Baas查询语言?

news2024/11/24 17:06:07

Baas平台内,同一区块链底层接口数据可能会被应用在不同的业务场景下,因此需要进行筛选或者排序等操作。为满足此类需求,通常后端需要开发新的接口或增加新的字段以满足业务诉求。但随着需求业务不断变更,往往不可避免地导致接口的修改、新增,相应的接口文档和代码的维护成本也随之骤增。

为此,趣链BaaS在实践中总结了一套标准的客户端与服务端间自定义查询语法,使客户端能便捷对数据库进行分页与筛选,从而获取满足不同业务场景的数据,同时可保障服务端接口的可扩展性。

传统接口设计的痛点

用户使用过程中,列表可能存在大量的数据,以链列表为例,一旦用户需要对自己感兴趣的信息进行筛选搜索排序,则该数据接口需要输出供用户模糊查询链名、对链状态筛选、按照创建时间排序等能力。在此场景下,典型的接口设计做法可能是:


func getChainList(string name, int state, string time) {
  if len(name) != 0 {
    //追加SQL条件
  }
  if state(name) != 0 {
    //追加SQL条件
  }
  if len(time) != 0 && time == "desc" {
    //追加SQL条件
  }
}

毫无疑问,随着业务的变更接口的参数越来越多,即便封装成一个对象也会不断膨胀,无法避免重复代码问题。

最佳实践方案

对于任何一个接口而言,搜索和筛选是非常基础的功能,系统期望能够有效地向客户端应用程序提供数据,因此必须以灵活的方式构建接口,支持快速响应查询操作。

为此,需要定义查询一套查询语言,支持灵活筛选所需的资源,一方面可供前端便捷调用并筛选出所需的资源,另一方面提升后端对接口的复用性,提升整个代码的复用率。实践中,我们选择基于FIQL(Flexible Item Query Language)部分规范来实现这套通用的API语言查询接口。之所以选择该语法,是因为其不仅语句简单易懂,且具有安全的URL编码字符,前端以及驱动开发者能够快速上手编写语句。

因此,趣链自定义接口查询语言具有如下优势:

A.丰富的查询功能: 支持模糊查询、范围查询、分页查询、排序及精确匹配,支持多个条件间进行灵活组合;

B.灵活兼容多种语言及数据库:通过解析器可将前端的语法解析成不同语言,通过SQL生成器能支持多种数据源,包括关系型数据库、非关系型数据库、文件系统等;

C.安全性保障:在设计生成器时,考虑到数据库结构泄漏及已存在的SQL注入等情况,采用对所有查询条件进行验证映射机制,避免恶意的查询对系统安全造成影响;

因此,通过基于FIQL的API接口查询语言,为用户提供一种灵活、高效、安全的查询工具。用户可通过这种工具快速、简单地查询所需的信息,实现更多功能。
在这里插入图片描述

典型应用场景

统一处理BaaS资源列表数据

过去,由于BaaS平台内存在大量的资源列表且资源列表中存在关联的其他资源信息,用户需要在上述大量数据中筛选所需的资源信息。通过趣链BaaS自定义查询语言,前端不再需要通过请求多个API服务后渲染资源,而是通过统一的资源接口再由BFF层聚合多个微服务数据信息组合而成。BFF层解析自定义语法并根据不同的服务接口定义转为对应的接口入参,将请求定向发送至不同的微服务,待微服务返回后由BFF层统一聚合成对应的数据返回至前端。

提升标准驱动资源对接能力

在《一键部署区块链背后的秘密(上)》中,我们了解到趣链BaaS驱动由前端页面和后端组成,所有的资源操作通过透传接口直接与后端交互,而前端的页面的资源信息是通过Baas平台提供的接口查询的。

由于驱动页面是可以定制开发的,对于资源相关信息需要通过Baas平台提供的接口来查询,以创建联盟链过程为例,前端驱动页面存在较多的填写与选择逻辑。例如,在链名是否重复的判断中,需要选择节点部署的主机。虽然页面呈现出的效果不尽相同,但业务背后都是通过请求BaaS资源查询进行后续的逻辑处理。在平台驱动开发中,尽管平台可以提供单独的接口,但随着后续越来越多的驱动类型,可以想象如果都由平台单独来提供,那么API 将呈现爆炸的增长。另一方面,随着个人驱动开发者的加入,平台无法100%预测开发所需的接口,因此平台需要有一套通用的查询资源接口方案。

整体流程

1)前端通过Web请求携带请求参数start、size、filter、sort;

2)后端接收到请求后,解析器对filter与sort语法进行校验、解析、映射;

3)根据后端集成的不同orm,借助生成器转换;

4)执行orm将条件转为原生的sql执行;

在这里插入图片描述

实操案例

■设计统一的参数格式

type queryParmas {
  int start
  int size
  string filter
  string sort
}

我们希望接口参数能够保持一致,并且不随着接口查询字段的变更而增加或改编,因此我们需要友好且灵活的语法作为一个表达式,并且通过规范性的语法生成限制条件。

为此,我们将前端查询的的数据规范为四个参数start(起始页)、size(分页大小)、filter(查询条件)、sort(排序条件)并规定了格式,其中:

filter 用于过滤筛选返回参数内容,基本语法由字段<筛选关系>条件组成:

•查询状态1和3 state(1@3)

•模糊查询字段nickname#hyperchain#

•等于字段attributeordinary

sort用于对查询结果排序,由字段 顺序组成:

•时间顺序, create_time desc, id asc

■解析参数
当接收到前端请求后,我们通过统一的语法解析器工具,对所有的请求我们会将它处理成一个统一的预定义模型,它将解析所有查询的参数,构建成一个统一的中间查询模型,后端会对请求参数校验解析并过滤完成分页,过滤排序条件的提取如下:

假设一次http请求携带的参数如下

start=1&size=10&filter=namehyperchain,type(1@2)&sort=createTime desc

1)解析器先对 start 和 size 校验 ,若为空则设定为默认值;

2)将 sort=createTime desc 解析为排序列和排序关系;

3)对 filter 语法进行解析,对字符串分隔成 namehyperchain 和 type(1@2),再进行正则匹配是否符合格式,符合后通过正则捕获组提取字段、筛选关系和条件;
在这里插入图片描述
■列处理
上述方案会可能会存在以下问题

请求表的列名与前端耦合性强中,携带 filter 会暴露数据库的表结构;

无法对前端可筛选的内容做限制;

筛选的条件可能与数据库的数据不同,例如vaildatetrue 条件为true,数据库可能用 int表示;

因此针对上述问题,需另行引入一个基于列名的处理器:

type queryInfo {
  start   int
  size    int
  order   []Order
  filter  []Filter
  mapping map[string]MappingFunc
}

type MappingFunc func(colum string,value string) (mappingC, mappingV string)

在生成 filter 数组时,会根据列名在 mapping 中执行相对应的 MappingFun,将对应的条件和值转为期望的数据,如果未在mapping中查找到对应的数据,则不会加入 filter 数组。

■orm框架生成
在项目中根据不同技术选型,可选用不同的orm框架,因此需要生成器将解析后的参数转换为相应的orm框架语法。

基于前面的查询模型,我们实现了不同的适配器,数据库的底层差异由orm框架自身来实现,而生成器只需要调用orm框架的方法将解析后的数据做为参数调用,在生成器中 start ,size 可以变更 limit(start - 1, size*start),filter解析后的语法直接转成对应where,in条件,同时可以在生成器中插入相关的业务逻辑,如鉴权参数组成的where 条件。

总结

在BaaS系统中,往往会频繁查询各类列表,通过上述实践方案,可显著减少前后端之间的沟通成本,不仅赋予了前端一定的灵活性,还可以提高接口的复用性,把后端从筛选分页的重复代码中释放出来,聚焦于更多核心业务的研发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Activiti初识

以前 在没有工作流引擎的时候&#xff0c;要实现流程控制&#xff0c;我们需要在数据库中定义表&#xff0c;然后采用状态字段去跟踪流程的变化&#xff1a;比如是否到下一个流程&#xff1b; 然后到下一个角色执行的时候&#xff0c;我们需要判断用户是否具有审批的权限&…

HFSS使用经验

目录 一、如何找到Project工程变量 二、coverlines是什么东西 三、参数建模的第一步 四、让HFSS模型居中的快捷键CtrlD 五、关于介质颜色的修改 六、如何在HFSS中添加变量 七、如何绘制微带线 八、如何绘制带缺口的微带线谐振腔 九、如何设置激励源 十、HFSS如何镜像…

关于一致性问题的简单总结

一、场景引入 在随着人类的发展过程&#xff0c;由于人类是一群人&#xff0c;而非单个人&#xff0c;并相互联系&#xff0c;为了基本的生存或更美好的精神追求&#xff0c;出现了分工协作&#xff08;单个人无法完成&#xff09;的概念。人性是具有追求极致、美化的特性&…

【SQL】字符串处理函数

文章目录修复表中的名字left(string, count)substr(string, pos, len)按日期分组销售产品group_concat患某种疾病的患者修复表中的名字 将name的首字母大写&#xff0c;其余字母小写 select user_id, concat(upper(left(name, 1)), lower(substr(name, 2))) as name from User…

【Python机器学习】神经网络中全连接层与线性回归的讲解及实战(Tensorflow、MindSpore平台 附源码)

需要全部代码请点赞关注收藏后评论区留言私信~~~ 全连接层与线性回归 神经网络模型也是参数学习模型&#xff0c;因为对它的学习只是得到神经网络参数的最优值&#xff0c;而神经网络的结构必须事先设计好。如果确实不能通过改进学习过程来达到理想效果&#xff0c;则要重新设…

linux基础学习-用户权限相关命令

用户权限相关命令 用户和权限的基本概念 基本概念 用户是linux系统工作中的重要的一环&#xff0c;用户管理包括 用户 和 组 管理在linux系统下&#xff0c;不论是由本机还是远程登录系统&#xff0c;每个系统都必须有一个账号&#xff0c;并且对于不同的系统资源拥有不同的使用…

银河系中心黑洞的首张照片

说到黑洞&#xff0c;那就不得不提起我们的家园银河系中心的大黑洞&#xff0c;在今天这张照片出来之前&#xff0c;所有关于银河系黑洞的描述都是推测、理论&#xff0c;而今天成为了现实&#xff01; 2019年&#xff0c;同一团队拍摄了梅西耶87星系&#xff08;M87&#xff0…

文本分类优化方法

文本分类优化方法 文本分类是NLP的基础工作之一&#xff0c;也是文本机器学习中最常见的监督学习任务之一&#xff0c;情感分类&#xff0c;新闻分类&#xff0c;相似度判断、问答匹配、意图识别、推断等等领域都使用到了文本分类的相关知识或技术。文本分类技术在机器学习的发…

用 Markdown 快速生成漂亮的 Latex 伪代码

参考&#xff1a;在 Markdown 中书写伪代码 文章目录配置 VSCode编写 Latex 源码生成 pseudocode配置 VSCode 组合&#xff1a; VSCode Markdown Preview Enhanced pseudocode.js 安装好 VSCode 和 Markdown Preview Enhanced 插件 按下快捷键 Ctrl Shift P&#xff0c;打…

定时器/计数器的基本概念

80C51单片机中有两个计数器&#xff0c;即T0和T1。 单片机内有一个定时器/计数器T0&#xff0c;可以用编程的方法将它设为计数器。当用作计数器时&#xff0c;它是一个16位计数器&#xff0c;它的最大计数值为65536。 定时器/计数器T0和T1分别是由TH0、TL0和TH1、TL1两个8位计数…

Vue3与Vue2生命周期不同点

一、前言 随着Vue3发布了两年多的时间&#xff0c;越来越多的小伙伴已经将老项目中的Vue2版本进行升级或者在新项目中使用到了Vue3.x的版本&#xff0c;今天就来总结以下Vue3相较于Vue2升级的生命周期不同点在哪。 二、生命周期 下面是生命周期对比图&#xff1a; Vue2Vue3…

JMeter基础入门

目录&#xff1a;导读 一、概述 二、Jmeter目录文件讲解 结语 一、概述 JMeter是Apache下一款在国外非常流行和受欢迎的开源性能测试工具&#xff0c;JMeter可用于模拟大量负载来测试一台服务器&#xff0c;网络或者对象的健壮性或者分析不同负载下的整体性能。 1、压测不同…

ValidateCode验证码的使用详解(初学看完都会用)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

Android 进阶——性能优化之电量优化全攻略及实战小结(二)

文章大纲引言一、在低电耗模式和应用待机模式下进行测试1、在低电耗模式下测试您的应用2、在应用待机模式下测试您的应用3、列入白名单的可接受用例4、确定当前充电状态5、监控充电状态变化6、确定当前电池电量7、监控显著的电池电量变化二、Wakelock 机制1、WakeLock分类2、申…

Linux系统x86-64架构下,从零实现一个系统调用。Ubuntu22.04LTS

名称版本OSUbuntu 22.04 LTSCurrent Kernel5.15.0-56-genericDestination Kernel5.16.60首先要会编译linux内核的源码,这块在我的另外一片文章里面。 https://blog.csdn.net/jl19861101/article/details/128327069 打开linux内核源码目录/arch/x86/entry/syscalls/syscall_64.t…

前端面试比较好的回答

介绍一下Connection:keep-alive 什么是keep-alive 我们知道HTTP协议采用“请求-应答”模式&#xff0c;当使用普通模式&#xff0c;即非KeepAlive模式时&#xff0c;每个请求/应答客户和服务器都要新建一个连接&#xff0c;完成 之后立即断开连接&#xff08;HTTP协议为无连接…

【笔记】canvas 绘制足球 —— 第一步 画个球体

文章目录一、球体分析二、足球结构分析三、canvas常用API四、画个球体1.初始化2.代码五、加上足球的皮肤一、球体分析 先上两张图 球坐标转直角坐标 xρsin(φ)cos(θ)x \rho \times sin(\varphi) \times cos(\theta) xρsin(φ)cos(θ) yρsin(φ)sin(θ)y \rho \times si…

柴油,光伏模块,风力涡轮机,电池和水力抽水蓄能组成的混合隔离微电网的设计(Matlab实现)

目录 0 引言 1 概述 2 HYMOD 软件操作 2.1 设计的三个阶段 3 HYMOD 软件架构 4 系统和元件的可靠性 5 微电网设计示例 6 Matlab代码与结论 7 操作指南 7.1 概述 7.2 操作 7.3 软件具体操作 0 引言 本文介绍了混合微电网优化设计 (Hymod) 软件。该软件具有最先进…

Redis发布和订阅

Redis发布和订阅1.什么是发布和订阅2.Redis命令演示发布订阅1.什么是发布和订阅 Redis发布订阅(pub/sub)是一种消息通信模式&#xff1a;发布者(pub)发送消息&#xff0c;订阅者(sub)接收消息。 Redis客户端可以订阅任意数量的频道。 2.Redis命令演示发布订阅 打开两个终端 终…

python教程二十 输入和输出

输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数。 第三种方式是使用文件对象的 write() 方法&#xff0c;标准输出文件可以用 sys.stdout 引用。 如果你希望输出的形式更加多样&#xff0c;可以使用 str.format() 函数来格式化输出值。 如果你希望将输出…