看到文章 關於API和SDK的理解及二者區別 --做者 18037128621 , 文章很好.php
文章選題很逗引我爲此說些什麼, 深圳這幾天大雨, 閒着也是閒着,java
就寫一寫理一理, 算是向做者 18037128621 交流並致敬......node
原文做者做者 18037128621 , 寫得很好了, 引用以下python
SDK: 概念:軟件開發工具包(SDK,全稱:Software Development Kit) 通常都是一些軟件工程師爲特定的業務或功能軟件包
軟件框架、硬件平臺、操做系統等創建應用軟件時的開發工具的集合。android
API: 概念:API(Application Programming Interface,應用程序編程接口) 通常是指一些預先定義的函數,目的是提供應用程序與開發人員基於某軟件或硬件得以訪問一組例程的能力,而又無需訪問源碼,或理解內部工做機制的細節。c++
看圖, 一圖勝千言git
上圖中, 標藍1 的地方, 是 API , 標粉2的地方是 SDK , 黃3是中間件SDK與CDN 邊緣推流服務器的視頻流控github
這是一個不少年年之前, 說明電視機頂盒內部如何進行業務集成的示意圖:golang
API 通常來講, 是兩個網元之間, 一個被調用方( 習慣上稱爲服務端), 另外一個是調用方(習慣上稱爲客戶端) , 二者之間進行業務通信的業務/信令/數據的約定/規範web
換個方式說, 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
RPC(Remote Procedure Call)—遠程過程調用中的 IDL 接口定義語言(Interface Definition Language) , 是最典型的 API 案例
在 RPC 中的 IDL 最完整,最規範的定義了 API 中服務端/客戶端( 或互爲服務端/客戶端的雙向流式通信交互) 中的數據與交互方式
API文檔/或叫ICD文檔, 通常包括3個部分(前2合爲文檔,後是服務端服務,缺一不可):
_
_
例如 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文檔爲契約, 供咱們寫本身的客戶端應用, 並遠程調用服務端實現業務功能的接口
_
_
看了上面的 API 描述, 那麼, SDK 就簡單了:
SDK 就是一個"本地"獨立應用的開發包, 供給開發人員在此開發包基礎上, 開發一個獨立應用.
換外方式說, SDK 的核心是一個被同一應用其餘新增代碼"內部調用"的軟件包, 例如, 一個DLL 動態鏈接庫
這個新增代碼, 通常叫二次開發/上層開發/業務或功能擴展開發, SDK 最終是與在sdk上開發的代碼, 合併編譯在一塊兒
_
_
SDK 通常分爲:
換個方式說, SDK 基本上是一個獨立部署的網元內部, 相互調用的兩部分代碼/函數/庫之間的業務或功能函數, 以及相互之間的函數調用關係
_
_
多數狀況下, SDK 與開發語言相對比較緊密的結合在一塊兒
好比某某的 C++ SDK 便是表示這是供 C++ 調用的一個開發動態或靜態連接庫. 好比說, SDK提供了c++ 調用示例代碼, 以及供C++編譯使用的CPP頭文件, 編譯時靜態連接庫或動態調用庫.
SDK 的外在體現, 通常由幾部分構成(接口示例代碼及對應的代碼庫或連接庫是必須的)
特別注意:
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歲左右拍攝的我, 我頭上頂着孩子的手工做品, (我加了兩個圖標)
背景牆上是女兒3歲之前的塗鴉, 家裏全部的牆面被重複又重複畫過不少次...
至今天,女兒從出生到如今,陪伴着孩子每一天快樂繪畫塗鴉,攝影,旅行,越野...
我保存了 8年多來女兒大部分的塗鴉/攝影.....這是我近10年最快樂的時光!
網名 tsingson (三明智, 江湖人稱3爺)
原 ustarcom IPTV/OTT 事業部播控產品線技術架構溼/解決方案工程溼角色(8年), 自由職業者,
喜歡音樂(口琴,是第三/四/五屆廣東國際口琴嘉年華的主策劃人之一), 攝影與越野,
喜歡 golang 語言 (商用項目中主要用 postgres + golang )
_
_