本文转载自我自己的博客,感兴趣的老爷们可以关注~: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

更多文章请关注《万象专栏》