場景介紹
場景介紹如何使用函數計算服務開發一個IP查詢工具。
背景知識
什麼是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年時間,正在逐漸的走向成熟。
步驟一:連接配接ECS伺服器
阿裡雲雲産品資源體驗位址:
https://developer.aliyun.com/adc/scenario/d419eecaaf184013a45db0a5d613ad39場景将提供一台配置了CentOS 7.7的ECS執行個體(雲伺服器)。通過本教程的操作,您可以基于已有的環境開發一個基于函數計算的IP查詢工具。
步驟二:開通函數計算服務
在使用函數計算前,需要開通函數計算服務。
說明: 本場景中提供的阿裡雲子賬号無函數計算服務操作權限,請使用您自己的阿裡雲賬号操作。您無需擔心扣費問題,因為函數計算服務有一定的免費額度,請參見計費方式。
1.使用您自己的阿裡雲賬号登入阿裡雲控制台,然後進入
函數計算産品詳情頁。2.單擊【免費開通】。
- 閱讀《函數計算服務協定》勾選同意服務協定,最後單擊 【立即開通】 。
4.單擊【管理控制台】進入函數計算控制台。
步驟三:安裝Funcraft工具
Fun 是一個用于支援Serverless應用部署的工具,能幫助您便捷地管理函數計算、API 網關和日志服務等資源。它通過一個資源配置檔案
(template.yml),協助您進行開發、建構和部署操作。
本步驟将在ECS伺服器上安裝Funcraft工具。
1.執行以下指令安裝NodeJS。
curl -sL https://rpm.nodesource.com/setup_10.x | bash - && yum install -y nodejs
2.執行以下指令安裝Funcraft。
npm install request @alicloud/fun -g
3.執行fun config指令進行本地配置。
fun config
請參考以下資訊輸入您的阿裡雲賬号ID、AccessKeyID和AccessKey密鑰等資訊。
Aliyun Account ID:請在賬号安全設定頁面檢視您的賬号ID。
Aliyun Access Key ID和Aliyun Access Key Secret:請在 安全資訊管理 頁面檢視您賬号的AK ID和AK Secret。
如果您使用的是阿裡雲主賬号,請在安全資訊管理頁面的安全提示彈框中單擊繼續使用AccessKey。
Default region name:請選擇開通的函數計算服務所在地域。
正确設定如下所示:
步驟四:運作模闆示例
1.執行以下指令建立工作空間。
mkdir search_ip && cd search_ip
2.執行fun init指令建立一個HTTP函數觸發器。
fun init http-trigger-nodejs10
指令執行結果如下所示:
其中index.js 檔案為生成的HelloWorld函數模闆,template.yml 檔案中包含了HelloWorld函數和HTTP觸發器的預設配置資訊。
3.執行fun deploy -y指令部署應用到函數計算服務。
fun deploy -y
4.使用curl指令通路HTTP觸發器。請将下面指令中的11905929798*替換為您的阿裡雲賬号ID。
curl https://11905929********.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/search_ip/search_ip/
在傳回結果中可以看到,在使用HTTP觸發器的時候,可以預設傳遞一些參數,包括Path,Queries以及Headers,Method等,其中有一個參數是clientIP,該字段的值就是用戶端的IP位址,我們可以通過該位址來确定用戶端的IP位址。
接下來我們将利用clientIP字段開發IP查詢工具。
步驟五:開發IP查詢工具
1.參考以下步驟修改 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("您的IP是:" + request.clientIP);
response.setStatusCode(200)
response.setHeader('content-type', 'text/html')
response.send(respBody)
})
};
d. 按下 esc 鍵進入指令模式,輸入 :wq 儲存并退出vim。
2.執行 fun deploy -y 指令重新部署應用到函數計算服務。
fun deploy -y
3.使用 curl 指令通路HTTP觸發器。請将下面指令中的11905929798*替換為您的阿裡雲賬号ID。
curl https://11905929798*****.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/search_ip/search_ip/