天天看點

Darabonba 場景化 CodeSample 編寫指南如何建立 CodeSample 項目使用 Darabonba 編寫 CodeSample

Darabonba 場景化 CodeSample 編寫指南如何建立 CodeSample 項目使用 Darabonba 編寫 CodeSample
Darabonba

是阿裡雲緻力于更好的描述 OpenAPI 而開發的特定領域程式設計語言,不僅可以相容多網關、描述任意風格的 OpenAPI,并且可通過編寫 Darabonba 的檔案自動化生成多語言的 SDK,是節省開發成本的不二之選。由于 Darabonba 具備程式設計的靈活性,是以不僅能為 OpenAPI 生成 SDK 還可以通過 Darabonba 編寫關于 SDK 中OpenAPI 使用的場景化 CodeSample,為 SDK 的使用者提供了最為實用的指導。本篇文章将通過三個示例循序漸進的幫助大家生成屬于自己的 CodeSample。

如何建立 CodeSample 項目

首先,我們可以點選本次

Code Sample 全民賽碼

挑戰賽的首頁面,點選下面的快速開始:

Darabonba 場景化 CodeSample 編寫指南如何建立 CodeSample 項目使用 Darabonba 編寫 CodeSample

這裡沒有登入的同學可能需要使用阿裡雲賬号登入,在登陸成功後即可跳轉到 CodeSample 項目建立頁面,這裡隻需要填寫本次 CodeSample 的項目标題和描述即可,其他的資訊已經填寫好了包括等會兒需要用的 Console 子產品,在依賴庫中也幫大家預設填寫了,是以在輸入了标題後描述後直接點選下一步就好了:

Darabonba 場景化 CodeSample 編寫指南如何建立 CodeSample 項目使用 Darabonba 編寫 CodeSample

在第二步的頁面中,可以看到下面編輯框中已經為大家準備好了一段可以生成各語言的初始代碼,大家可以通過修改字元串并點選編輯框下方的檢視生成代碼來感受通過 Darabonba 生成的各語言代碼,最後可以通過送出來儲存這段代碼:

Darabonba 場景化 CodeSample 編寫指南如何建立 CodeSample 項目使用 Darabonba 編寫 CodeSample

在儲存成功後,會跳轉到我的示例清單頁面中,通過點選下面的詳情按鈕,我們就可以進入這個 CodeSample 項目的詳情頁面了:

Darabonba 場景化 CodeSample 編寫指南如何建立 CodeSample 項目使用 Darabonba 編寫 CodeSample

在詳情頁面中,我們可以通過編輯按鈕,再次編輯我們之前用 Darabonba 編寫的 Hello,World 文檔,在編輯完成并成功儲存後,就可以點選釋出新版本的按鈕将寫好的 CodeSample 代碼送出到 Code Sample 全民賽碼 參加評比了(評委會以每個項目的最後一次送出代碼為準)。

Darabonba 場景化 CodeSample 編寫指南如何建立 CodeSample 項目使用 Darabonba 編寫 CodeSample

使用 Darabonba 編寫 CodeSample

Darabonba快速上手

Darabonba作為一門描述性語言,也有自己簡單易用的文法,為了友善大家學習 Darabonba ,這裡我們為大家提供了

5分鐘上手 Darabonba 指南

和詳細的

Darabonba 語言使用文檔

。而下面我們會通過兩個示例為大家示範如何 Darabonba 編寫 CodeSample 正确打開方式。

單個API的 CodeSample

當然,如果隻是送出 Hello,World 文檔是不能獲得大賽獎品的,Darabonba 的 CodeSample 代碼是為OpenAPI SDK 服務的,是以我們下面将通過為一個 OpenAPI 寫CodeSample來為大家描寫一個示例。

首先需要再建立一個API的項目,這裡我們在依賴庫中會加入我們将要編寫 CodeSample 所對應的 SDK 子產品,相關子產品可以直接點選右側邊欄中的子產品倉庫,通過倉庫可以尋找到雲産品的 SDK 子產品:

Darabonba 場景化 CodeSample 編寫指南如何建立 CodeSample 項目使用 Darabonba 編寫 CodeSample

我們選取阿裡雲的短信服務的 SDK 子產品

alibabacloud:

Dysmsapi20170525

來編寫其對應的CodeSample,首先我們進入子產品的詳情頁面;在詳情頁面中,我們可以看到這個SDK 相關的一些跟 OpenAPI 請求相關的方法和定義了入參、出參的 Model。這裡我們選取最為經典發送短信的

`

SendSms

方法來編寫相關 CodeSample ,并可以點選其對應的入參類型

SendSmsRequest

和出參類型

SendSmsResponse

`

來了解其如何使用,其中在入參中标記紅星的為必選參數。

Darabonba 場景化 CodeSample 編寫指南如何建立 CodeSample 項目使用 Darabonba 編寫 CodeSample
Darabonba 場景化 CodeSample 編寫指南如何建立 CodeSample 項目使用 Darabonba 編寫 CodeSample

在對這個方法有一定的了解以後我們就接着來建立我們的項目,這次跟上次最大的差別就是:在依賴庫中我們需要填入

Dysmsapi20170525

相關的依賴。

Darabonba 場景化 CodeSample 編寫指南如何建立 CodeSample 項目使用 Darabonba 編寫 CodeSample

而在下一步中,我們就可以在代碼中使用到 SDK 相關的子產品編寫其 CodeSample了:

import Dysmsapi;
import RPC;
import Console;

// 使用AK&SK初始化賬号Client  
static function createClient (accessKeyId : string , accessKeySecret : string , regionId : string) : Dysmsapi{
    var config = new RPC.Config{};
    config.accessKeyId = accessKeyId;
    config.accessKeySecret = accessKeySecret;
    config.regionId = regionId;

}

static async function main(args: [string]): void {
    var client = createClient("accessKeyId","accessKeySecret","regionId");
    var request = new Dysmsapi.SendSmsRequest{
        phoneNumbers= "13888888888",
        // 短信簽名名稱。請在控制台簽名管理頁面簽名名稱一列檢視。  
        signName= "aliyun",
        // 短信模闆ID。請在控制台模闆管理頁面模闆CODE一列檢視。
        templateCode = "SMS_153055065",  
    };
    var response = client.sendSms(request);
    Console.log(response.message);
}           

通過檢視生成代碼,确定生成無誤以後,我們就可以儲存該 CodeSample 并通過上面介紹的在詳情頁面中直接點選釋出新版本送出該 CodeSample 了。

完整的場景化 CodeSample

在了解了如何通過 Darabonba 的生态來程式設計實作多語言 CodeSample 以後,接下來我們就來做一件挑戰的事情,就是通過組合多個 API 形成一個場景,這裡我們以阿裡雲容器服務的 OpenAPI 為例實作一個,從 建立叢集->檢視叢集狀态->擴容叢集->檢視叢集節點狀态->删除節點的示例。

首先還是建立一個項目,在依賴項中這次我們要用到倉庫中容器服務相關的 SDK 子產品:

Darabonba 場景化 CodeSample 編寫指南如何建立 CodeSample 項目使用 Darabonba 編寫 CodeSample

通過引入對應的子產品,我們就可以通過使用這些子產品中對應的方法來實作上述的流程了,再加上相應的注釋,一個完成的 CodeSample 示例就完成了,代碼如下:

import CS;
import ROA;
import Util;
import Console;

/**
 * 使用AK&SK初始化賬号Client
 * @param accessKeyId
 * @param accessKeySecret
 * @param regionId
 * @param endpoint
 * @return Client
 * @throws Exception
 */  
 static async function createClient (accessKeyId : string , accessKeySecret : string , regionId : string)throws : CS{
    var config = new ROA.Config{};
    // 您的AccessKey ID
    config.accessKeyId = accessKeyId;
    // 您的AccessKey Secret
    config.accessKeySecret = accessKeySecret;
    // 您的可用區ID
    config.regionId = regionId;
    return new CS(config);
}

/**
 * 建立叢集
 * @param client
 * @return CreateClusterResponse
 * @throws Exception
 */
static async function createCluster (client: CS)throws :  CS.CreateClusterResponse{
    var createClusterRequestBody = new CS.CreateClusterBody{
      // 失敗是否復原
      disableRollback=true,
      // 叢集名稱
      name="my-test-Kubernetes-cluster",
      // 叢集建立逾時時間
      timeoutMins=60,
      // 叢集類型,ManagedKubernetes
      clusterType="ManagedKubernetes",
      // 地域
      regionId="cn-beijing",
      // VPC ID
      vpcid="vpc-2zegvl5etah5requ0****",
      // 容器POD CIDR
      containerCidr="172.20.0.0/16",
      // 服務CIDR
      serviceCidr="172.21.0.0/20",
      // 是否開放公網SSH登入
      sshFlags=false,
      // 是否安裝雲監控插件
      cloudMonitorFlags=false,
      // 節點SSH登入密碼,和key_pair二選一
      loginPassword="Test_1234",
      // Worker節點付費類型PrePaid|PostPaid
      workerInstanceChargeType="PostPaid",
      // Worker執行個體規格多執行個體規格參數
      workerInstanceTypes=["ecs.sn2.3xlarge"],
      // 一台或多台虛拟交換機 ID,N 的取值範圍為 [1, 5]
      workerVswitchIds=["vsw-2ze48rkq464rsdts****"],
      // Worker系統盤類型
      workerSystemDiskCategory="cloud_efficiency",
      // Worker節點系統盤大小
      workerSystemDiskSize=120,
      // Worker節點數
      numOfNodes=3,
      // 是否配置SNATEntry
      snatEntry=true,
      // 是否公網暴露叢集endpoint
      endpointPublicAccess=false,
      // 節點端口範圍,預設30000-65535
      nodePortRange="30000-32767",
      // 網絡模式, 可選值iptables|ipvs
      proxyMode="iptables",
      // 是否開啟叢集删除保護,防止通過控制台或api誤删除叢集
      deletionProtection=true,
      // 運作pod的主機的作業系統類型,例如:linux,Windows等
      osType="linux",
    };
    var createClusterReq = new CS.CreateClusterRequest{
      body=createClusterRequestBody
    };
    return client.createCluster(createClusterReq);

}

/**
 * 查詢叢集狀态
 * @param client
 * @param clusterId
 * @return DescribeClusterDetailResponse
 * @throws Exception
 */
static async function describeClusterDetail (client: CS, clusterId: string)throws : CS.DescribeClusterDetailResponse{
    var describeClusterDetailReq = new CS.DescribeClusterDetailRequest{};
    return client.describeClusterDetail(clusterId,describeClusterDetailReq);
}

/**
 * 擴容
 * @param client
 * @param clusterId
 * @return ScaleOutClusterResponse
 * @throws Exception
 */
static async function scaleOutCluster (client: CS, clusterId: string) throws : CS.ScaleOutClusterResponse{
    var scaleOutClusterRequestBody = new CS.ScaleOutClusterBody{
        // keypair名稱,和login_password 二選一
        keyPair="common",
        // 一台或多台虛拟交換機 ID,N 的取值範圍為 [1, 3]
        vswitchIds=["vsw-uf684tfrpwup8gcsw****"],
        // Worker執行個體規格多執行個體規格參數
        workerInstanceTypes=["ecs.c5.xlarge"],
        // Worker系統盤類型
        workerSystemDiskCategory="cloud_efficiency",
        // Worker節點系統盤大小
        workerSystemDiskSize=120,
        // 是否挂載資料盤 true|false
        workerDataDisk=false,
        // 擴容的數量
        count=10,
    };
    var scaleOutClusterReq = new CS.ScaleOutClusterRequest{
        body=scaleOutClusterRequestBody
    };

    return client.scaleOutCluster(clusterId,scaleOutClusterReq);
}

/**
 * 查詢節點,子賬号AK通路會報權限錯誤
 * @param client
 * @param clusterId
 * @return DescribeClusterNodesResponse
 * @throws Exception
 */
static async function describeClusterNodes (client: CS, clusterId: string) throws : CS.DescribeClusterNodesResponse{
    var describeClusterNodesRequestQuery = new CS.DescribeClusterNodesQuery{
        // 可選 每頁顯示條數
        pageSize="18",
        // 可選 頁碼數
        pageNumber="1",
        // 可選 nodepool_id
        nodepoolId="nodepool_id",
        // 狀态 
        state="running",
    };
    var describeClusterNodesReq = new CS.DescribeClusterNodesRequest{
      query=describeClusterNodesRequestQuery
    };

    return client.describeClusterNodes(clusterId,describeClusterNodesReq);
}

/**
 * 移除節點
 * @param client
 * @param clusterId
 * @return DeleteClusterNodesResponse
 * @throws Exception
 */
static async function deleteClusterNodes (client: CS, clusterId: string, instanceId: string) throws : CS.DeleteClusterNodesResponse{
    var deleteClusterNodesBody = new CS.DeleteClusterNodesBody{
        //要移除的node_name數組
        nodes=[ instanceId ],
        //是否同時釋放ecs節點
        releaseNode="false"
    };
    var deleteClusterNodesReq = new CS.DeleteClusterNodesRequest{
        body=deleteClusterNodesBody
    };

    return client.deleteClusterNodes(clusterId, deleteClusterNodesReq);
}

static async function main(args: [string]): void {
    // 1. 初始化用戶端
    var client = createClient("accessKeyId","accessKeySecret","regionId");

    // 2. 建立叢集
    var createClusterRes = createCluster(client);
    var clusterId = createClusterRes.body.clusterId;
    
    // 3. 查詢叢集狀态
    var describeClusterDetailRes = describeClusterDetail(client, clusterId);

    // 4. 當叢集狀态為“running” 時 進行擴容
    if(Util.equalString(describeClusterDetailRes.body.state, "running")) {
      var scaleClusterRes = scaleOutCluster(client, clusterId);
      Console.log(scaleClusterRes.body.requestId);
    }
    // 5. 查詢節點
    var describeClusterNodesRes = describeClusterNodes(client, clusterId);
    var describeClusterNodesResHeaders = describeClusterNodesRes.headers;
    var node = describeClusterNodesRes.body.nodes[0];
    var instanceId = node.instanceId;
    
    // 6. 移除節點
    var deleteClusterNodesRes = deleteClusterNodes(client, clusterId, instanceId);
    Console.log(deleteClusterNodesRes.body.requestId);
    
}           

繼續閱讀