雲計算

聽說,阿里雲給它的 OpenAPI 開發了一套編程語言

記得點擊上方“雲原生之路”關注哦

OpenAPI

熟悉公有云的同學對 OpenAPI 都不會陌生,OpenAPI 可以稱之為公有云與用戶之間的一座橋樑。直接使用公有云的大多是技術人員,而對於技術人員,尤其是開發者來說,往往並不滿足於只使用 Web UI 界面來與公有云交互,尤其是當使用的公有云產品日益增多時。由於 Web UI 是面向全體用戶設計,並不能滿足用戶的全部需求。這時 OpenAPI 就出現了,用戶通過 OpenAPI 將自己的系統直接對接公有云,並根據自己的使用場景和需求進行設計,開發出一套滿足自己需求的公有云管理系統或流程,這樣既提高了用戶本身的自動化水平,還降低了誤操作帶來的風險。

背景

最早的 OpenAPI 往往是雲廠商開放出來的一系列 RESTful API 接口,用戶需要根據接口要求自己封裝認證方法、傳入參數,但是由於部分 OpenAPI 並不是 RESTful 風格、產品升級導致的接口參數變化、文檔更新不及時等問題,導致雲廠商開始尋求新的解決辦法。SDK 就是一種解決辦法,通過雲廠商自己封裝的 SDK,可以提高用戶體驗並屏蔽部分直接使用 OpenAPI 帶來的麻煩,但是隨著雲產品的增加,需要開發的 SDK 越來越多,並且由於 SDK 往往是多語言的,雲廠商需要投入大量人手來維護這些 SDK,導致某些產品由於人力資源有限並沒有提供 SDK 或者 SDK 語言不全。

在這種背景下,阿里雲的同學提出了一種新辦法:他們重新定義了一門 DSL 語言 Darabonba 來描述各種各樣的 OpenAPI,就如題目所說給 OpenAPI 開發了一種編程語言,從某種程度上來說,可以稱之為:OpenAPI as code

Darabonba

Darabonba(原名 TeaDSL),是一種 OpenAPI 應用的領域特定語言。可以利用它為任意風格的接口生成多語言的 SDK、代碼示例、測試用例、接口編排等。

Darabonba 設計理念

在筆者看來,操作雲產品的功能是開發者的目的,而 OpenAPI 是實現這個目的的手段,SDK 則簡化了這種手段,Darabonba 的作用則降低了開發 SDK 的成本,並提高了開發 SDK 的速度,對雲廠商的效率會有非常明顯的提升。同時 Darabonba 也為使用多種編程語言的團隊提供了一條捷徑,原先需要每種編程語言都要出人來參加 OpenAPI 的集成,現在只需要公有云維護團隊出一名或幾名同學即可完成全語言 SDK 的生成。而如果公司本身有需要開發大量的 OpenAPI,甚至可以直接使用 Darabonba,開發符合自己系統 OpenAPI 的工具,Darabonba 目前已經開源,使用 Apache-2.0 LICENSE

組件

Darabonba 目前支持:JavaC#TypeScriptPHPGolangPython 代碼的生成,除了解析器和多語言生成器,還提供了:

  • VS Code 插件:提供語法高亮、代碼提示、代碼格式化、語法檢查等功能。
  • CLI:命令行工具,快速在本地拉起一個 Darabonba 項目。
  • Darabonba 模塊倉庫:模塊倉庫,提供 Darabonba 模塊的發佈和下載。

Darabonba 語言優勢

  • 更寬泛的風格支持:支持 RESTful 風格的 OpenAPI,及其他所有基於 HTTP 協議的 OpenAPI。對非 RESTful 風格的 OpenAPI 更友好。
  • 編程邏輯化:將 OpenAPI 從元數據定義走向編程化,封裝複雜的 HTTP 處理過程為簡單的方法接口。
  • 運行時事務性支持:支持配置或設置 OpenAPI 的冪等、重試、超時、退避,將複雜的 OpenAPI 調用過程收斂在方法中。

快速上手

下圖可以看到完整的 Darabonba 運行流程,現在我們就來快速製作一套 Code Sample 吧。

Darabonba flow

安裝

阿里雲提供了Darabonba 的 Web UI 界面,但是在網頁上不好調試,我們選擇本地安裝 CLI 命令行工具。

# Darabonba CLI 是由 Node.js 開發的,使用 npm 來安裝
$ npm install -g @darabonba/cli

構建 Darabonba 模塊

我們假設要創建一個模塊為 sample_ecs,用來生成查詢 ECS 信息的 SDK 代碼。首先創建一個目錄:

$ mkdir sample_ecs
$ cd sample_ecs

初始化模塊,輸入相關信息:

$ dara init
package scope: guoxudong.io
package name: sample_ecs
package version: 0.0.1
main entry: main.dara

完成初始化後,會新建 2 個文件:

  • Darafile:包描述文件
  • main.dara:入口文件

安裝 VS Code 插件

打開 VS Code,按 F1Ctrl + Shift + P 打開命令面板,選擇 Install Extension 並輸入 darabonba

或啟動VS Code 快速打開(Ctrl + P),粘貼以下命令,然後按 Enter。

ext install darabonba.darabonba

之後就可以使用語法高亮、代碼提示、代碼格式化、語法檢查等功能了。

代碼高亮

安裝依賴模塊

首先需要設置依賴倉庫地址:

$ dara config set registry https://darabonba.api.aliyun.com

之後就是將依賴寫入 Darafile 中:

{
  "scope": "guoxudong.io",
  "name": "sample_ecs",
  "version": "0.0.1",
  "main": "main.dara",
  "libraries": {
    "Console": "darabonba:Console:*",
    "ECS": "alibabacloud:Ecs20140526:*",
    "RPC": "alibabacloud:RPC:*",
    "Util": "darabonba:Util:*"
  },
  "java": {
    "package": "aliyun.com.alibabacloud.sample"
  },
  "csharp": {
    "namespace": "Alibabacloud.Sample"
  },
  "php": {
    "package": "Alibabacloud.Sample"
  },
  "python": {
    "package": "alibabacloud_sample"
  }
}

這裡引入了4個模塊:

  • Console:打印輸出模塊
  • ECS:ECS 模塊
  • RPC:RPC Client 模塊
  • Util:工具模塊

值得注意的的是 libraries 中內容的 key,就是 .dara 文件中 import 導入依賴的名稱,所以這裡可以將 key 修改為好理解的值,然後 import 相應值就可以了。

修改完 Darafile 之後,安裝這些依賴:

$ dara install

之後就可以看到多了一個 .libraries.json 文件和一個 libraries 目錄,需要的所有依賴模塊就都已經安裝好了。

查看模塊內容

更多的模塊,可在模塊倉庫中搜索。這裡以 ECS 模塊為例

ECS 模塊

可以在 Detail 中看到所有可以調用的接口,通過還可以點擊其他 tab 可以查看版本、安裝方法等內容:

安裝方法

也可通過命令單獨安裝模塊:

$ dara install alibabacloud:Ecs20140526

代碼編寫

現在就可以編寫 Darabonba 代碼了,Darabonba 代碼的整體風格偏向於 Java,不是很難懂,這裡貼上一段簡單的代碼:

import ECS;
import RPC;
import Util;
import Console;

/**
* Initialization  初始化公共請求參數
*/
static function Initialization(regionId: string)throws : ECS{

    var config = new RPC.Config{};
    // 您的AccessKey ID
    config.accessKeyId = "<accessKeyId>";
    // 您的AccessKey Secret
    config.accessKeySecret = "<accessKeySecret>";
    // 您的可用區ID
    config.regionId = regionId;

    return new ECS(config);
}

/**
* DescribeZones    查詢一個阿里雲地域下的可用區
*/
static async function DescribeZones(client: ECS, regionId: string)throws: void{
    var req = new ECS.DescribeZonesRequest{};
    // 可用區所在的地域ID。您可以調用DescribeRegions查看最新的阿里雲地域列表
    req.regionId = regionId;
    // 根據漢語、英語和日語篩選返回結果。更多詳情,請參見RFC7231
    // 取值範圍:
    // zh-CN
    // en-US
    // ja
    // 默認值:zh-CN。
    req.acceptLanguage = "zh-CN";
    var resp = client.describeZones(req);
    Console.log("--------------------查詢地域下的可用區--------------------");
    Console.log(Util.toJSONString(resp));
}


static async function main(args: [string]) throws: void {
    // 可用區域Id (請自行配置)
    var regionId = "<regionId>";

    var client = Initialization(regionId);

    // 查詢阿里雲地域下的可用區
    DescribeZones(client, regionId)
}

這個代碼註釋很完善,這裡就不多講解了,本示例在官網有完整示例,有興趣的同學可以研究一下。而 Darabonba 的文檔,可以在 Github 上找到。

代碼生成

現在就可以生成代碼了,下面以生成 Python 代碼為例,執行命令:

$ dara codegen python ./tmp

命令執行成功後,就可以看到 Python 代碼已經生成了:

生成結果

如果代碼還沒有寫完,想檢查是否有語法錯誤,可以使用 check 命令檢查:

$ dara check main.dara
Check success !

到這我們的代碼就生成成功了,但是這還不是結束,我們需要去測試一下生成的代碼能否正常運行,在實踐中就出現過代碼生成成功,但是運行報錯的情況。

如果生成的是 Python 代碼,這裡推薦使用 Python 3.6,經測 3.8 版本不支持 sdk 的一些語法。

同樣的,也可以在 OpenAPI Explorer Code Sample,通過 Web UI 來生成代碼,除了調試速度比較慢之外,其餘體驗都十分不錯。

Code Sample

Code Sample 全民賽碼

最近阿里雲還推出了這麼一個比賽,看了下獎品有機械鍵盤、無人機、雙肩包和內推資格,有興趣的同學可以關注一下,還是挺好玩的:傳送門

阿里雲開放平臺攜手開發者社區、內容設計部,聯合舉辦“OpenAPI 開發者挑戰賽第三期—— CodeSample 全民賽碼 ”,面向數萬開發者,招募阿里雲 OpenAPI 示例代碼(CodeSample)。無論您是入門開發,或是運維大神,無論是利用 OpenAPI 解決一個輕量場景,或是滿足一個小功能,通通到碗裡來!

結語

在這個項目叫 TeaDSL 的時候筆者就開始關注 Darabonba 了,由於筆者是 OpenAPI SDK 的重度使用用戶,之前開發的 devops 平臺以及 cms-grafana-builder 項目都大量使用了阿里雲 SDK。在4月份看到樸靈的《TeaDSL:支持任意 OpenAPI 網關的多語言 SDK 方案》時,認為其只是解決雲廠商 OpenAPI 開發的多語言困局,提升研發效率,和 OpenAPI 的使用者關係不大。但是在這次進行深入研究之後發現,Darabonba 甚至可以用來生成自己系統的 OpenAPI 多語言 SDK,並不是只能用於生成阿里雲的 SDK,非常的驚豔。

Leave a Reply

Your email address will not be published. Required fields are marked *