本文转载自我自己的博客,感兴趣的老爷们可以关注~:https://www.miaoerduo.com/2021/11/16/arch-idl/
为什么IDL的介绍也放在这里呢?一方面是我想不到放哪里,另一方面是之前说到,“架构”即“设计”,那么IDL、RPC框架也算是设计的一部分。不合理的选型在后续维护上会带来不小的麻烦。
本文主要介绍我用过的一些IDL,并结合真实案例,分析他们的优劣。
IDL的作用
在我接手第一个项目的时候,就问了一个问题:这个idl文件夹是做什么的?
一年之后,当对新人介绍我们项目结构的时候,我都会忍不住试探的问句,你知道idl是什么意思吗?发现大家和我一样不了解,我才心满意足的解释一番。
IDL其实有很多的含义,在这里一般可以理解为接口描述语言(Interface description language),即描述服务的接口,类似我们C程序的接口声明,包含:接口名和输入输出的数据结构。
一般每个服务均有自己的IDL文件(也可以是多个服务依赖相同的IDL文件,因为懒,或者其他巧妙的目的),比如我现在公司常用的服务是基于C++和Go的,使用Thrift作为IDL。
Thrift提供了工具,可以根据IDL编译生成服务端和客户端的代码:
- 对于服务端而言,我们只需要继承生成的Server类,然后实现具体的接口的内容即可。
- 客户端(即调用方),IDL可以生成Client类,方便的进行调用。
因此,一个接口的声明,不仅指导当前服务的实现,同时也是对上游服务的约定。因此一般公司会将所有服务的IDL文件统一维护。这样只需要知道服务名和接口声明,即可完成RPC服务的接入。
像Thrift这种IDL可以定义数据结构和接口,而有些IDL只可以定义数据结构。IDL生成的数据结构一般均支持序列化和反序列化,并且跨端、跨语言。这种本身不定义接口的IDL,也可以以string的方式搭配其他的RPC框架来使用(Thrift,gRPC等)。
这里我们主要介绍几种典型的IDL:JSON、ProtoBuf、Thrift。当然IDL还有XML、FlatBuffer、BSON等,感兴趣可以自行查阅。
几类常见的IDL
JSON
JSON,JavaScript Object Notation,这个大家应该都了解,结构简单,可读性好,一般在Web开发中最常用到,是RESTFul API的首选。
JSON只支持Object,Array和数值三种结构,Object和Array支持相互嵌套,标准的JSON的数值仅有:double/boolean/string这三种。以下是个例子:
{
"name": "miao",
"age": 18,
"skill": [
{
"name": "paint",
"level": 1
},
{
"name": "coding",
"level": 2
}
]
}
像C++的项目,一般直接使用RapidJSON这个库,他的性能是十分优秀的,并且支持拓展的数据类型。如果是纯C的项目,可以考虑cJSON,我曾经还提过MR
更多文章请关注《万象专栏》
转载请注明出处:https://www.wanxiangsucai.com/read/cv9195