【Serverless】快速集成雲函數HarmonyOS

1、學習目標

什麼是AppGallery Connect雲函數

雲函數是一項Serverless計算服務,提供FaaS(Function as a Service)能力,可以幫助開發者大幅簡化應用開發與運維相關事務,降低應用功能的實現門檻,快速構建業務能力。

  •  雲函數提供了高效可靠的函數開發與運行框架,替開發者完全解決傳統應用開發與運維中的諸多複雜事務(如伺服器配置與管理、程式碼部署、負載均衡、彈性伸縮、高可用保證等),開發者只需聚焦業務邏輯、開發並上傳函數程式碼,即可構建高可用、可伸縮的Serverless應用。
  • 雲函數作為Serverless的核心與樞紐,支援連接和擴展周邊雲服務能力,開發者可以像拼搭積木一樣自由便捷地組織各項服務來實現業務邏輯。

     

您將建立什麼

在本次Codelab中,您將實現一個能夠使用AppGallery Connect雲函數與客戶端進行交互的功能,您需要完成的功能將包含:

  •  在AGC網站上添加實現求和計算的函數。
  • 在AGC網站上測試新增的函數。
  • 客戶端調用新增函數,輸入兩個數字並返回兩數之和。

 

您將會學到什麼

  •  如何將方法函數添加為AppGallery Connect的雲函數。
  •  如何測試添加的雲函數。
  •  如何集成AppGallery Connect雲函數的SDK並在本地調用雲函數。

 

2、您需要什麼?

硬體要求

  • 開發電腦(台式機或筆記型電腦電腦):Windows10 64位或macOS 10.14/10.15/11.2.2作業系統
  • 測試應用的設備:HarmonyOS 2.0及以上的手機

軟體要求

  • Java JDK (推薦使用1.7+版本)
  • DevEco Studio 2.1及以上

需要的知識點

 

3、能力接入準備

集成AppGallery Connect(以下簡稱AGC)能力,需要完成以下準備工作:

1.         創建AGC應用

2.         創建DevEco Studio工程

3.         添加應用包名

4.         配置Maven倉地址及AGC gradle插件

5.         entry (hap)模組添加配置資訊

6.         同步工程

具體操作,請按照《AppGallery Connect集成準備》中詳細說明來完成。

說明:

您已註冊華為開發者聯盟官網帳號並實名認證才能執行上述操作,具體請參見註冊帳號

 

4、配置您的開發環境

開通服務

1.         登錄AppGallery Connect網站,點擊「我的項目」。

2.         在項目列表中選擇您需要開通雲函數服務的項目。

3.         在左側導航欄選擇「構建 > 雲函數」。

4.         點擊頁面右上角「立即開通」。

說明:

如果您此時未設置默認數據處理位置,系統會自動彈出提示框提示您設置默認數據處理位置,具體操作請參見設置默認數據處理位置

cke_40863.png

 

集成SDK

針對DevEco Studio開發環境,華為提供了maven倉集成方式的SDK包,開發前需集成SDK到您的DevEco Studio項目中。

1.         登錄在AppGallery Connect網站點擊「我的項目」,在項目下的應用列表中選擇您需要開通雲函數的應用。

2.         在項目設置的「常規」頁簽下,點擊「應用」欄下的「agconnect-services.json」下載配置文件。

3.         將「agconnect-services.json」文件拷貝到entry模組目錄下。

cke_44783.png

4.         打開entry模組下的build.gradle文件,添加如下程式碼集成Cloud Functions SDK。

dependencies
{
    ...
    implementation 'com.huawei.agconnect:agconnect-function:1.2.2.300'
    ...
}

5.         點擊介面上的「Sync Now」鏈接同步已完成的配置。

cke_51841.png

 

5、配置雲函數

創建雲函數

1.         開通雲函數服務後,在雲函數介面,點擊「+創建函數」。

cke_61660.png

2.         在創建函數中,完成函數定義,包括函數基本資訊,函數部署資訊及函數程式碼等內容的填寫。

cke_66443.png

3.         在handler.js的輸入框中輸入以下程式碼,來實現加法計算,並點擊右上角「保存」按鈕。

let myHandler = function(event, context) {
   var sum;
   if (event.body) {
      var reqBody = JSON.parse(event.body)
      var number1=reqBody.number1
      var number2=reqBody.number2
      sum = number1+number2
   }else {
      sum = 0
   }
   var obj={"result":sum}
   var res = new context.HTTPResponse(obj, {
      "res-type": "context.env",
      "faas-content-type": "json"
   }, "application/json", "200");
   //send info log
   context.logger.info("this is message of debug log");
   //send info log
   context.logger.info("this is message of error log");
   //send error log
   context.logger.error("Test error log");
   //send response
   context.callback(res);
};
module.exports.myHandler = myHandler;

 

測試函數

1.         您可以通過兩種方式進入函數測試頁面。

  •  點擊函數詳情介面右上角的「測試」按鈕。
  •  在Cloud Functions主介面上左側導航欄點擊「函數」,在函數頁面點擊「測試」頁簽。

    cke_86607.png

2.         選擇剛剛創建的函數及其版本,在事件中輸入如下程式碼:

{ 
"number1": 0, 
"number2": 0 
}

3.         在執行結果中查看結果,與結果一致:

cke_110429.png

 

添加觸發器

1.         在函數列表中點擊函數名稱進入函數詳情頁面。如果是函數別名,則進入函數別名配置頁面。

2.         點擊配置頁簽下的「+添加觸發器」。

3.         在「配置觸發器」區域配置「觸發器類型」等資訊,此處以HTTP觸發器類型和POST請求方式為例。

cke_125389.png

4.         完成後點擊「添加」並點擊「保存」。

5.         將詳細資訊中的觸發URL的後綴保存,作為客戶端請求時的觸發器標識。

cke_133587.png

 

6、介面設計

本次Codelab中您可以在DevEco Studio工程中創建一個布局頁面,參照下圖進行UI設計,具備兩個數字的輸入,雲函數返回求和結果的展示功能即可。

cke_151510.png

布局文件程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="//schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:orientation="vertical">
 
    <DirectionalLayout
        ohos:width="match_parent"
        ohos:height="50vp"
        ohos:alignment="center"
        ohos:orientation="horizontal">
 
        <TextField
            ohos:id="$+id:editText_number1"
            ohos:width="120vp"
            ohos:height="match_content"
            ohos:hint="$string:mainability_input_number"
            ohos:max_text_lines="1"
            ohos:text_size="20vp"/>
    </DirectionalLayout>
 
    <DirectionalLayout
        ohos:width="match_parent"
        ohos:height="50vp"
        ohos:alignment="center"
        ohos:orientation="horizontal">
 
        <TextField
            ohos:id="$+id:editText_number2"
            ohos:width="120vp"
            ohos:height="match_content"
            ohos:hint="$string:mainability_input_number"
            ohos:max_text_lines="1"
            ohos:text_size="20vp" />
    </DirectionalLayout>
 
    <DirectionalLayout
        ohos:width="match_parent"
        ohos:height="50vp"
        ohos:alignment="center"
        ohos:orientation="horizontal">
        <Button
            ohos:id="$+id:btn_add"
            ohos:width="match_content"
            ohos:height="match_content"
            ohos:text_size="20vp"
            ohos:text="$string:mainability_add_number"/>
    </DirectionalLayout>
 
    <DirectionalLayout
        ohos:width="match_parent"
        ohos:height="50vp"
        ohos:alignment="center"
        ohos:orientation="horizontal">
 
        <Text
            ohos:width="match_content"
            ohos:height="match_content"
            ohos:text="$string:mainability_number_res"
            ohos:text_size="20vp" />
        <Text
            ohos:id="$+id:textView_result"
            ohos:width="match_content"
            ohos:height="match_content"
            ohos:text_size="20vp"/>
    </DirectionalLayout>
 
</DirectionalLayout>

 

7、雲函數開發

1.         在應用啟動的onStart方法中獲取控制項實例並設置按鈕的點擊事件。

@Override
public void onStart(Intent intent) {
    super.onStart(intent);
    super.setUIContent(ResourceTable.Layout_ability_main);
 
    textFieldNum1 = (TextField)findComponentById(ResourceTable.Id_editText_number1);
    textFieldNum2 = (TextField)findComponentById(ResourceTable.Id_editText_number2);
    textView = (Text)findComponentById(ResourceTable.Id_textView_result);
    Button btn_add = (Button)findComponentById(ResourceTable.Id_btn_add);
    btn_add.setClickedListener(listener -> testFunctionAdd());
}

2.         初始化雲函數服務。

AGConnectFunction function = AGConnectFunction.getInstance();

3.         生成雲函數所需要的事件的map對象,這裡因為我們的雲函數中設置的事件的key值為「number1」和「number2」,所以我們設置map的key值為「number1」和「number2」。

HashMap<String, Integer> number = new HashMap();
number.put("number1", Integer.parseInt(textFieldNum1.getText()));
number.put("number2", Integer.parseInt(textFieldNum2.getText()));

4.         調用雲函數SDK中的wrap方法指定觸發器,call方法傳入事件的map作為參數,發送事件的HTTP請求並使用雲函數進行計算,並且添加請求的回調,將接收到雲函數的返回結果顯示到textView中。

HarmonyTask<FunctionResult> task = function.wrap("test-function-$latest").call(number);
task.addOnCompleteListener(new OnHarmonyCompleteListener<FunctionResult>() {
    @Override
    public void onComplete(HarmonyTask<FunctionResult> task) {
        if (task.isSuccessful()) {
            String val = task.getResult().getValue(String.class);
            textView.setText(val);
        } else {
            textView.setText("");
            AGCLogger.e(TAG, "exception", task.getException().getMessage());
        }
    }
});

說明:

其中wrap方法中傳入的參數,值為在AGC上查詢並獲取的觸發器標識

 

8、打包測試

1.         運行DevEco Studio工程生成HAP包,並在測試手機中安裝HAP包。

2.         在兩個輸入框中分別輸入兩個數字,點擊「求和」按鈕查看介面展示出兩數之和。

cke_258269.png

 

9、恭喜您

 

祝賀您,您已經成功地構建了您的第一個集成AppGallery Connect雲函數服務的應用程式,並學到了:

  • 如何在AGC上創建,編寫並測試一個新的雲函數。
  • 如何使用客戶端觸發的方式調用到自己創建的雲函數。

     

10、參考

​欲了解更多更全技術文章,歡迎訪問//developer.huawei.com/consumer/cn/forum/?ha_source=zzh