看到文章 关于API和SDK的理解及两者区别 --作者 18037128621 , 文章很好.
文章选题很逗引我为此说些什么, 深圳这几天大雨, 闲着也是闲着,
就写一写理一理, 算是向作者 18037128621 交流并致敬......
0. 定义
原文作者作者 18037128621 , 写得很好了, 引用如下
SDK: 概念:软件开发工具包(SDK,全称:Software Development Kit) 一般都是一些软件工程师为特定的业务或功能软件包
软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。
API: 概念:API(Application Programming Interface,应用程序编程接口) 一般是指一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
看图, 一图胜千言
上图中, 标蓝1 的地方, 是 API , 标粉2的地方是 SDK , 黄3是中间件SDK与CDN 边缘推流服务器的视频流控
这是一个很多年年以前, 说明电视机顶盒内部如何进行业务集成的示意图:
- 左边, 一个 xml portal 提供电视节目单 EPG API 服务, 一个 AAA 提供用户认证/授权/鉴权服务API
- 中间, 是一个机顶盒( STB ), 中间有一个业务中间件, 提供了用户相关功能与视频流播放功能, 供给上面的视频APK 使用. 这里就提供了一个中间件的开发 SDK ,为什么提供SDK呢---很简单,商业利益,隐藏了用户接口API中的加密机制, 隐藏了视频快速播放的私密实现, 简化第三方研发的集成复杂度, 以稳定的SDK, 给第三方机顶盒厂商接入到我们的平台,实现互联网电视点播/直播/回看...等业务
- 右边, CDN 提供直播/点播的推流服务, 是一个私有推流协议
1. API 详细说明(外部调用/远程调用)
API 一般来说, 是两个网元之间, 一个被调用方( 习惯上称为服务端), 另一个是调用方(习惯上称为客户端) , 两者之间进行业务通讯的业务/信令/数据的约定/规范
换个方式说, API 基本上是两个独立部署的网元之间业务/功能进行外部调用关系的描述
一般来说, API 与开发语言无关 ( 而 SDK 与开发语言关联性比较大), 只要 API 的服务端与客户端能遵从 API 约定, 实现双向通讯并完成指定业务或功能.
通俗来说, 服务端研发开发服务端, 提供API 给客户端研发, 由客户端研发来实现客户端, 与 API 文档约定的服务端共同完成业务.
有兴趣深入的朋友, 可以关注一下 IDD Interface Driven Design接口驱动 / IOC Inversion of Control控制反转
_
_
API 的外在体现, 一般由两部分构成
-
API文档或叫ICD 文档, 也就是 interface control document 接口控制文档/接口规范文档, 该文档一般定义了客户端对服务端如何寻址, 采用什么通讯协议, 对指定业务如何组织通讯数据并进行交互.
API文档是供我们写自己的客户端应用的契约/规范文档
-
实现 API 服务的服务主体, 也就是, 必须有一个或多个实现 API 被调用侧的同类服务端, 提供了 API 描述的接口服务.
API服务端是供我们自己的客户端调用 API 的服务端应用
_
_
例1
企业QQ开放平台的 OAuth 2.0授权接口 , 企业QQ 在 RFC 6749 OAuth 2.0 规范下实现了基于 QQ 的企业授权API
- QQ开放平台的OAuth API文档在这里
- 当然, QQ企业平台提供了对应的 OAuth API 服务部署, 以供调用
注意, QQ 的 OAuth API 实现, 与 RFC 6749有一些细微的实现上的差别
例2
必应 Web 搜索 API 这是 M$ 提供的 bing 搜索API
2. API 的典型例子
RPC(Remote Procedure Call)—远程过程调用中的 IDL 接口定义语言(Interface Definition Language) , 是最典型的 API 案例
在 RPC 中的 IDL 最完整,最规范的定义了 API 中服务端/客户端( 或互为服务端/客户端的双向流式通讯交互) 中的数据与交互方式
API文档/或叫ICD文档, 一般包括3个部分(前2合为文档,后是服务端服务,缺一不可):
- 通讯协议, 是采用 TCP / HTTP / HTTP2 / websocket over HTTP / RTMP over UDP ......等等, 客户端与服务端通讯的传输协议
- 服务端与客户端之间交互实现的功能或业务说明
- 服务端与客户端之间, 进行某项功能或业务实现时, 相互的调用关系, 以及交互数据格式定义(及数据序列化/反序列化实现方式)
_
_
例如 gRPC 中的 protobuffers 定义文件, 能让 java / python / golang / rust / nodeJS / php ... 两两之间实现 API 的服务与调用 ( API 与开发语言无关性 )
- gRPC 的通讯协议是 HTTP2
- gRPC 的功能或业务, 在 .proto 中以 service 来定义, 说明谁调用谁, 实现什么功能或业务( 注: gRPC 是双向流式交互的 API )
- gRPC 默认的数据格式定义采用 protobuffers (即是API中通讯交互数据定义也是序列化/反序列化的具体实现方式), 在 .proto 中分别定义 request / response , 用 proto3 中的 message 来具体定义
_
_
API 就是以 API文档为契约, 供我们写自己的客户端应用, 并远程调用服务端实现业务功能的接口
_
_
3. SDK 的详细说明(内部调用/本地调用)
看了上面的 API 描述, 那么, SDK 就简单了:
SDK 就是一个"本地"独立应用的开发包, 供给开发人员在此开发包基础上, 开发一个独立应用.
换外方式说, SDK 的核心是一个被同一应用其他新增代码"内部调用"的软件包, 例如, 一个DLL 动态连接库
这个新增代码, 一般叫二次开发/上层开发/业务或功能扩展开发, SDK 最终是与在sdk上开发的代码, 合并编译在一起
_
_
SDK 一般分为:
- 服务端SDK, 帮助开发一个服务端应用
- 客户端SDK, 帮助开发一个客户端应用
- 硬件"驱动"SDK, 帮助开发一个基于某个特定硬件之上的应用或服务
换个方式说, SDK 基本上是一个独立部署的网元内部, 相互调用的两部分代码/函数/库之间的业务或功能函数, 以及相互之间的函数调用关系
_
_
多数情况下, SDK 与开发语言相对比较紧密的结合在一起
比如某某的 C++ SDK 即是表示这是供 C++ 调用的一个开发动态或静态链接库. 比如说, SDK提供了c++ 调用示例代码, 以及供C++编译使用的CPP头文件, 编译时静态链接库或动态调用库.
SDK 的外在体现, 一般由几部分构成(接口示例代码及对应的代码库或链接库是必须的)
- SDK 代码库或动态/静态链接库, 也就是说, SDK 包括有已经实现部分业务功能或基础业务功能的代码库
- SDK 调用代码示例, 一般来说, SDK 包含一些典型示范代码, 告诉我们如何调用 SDK特定的库文件, 告诉我们如何把 SDK 库文件结合我们写的代码编译在一起
- SDK 开发文档, 也就是 Software Development document 软件开发文档, 该文档一般定义了 SDK 软件包中包含的业务或功能是如何被调用, 如何进行两部分代码之间的互为调用, 从而在 SDK 代码基础上实现二次开发或上层开发.
- 辅助开发工具, 一般是基于这个 SDK 代码库基础上的, 调试/跟踪工具, 模拟测试工具, 代码自动生成工具或检查工具......等辅助提高开发便利性的小工具或辅助代码段, 甚至在 SDK 基础上, 还有紧密结合的IDE 集成开发环境. 例如 windows SDK有名的IDE --- visual studio , android SDK 那个基于 jetbrains idea 上的 android studio, apple的 macOS / ipadOS / IOS 上各SDK 的开发IDE--- xcode
特别注意:
SDK 中的代码库( 静态/动态链接库, 或是不推荐修改的开源代码), 可能与某服务端, 某客户端, 某硬件设备 如蓝牙部件/调制解调器/音视频编解码芯片.....模块进行通讯, 以共同完成某些功能或业务
事实上, SDK 这个概念非常宽泛, 上面我描述到的, 只是比较简单的个人总结性定义.
- 有两点是基本统一的, 一是SDK 包含一个代码库或一个编译后可供调用的链接库, 二是SDK 多数情况下, 也实现了某些API, 这些API 可能是显式, 也可以是隐式的实现。
- 比如操作系统 Windows有Windows SDK,DirectX 有 DirectX 9 SDK,.NET开发也有Microsoft .NET Framework SDK。JAVA开发也不含糊,也有自己的Java SDK。 Java SDK最早叫Java Software Develop Kit,后来改名为JDK,即Java Develop Kit。JDK作为Java开发工具包,主要用于构建在Java平台上运行的应用程序、Applet 和组件等。
5. API 与 SDK 的关联与区别
_
_
待续.......
_
_
题图说明
题图是我女儿5岁左右拍摄的我, 我头上顶着孩子的手工作品, (我加了两个图标)
背景墙上是女儿3岁以前的涂鸦, 家里所有的墙面被重复又重复画过很多次...
至今天,女儿从出生到现在,陪伴着孩子每一天快乐绘画涂鸦,摄影,旅行,越野...
我保存了 8年多来女儿大部分的涂鸦/摄影.....这是我近10年最快乐的时光!
关于我
网名 tsingson (三明智, 江湖人称3爷)
原 ustarcom IPTV/OTT 事业部播控产品线技术架构湿/解决方案工程湿角色(8年), 自由职业者,
喜欢音乐(口琴,是第三/四/五届广东国际口琴嘉年华的主策划人之一), 摄影与越野,
喜欢 golang 语言 (商用项目中主要用 postgres + golang )
_
_