說說API與SDK的異同

看到文章 關於API和SDK的理解及二者區別 --做者 18037128621 , 文章很好.php

文章選題很逗引我爲此說些什麼, 深圳這幾天大雨, 閒着也是閒着,java

就寫一寫理一理, 算是向做者 18037128621 交流並致敬......node

0. 定義

原文做者做者 18037128621 , 寫得很好了, 引用以下python

SDK: 概念:軟件開發工具包(SDK,全稱:Software Development Kit) 通常都是一些軟件工程師爲特定的業務或功能軟件包 軟件框架、硬件平臺、操做系統等創建應用軟件時的開發工具的集合。android

API: 概念:API(Application Programming Interface,應用程序編程接口) 通常是指一些預先定義的函數,目的是提供應用程序與開發人員基於某軟件或硬件得以訪問一組例程的能力,而又無需訪問源碼,或理解內部工做機制的細節。c++

看圖, 一圖勝千言git

上圖中, 標藍1 的地方, 是 API , 標粉2的地方是 SDK , 黃3是中間件SDK與CDN 邊緣推流服務器的視頻流控github

這是一個不少年年之前, 說明電視機頂盒內部如何進行業務集成的示意圖:golang

  1. 左邊, 一個 xml portal 提供電視節目單 EPG API 服務, 一個 AAA 提供用戶認證/受權/鑑權服務API
  2. 中間, 是一個機頂盒( STB ), 中間有一個業務中間件, 提供了用戶相關功能與視頻流播放功能, 供給上面的視頻APK 使用. 這裏就提供了一箇中間件的開發 SDK ,爲何提供SDK呢---很簡單,商業利益,隱藏了用戶接口API中的加密機制, 隱藏了視頻快速播放的私密實現, 簡化第三方研發的集成複雜度, 以穩定的SDK, 給第三方機頂盒廠商接入到咱們的平臺,實現互聯網電視點播/直播/回看...等業務
  3. 右邊, CDN 提供直播/點播的推流服務, 是一個私有推流協議

1. API 詳細說明(外部調用/遠程調用)

API 通常來講, 是兩個網元之間, 一個被調用方( 習慣上稱爲服務端), 另外一個是調用方(習慣上稱爲客戶端) , 二者之間進行業務通信的業務/信令/數據的約定/規範web

換個方式說, API 基本上是兩個獨立部署的網元之間業務/功能進行外部調用關係的描述

通常來講, API 與開發語言無關 ( 而 SDK 與開發語言關聯性比較大), 只要 API 的服務端與客戶端能聽從 API 約定, 實現雙向通信並完成指定業務或功能.

通俗來講, 服務端研發開發服務端, 提供API 給客戶端研發, 由客戶端研發來實現客戶端, 與 API 文檔約定的服務端共同完成業務.

有興趣深刻的朋友, 能夠關注一下 IDD Interface Driven Design接口驅動 / IOC Inversion of Control控制反轉

_

_

API 的外在體現, 通常由兩部分構成

  1. API文檔或叫ICD 文檔, 也就是 interface control document 接口控制文檔/接口規範文檔, 該文檔通常定義了客戶端對服務端如何尋址, 採用什麼通信協議, 對指定業務如何組織通信數據並進行交互.

    API文檔是供咱們寫本身的客戶端應用的契約/規範文檔

  2. 實現 API 服務的服務主體, 也就是, 必須有一個或多個實現 API 被調用側的同類服務端, 提供了 API 描述的接口服務.

    API服務端是供咱們本身的客戶端調用 API 的服務端應用

_

_


例1

企業QQ開放平臺的 OAuth 2.0受權接口 , 企業QQ 在 RFC 6749 OAuth 2.0 規範下實現了基於 QQ 的企業受權API

  1. QQ開放平臺的OAuth API文檔在這裏
  2. 固然, 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合爲文檔,後是服務端服務,缺一不可):

  1. 通信協議, 是採用 TCP / HTTP / HTTP2 / websocket over HTTP / RTMP over UDP ......等等, 客戶端與服務端通信的傳輸協議
  2. 服務端與客戶端之間交互實現的功能或業務說明
  3. 服務端與客戶端之間, 進行某項功能或業務實現時, 相互的調用關係, 以及交互數據格式定義(及數據序列化/反序列化實現方式)

_

_


例如 gRPC 中的 protobuffers 定義文件, 能讓 java / python / golang / rust / nodeJS / php ... 兩兩之間實現 API 的服務與調用 ( API 與開發語言無關性 )

  1. gRPC 的通信協議是 HTTP2
  2. gRPC 的功能或業務, 在 .proto 中以 service 來定義, 說明誰調用誰, 實現什麼功能或業務( 注: gRPC 是雙向流式交互的 API )
  3. 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 的外在體現, 通常由幾部分構成(接口示例代碼及對應的代碼庫或連接庫是必須的)

  1. SDK 代碼庫或動態/靜態連接庫, 也就是說, SDK 包括有已經實現部分業務功能或基礎業務功能的代碼庫
  2. SDK 調用代碼示例, 通常來講, SDK 包含一些典型示範代碼, 告訴咱們如何調用 SDK特定的庫文件, 告訴咱們如何把 SDK 庫文件結合咱們寫的代碼編譯在一塊兒
  3. SDK 開發文檔, 也就是 Software Development document 軟件開發文檔, 該文檔通常定義了 SDK 軟件包中包含的業務或功能是如何被調用, 如何進行兩部分代碼之間的互爲調用, 從而在 SDK 代碼基礎上實現二次開發或上層開發.
  4. 輔助開發工具, 通常是基於這個 SDK 代碼庫基礎上的, 調試/跟蹤工具, 模擬測試工具, 代碼自動生成工具或檢查工具......等輔助提升開發便利性的小工具或輔助代碼段, 甚至在 SDK 基礎上, 還有緊密結合的IDE 集成開發環境. 例如 windows SDK有名的IDE --- visual studio , android SDK 那個基於 jetbrains idea 上的 android studio, apple的 macOS / ipadOS / IOS 上各SDK 的開發IDE--- xcode

特別注意:

SDK 中的代碼庫( 靜態/動態連接庫, 或是不推薦修改的開源代碼), 可能與某服務端, 某客戶端, 某硬件設備 如藍牙部件/調制解調器/音視頻編解碼芯片.....模塊進行通信, 以共同完成某些功能或業務

事實上, SDK 這個概念很是寬泛, 上面我描述到的, 只是比較簡單的我的總結性定義.

  1. 有兩點是基本統一的, 一是SDK 包含一個代碼庫或一個編譯後可供調用的連接庫, 二是SDK 多數狀況下, 也實現了某些API, 這些API 多是顯式, 也能夠是隱式的實現。
  2. 好比操做系統 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 )

_

_

tsingson 寫於中國深圳 小羅號口琴音樂中心, 2019/06/05

相關文章
相關標籤/搜索