使用Azure Function玩轉Serverless

Serverless&Azure Functions

通過無服務器計算,開發者無需管理基礎結構,從而可以更快構建應用程序。通過無服務器應用程序,將由雲服務提供商自動預配、縮放和管理運行代碼所需的基礎結構。

要理解無服務器計算的定義,注意到服務器仍在運行代碼很重要。服務器名稱來源於這樣一個事實:與基礎結構預配和管理相關聯的任務對開發者不可見。這種方式讓開發者能夠更多地專註於業務邏輯,向業務核心交付更多價值。無服務器計算可幫助團隊提高生產力、更快將產品推向市場,並讓組織可以更好地優化資源、保持專註於創新。

引用自Azure文檔

以上文字引用自Azure,說的有點官方。說說我個人對Serverless的簡單理解。所謂Serverless是相對於傳統有應用的部署方案來說的。傳統應用不管你是直接部署在主機或者容器化來部署,你的程序總是跑在一個完整的應用進程下。比如你只是想提供一個簡單的A+C=C的Web Api,你往往需要啟動一個完整的asp.net mvc項目或者sprintmvc項目來承載簡單的代碼。那麼Serverless通過雲服務把目標更加細化,通過它你可以只使用相關代碼實現某個方法或函數,上傳到雲端後這個函數就可以跑了。這樣子的話資源佔用更加少,相對的資源付費也會更加有針對性,因為你無需為沒用的資源所付費。Serverless可以說是對微服務的更加細化,使在雲端運行的代碼從application級別降低到了Function/method級別。
上面簡單介紹了Serverless。而Azure的Serverless方案就是Azure Functions。

創建函數應用

Azure Function是個免費服務,在免費服務列表裡找到它並點擊創建。
0kfZ3F.png
給函數取個名稱,發佈選擇「代碼」。如果打算用.net來開發則運行時堆棧選擇.NET Core版本選擇3.1。跟其他資源一樣區域選擇東亞,因為它離你近。
0kfV9U.png
因為Azure Function雖然是Serverless但是也些儲存空間,所以需要配置存儲賬戶。選擇上次我們使用AzureBlob時候創建的存儲賬號。沒有的話可以新建一個。
操作系統任意選擇Linux或者Windows。
計劃類型選擇:消耗(無服務器)

Azure 函數提供1000000請求/月的免費額度

使用VSCode進行本地開發

在函數列表界面點擊「本地開發」。會彈出本地開發指導。選擇VSCode環境會出現VSCode的開發環境配置說明。
0kfec4.png
首先本地需要安裝node跟npm。使用下面的命令自動安裝Core Tools包:

npm install -g azure-functions-core-tools@3 --unsafe-perm true

注意:這個包還是很大的,由於網絡的原因有可能拉不下來。如果長時間下不下來也可以直接搜索azure-functions-core-tools直接下載獨立安裝包。

使用npm安裝完core tools後還有安裝Azure Functions的VSCode插件。
0kfCBn.png
打開VSCode插件菜單,搜索Azure Functions,找到Azure Functions插件後點擊Install開始安裝。這個插件一會就安裝完了。

新建Function

我們按照完VSCode的插件後,切換到Azure Function菜單。
0kfsC8.png
點擊新建按鈕會彈出Azure Function支持的觸發器。觸發器有很多有HttpTrigger,BlobTrigger,CosmosDbTrigger等等。這裡選擇最簡單的HttpTriger觸發器。接着會提示輸入項目名稱,輸入名稱後回車就可以生成本地項目了。

Function代碼

我們簡單演示下Azure Function,使用這個函數實現一個簡單的兩個數相加返回相加結果。

namespace Company.Function
{
    public static class AzFnTest
    {
        [FunctionName("AzFnTest")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            
            int a = data.A;
            int b = data.B;

            int c = a + b;

            return new OkObjectResult(c);
        }
    }
}

以C#為語言的Azure Function入口就是一個run方法。run方法的入參有2個,一個是HttpRequest,一個Ilogger。其中HttpRequest包含了http請求的信息,QueryString、body、headers等。這個類就是來自Microsoft.AspNetCore.Mvc命名空間。返回值是Task。那麼本質上一個Function其實可以看做是標準MVC方案里的一個Action。只是缺乏了參數自動綁定。我們需要的參數都要從HttpRequest對象上提取。
上面的代碼很簡單,就是獲取body內容反序列化成一個動態對象,獲取參數A、B,然後相加得到C,通過OkObjectResult直接返回出去。

本地測試

在VSCode界面按F5啟動調試。VSCode會啟動一個本地實例,可以接受http請求。我們使用postman往這個地址post一個json數據過去。

{
    "A" : 1 ,
    "B" : 2
}

0kfkNV.png
可以看到返回了結果3。

上傳到Azure

0kfP7q.png
在VSCode上點擊上傳按鈕,會提示登錄Azure。登錄成功後會列出上面我們新建的Azure Function的資源。
0kfAhT.png
選擇azure-fn0,選中之後會開始上傳,最後output窗口會提示成功。
0AKpY4.png
回到portal網站刷新下,會看到我們的項目已經上傳成功了。

運行函數

點擊函數名稱彈出明細界面。點擊「獲取函數URL」獲取調用這個函數的真實URL。
0AKmkD.png
有了這個地址我們就可以在全球範圍內使用這個函數啦。讓我們使用Postman再測試一下。
0AKG0f.png
可以看到返回了正確的結果。

總結

以上我們使用C#代碼實現了一個簡單的Azure Functions並調用了它。Azure Functions還支持Java、Nodejs、Python等常用的編程語言。Azure Functions跟Azure生態緊密結合,除了支持HttpTrigger,還支持CosmosDb,Azure Blob,甚至是Iot邊緣計算等場景。Azure Functions是Azure的Serverless解決方案,它具有無需基礎結構管理、動態可伸縮性、加快上市、更高效地使用資源等優點,大家如果想體驗Serverless可以嘗試一下。

關注我的公眾號一起玩轉技術

Tags: