函式計算入門-HelloWorld應用開發
本場景介紹如何使用函式計算服務開發HelloWorld應用。您可以通過控制檯或Funcraft工具實現。
體驗目標
本場景將提供一臺配置了CentOS 7.7的ECS例項(雲伺服器)。通過本教程的操作,您可以基於已有的環境開發一個基於函式計算的HelloWorld應用。
背景知識
什麼是Serverless
自2006年8月9日,Google執行長埃裡克·施密特(Eric Schmidt)在搜尋引擎大會(SESSanJose2006)首次提出“雲端計算”(Cloud Computing)的概念之後,雲端計算的發展可以用日新月異這個詞來形容。那麼究竟什麼才是Serverless呢?
簡單來說,Serverless可以說是一種架構,一種雲計算髮展的產物,至於具體說什麼是Serverless,可能沒有誰能給他一個明確的概念,如果非要說一個可以稍微容易理解一些的概念,那或許可以參考Martin Fowler在《Serverless Architectures》中對Serverless這樣定義:Serverless=BaaS + FaaS。
Serverless架構和傳統的專案的區別
首先,我們以一個常見的Web服務為例:
在這個圖中,伺服器中可能涉及路由規則、鑑權邏輯以及其他各類複雜的業務程式碼。同時,開發團隊要付出很大的精力在這個伺服器的運維上面,例如要時刻關注以下問題:
- 客戶量突然增多時是否需要擴容伺服器。
- 伺服器上的指令碼和業務程式碼等是否還在健康執行。
- 是否有黑客在不斷地對伺服器發起攻擊。
當我們把這個思路切換到Serverless的邏輯之後,變成了這樣:
可以認為,當客戶端和資料庫未發生變化的前提下,伺服器變化巨大。
- 之前需要開發團隊維護的路由模組以及鑑權模組都將接入服務商提供的API網關係統以及鑑權系統,開發團隊無須再維護這兩部分的業務程式碼,只需要持續維護相關規則即可。
- 在這個結構下,業務程式碼也被拆分成了函式粒度,不同函式表示不同的功能。
- 我們已經看不到伺服器的存在,是因為Serverless的目的是讓使用者只關注自己的業務邏輯即可,所以一部分安全問題、資源排程問題(例如使用者量暴增、如何實現自動擴容等)全都交給雲廠商負責。
- 相對於傳統專案而言,傳統專案無論是否有使用者訪問,服務都在執行中,都是有成本支出,而Serverless而言,只有在用去發起請求時,函式才會被啟用並且執行,並且會按量收費,相對來說可以在有流量的時候才有支援,沒有流量的時候就沒有支出,相對來說,成本會進一步降低。
通過以上分析和描述,不難看出Serverless架構相對於傳統的開發模式的區別,也逐漸的發現了它的優勢。但是問題來了,很多工作都交給了雲廠商來做,那我們做什麼呢?
使用Serverless架構後:
- 開發團隊不需要再自己維護伺服器,也不需要自己操心伺服器的各種效能指標和資源利用率,而是可以讓開發團隊付出更多的時間和精力去關注應用程式本身的狀態和邏輯。
- Serverless應用的部署將變得十分容易。我們只要上傳基本的程式碼,例如Python程式只需要上傳其邏輯與依賴包,C/C++、Go等語言只需上傳其二進位制檔案,Java只需要上傳其Jar包等即可,同時不需使用Puppet、Chef、Ansible或Docker來進行配置管理,大大降低了運維成本。
- Serverless架構也不再需要監控底層的資料,例如不再需要監控磁碟使用量、CPU使用率等,可以更加專注的將監控目光放到監控應用程式本身的度量。同時在Serverless架構上,運維人員的工作角色會有所轉變,部署將變得更加自動化,監控將更加面向應用程式本身。
使用Serverless架構的優勢
從上文中我們不難看出,相對於傳統專案,Serverless具備的以下優勢:
- 您無需採購和管理伺服器等基礎設施,運維成本低。
- 您只需專注業務邏輯的開發,使用函式計算支援的開發語言設計、優化、測試、稽核以及上傳自己的應用程式碼。
- 以事件驅動的方式觸發應用響應使用者請求。與阿里雲物件儲存OSS、API閘道器、日誌服務和表格儲存等服務無縫對接,幫助您快速構建應用。例如,通過OSS解決圖片和視訊的儲存問題,當有新資料寫入您的OSS資源時,自動觸發函式處理資料。
- 提供日誌查詢、效能監控和報警等功能快速排查故障。
- 毫秒級別彈性伸縮,快速實現底層擴容以應對峰值壓力。
- 按需付費,支援百毫秒級別收費。只需為實際使用的計算資源付費,適合有明顯波峰波谷的使用者訪問場景。
總而言之,Serverless是在傳統容器技術和服務網格上發展起來,更多指的是後端服務與函式服務的結合。對於開發者而言,能夠將更多的精力關注在函式服務上,更側重讓使用者只關注自己的業務邏輯即可。
同時,Serverless也是雲計算髮展到一定階段的必然產物。作為普惠科技,雲計算髮展的目標一定是綠色科技和大眾科技的產品——而Serverless能夠很好的詮釋這些:最大程度利用資源、減少空閒資源浪費;同時降低學習成本和使用成本。
Serverless架構被稱為是“真正實現了當初雲端計算的目標”,這種說法雖然有些誇張,但是也從另一方面表現出了大家對Serverless架構的期盼和信心。自2012年被提出至今,Serverless架構也是經歷了7年時間,正在逐漸的走向成熟。
實驗詳情
開通函式計算服務
在使用函式計算前,您需要開通函式計算服務。
說明:本場景中提供的阿里雲子賬號無函式計算服務操作許可權,請使用您自己的阿里雲賬號操作。您無需擔心扣費問題,因為函式計算服務有一定的免費額度,請參見計費方式。
1. 使用您自己的阿里雲賬號登入阿里雲控制檯,然後進入函式計算產品詳情頁。
2. 單擊【免費開通】。
3. 閱讀《函式計算服務協議》勾選同意服務協議,最後單擊【立即開通】。
4. 單擊【管理控制檯】進入函式計算控制檯。
說明: 開通函式計算後,你可以通過2種方式進行HelloWorld應用開發,使用函式計算控制檯或使用Funcraft工具。
在控制檯開發函式計算HelloWorld應用
1. 在函式計算控制檯首頁,單擊【新建函式】。
2. 選擇【HTTP函式】,然後單擊【下一步】。
3. 參考以下說明填寫函式和觸發器配置,然後單擊【完成】。
- 所在服務:例如hello_world_service。
- 繫結日誌:填寫所在服務名稱後預設勾選繫結日誌,日誌服務會收取少量費用,您可以選擇取消勾選。
- 函式名稱:例如hello_world。
- 執行環境:選擇nodejs10。
- 觸發器名稱:例如hello_world_trigger。
- 認證方式:選擇anonymous。
- 請求方式:選擇GET。
4. 在程式碼執行管理頁面,將index.js檔案中的內容替換為如下所示:
var getRawBody = require('raw-body')
module.exports.handler = function (request, response, context) {
getRawBody(request, function (err, data) {
var respBody = new Buffer.from("你好,世界!");
response.setStatusCode(200)
response.setHeader('content-type', 'text/html')
response.send(respBody)
})
};
替換後如下所示:
5. 單擊編輯器右上角【Save Invoke】儲存並執行示例程式碼。
可以看到函式執行成功,並返回: 你好,世界!
使用Funcraft開發函式計算HelloWorld應用
Funcraft是一個用於支援Serverless應用部署的工具,能幫助您便捷地管理函式計算、API 閘道器和日誌服務等資源。它通過一個資源配置檔案(template.yml),協助您進行開發、構建和部署操作。
本步驟操作將在ECS伺服器上使用Funcraft工具開發函式計算HelloWorld應用。
1. 按照以下步驟建立資源。
a. 在頁面左側,單擊雲產品資源下拉選單,檢視本次實驗資源。
b. 單擊免費開通建立所需資源。
說明: 資源建立過程需要1~3分鐘。完成實驗資源的建立後,您可以在雲產品資源列表檢視已建立的資源資訊,例如:IP地址、使用者名稱和密碼等。
2. 參考以下步驟連線ECS伺服器。
a. 開啟終端工具。
- Windows:開啟命令視窗。
- MAC:開啟命令列終端Terminal。
Windows使用者請檢查系統中是否安裝有SSH工具。檢查方法:
在終端中輸入命令ssh -V 。
ssh -V
如果顯示SSH版本則表示已安裝,如下圖所示。
如果未安裝,請下載安裝OpenSSH工具。
b.在終端中輸入連線命令ssh [username]@[ipaddress]
。您需要將其中的username和ipaddress替換為步驟一中建立的ECS伺服器的彈性公網IP。
例如:
ssh root@123.123.123.123
命令顯示結果如下:
c. 輸入yes
。
d. 同意繼續後將會提示輸入登入密碼。 密碼為已建立的雲服務的ECS的登入密碼。
登入成功後會顯示如下資訊。
3. 在連線到ECS伺服器的終端中執行以下命令安裝NodeJS。
curl -sL https://rpm.nodesource.com/setup_10.x | bash - && yum install -y nodejs
4. 執行以下命令安裝Funcraft。
npm install request @alicloud/fun -g
5. 執行fun config 命令進行本地配置。
fun config
請參考以下資訊輸入您的阿里雲賬號ID、AccessKeyID和AccessKey金鑰等資訊。
Aliyun Account ID:請在賬號安全設定頁面檢視您的賬號ID。
Aliyun Access Key ID和Aliyun Access Key Secret:請在安全資訊管理頁面檢視您賬號的AK ID和AK Secret。
如果您使用的是阿里雲主賬號,請在安全資訊管理頁面的安全提示彈框中單擊繼續使用AccessKey。
如果您使用的是阿里雲RAM子使用者,需要確保您的子使用者擁有函式計算管理許可權AliyunFCFullAccess
,請參見為RAM使用者授權。
如下圖所示為您的AccessKey ID和AccessKey Secret。如果您的賬號未使用過AccessKey,請單擊右上角建立AccessKey。
Default region name:請選擇開通的函式計算服務所在地域。
正確設定如下所示:
6. 執行以下命令新建工作空間。
mkdir demo && cd demo
7. 執行 fun init命令新建一個HTTP函式觸發器。
fun init http-trigger-nodejs10
命令執行結果如下所示:
其中 index.js 檔案為生成的HelloWorld函式模板,template.yml 檔案中包含了HelloWorld函式和HTTP觸發器的預設配置資訊。
8. 參考以下步驟修改 index.js 檔案內容。
a. 將index.js檔案內容清空。
cat /dev/null > index.js
b. 使用vim開啟index.js 檔案。
vim index.js
c. 按下i鍵進入vim的編輯模式,在檔案中新增以下內容。
var getRawBody = require('raw-body')
module.exports.handler = function (request, response, context) {
getRawBody(request, function (err, data) {
var respBody = new Buffer.from("你好,世界!");
response.setStatusCode(200)
response.setHeader(