8月29日下午,在熱烈的氣氛中,2019百度雲智峰會在北京順利舉辦。活動現場,百度開發者中心聯手百度雲智學院,為開發者及學生們,提供了展示自己的舞臺,輸出百度沉澱的優質技術。
為了幫助大家更好地理解Workshop中亮相的6大技術,我們特將技術內容進行梳理總結,出品6篇技術乾貨文章,在近期於百度開發者中心公眾號上逐一分享給大家,請大家持續關注。以下是第四期內容《基於函數計算的智能小應用》。
本文作者姚興,百度雲函數計算研發工程師。
函數計算簡介
函數計算是什麼?
函數計算的伺服器可以看作一個透明的接口,當用戶配置好業務邏輯後,所要做的唯一一件事就是——發送事件。函數計算是事件驅動、彈性伸縮的,可以將伺服器當做遠程過程調用看待。在伺服器端除了用戶的業務代碼,還會提供存儲服務、消息服務、日誌服務等基礎開發服務,也會默認提供日誌、監控、彈性伸縮、高可用等通用特性。
函數計算的起源
雖然函數計算是個比較新的概念,但其實多年前的流行技術就有了它的雛形。我們來了解一下函數計算一路是怎麼誕生的。
CGI(Common Gateway Interface)是上世紀九十年代開始流行的技術。具體實現是在一個機器上部署Web伺服器,當請求到來時根據參數來調用本機部署好的應用程式,然後將程序輸出的結果返回給用戶。這種服務其實就很類似於函數計算,以事件驅動。但它有個致命的缺陷,每處理一個請求都得啟動新進程,極其消耗資源。
為了避免啟動新進程,開發者後續創造了大量技術來改進CGI,其中最主流的兩種技術就是FastCGI和Java EE。
FastCGI將應用程式作為常駐進程運行,Web伺服器和應用程式使用網絡連接來通信。
Java EE則在另外一種奇特的路上越走越遠,它將Web伺服器和應用程式打包在一起,作為同一個進程啟動,這樣兩者之間使用線程間通信即可。
隨著網際網路時代的到來,自建機房對小公司來說成為了性價比不高的選擇,原因之一就是機器資源需求在各個時間段不一致,可能造成巨大浪費。這時就出現了IaaS服務,它解決硬體資源的運維和供給問題。以虛擬機維度計費,提供機器的擴容和縮容功能。這樣技術就從自建機房進入了雲時代。
儘管IaaS解決了機器問題,但仍不是真正的按需收費,因為還有個致命的問題需要解決——即使未接收到任何請求,Web伺服器和應用程式也仍然在運行且佔用著資源的。為了解決這個問題,函數計算FaaS就誕生了。它吸收了過去技術的優點,費用與請求數相關,而用戶只關心業務邏輯,基本無需關心技術邏輯(比如監控,性能,彈性,高可用,日誌追蹤等)。
函數計算與傳統架構對比
我們來對比一下傳統架構與函數計算的各方面特性,看看函數計算到底解決了哪些痛點。這裡的傳統架構包括自建機房和IaaS服務。
函數計算的四大優勢
1、簡單易用。無需管理伺服器和環境,只需編寫代碼。FaaS根據請求量自動橫向擴縮。
2、開發運行高效。上傳代碼後即可自動部署,每個函數單獨部署、運行、伸縮。執行的額外延遲是毫秒級。
3、 穩定可靠。雲函數使用事件觸發,單機故障不影響函數執行。
4、降低成本。業務無需常駐,未執行時不產生任何費用,按請求數和運行時間收費。
百度函數計算CFC實驗
在了解函數計算後,我們來試著用百度的函數計算服務CFC做三個小實驗,進一步學習函數計算的使用方法。
文件伺服器
需求
第一個實驗比較簡單,使用CFC實現一個HTTP伺服器提供文件訪問功能,主要需求如下:
-通過瀏覽器能訪問自定義的圖片或書籍
-能用手機朗讀書籍
架構
因為CFC是事件驅動的,只接收事件格式的請求,所以任何外部請求都會被特定的「觸發器」轉換成事件。這裡從瀏覽器發送的HTTP請求會通過HTTP觸發器到達CFC伺服器。在伺服器的本地環境中存儲著需要訪問的文件,在一個名為「assets」的目錄下存儲著一張風景照landscape.jpg和一本書poetry.txt。
實驗步驟
創建函數
1、登陸百度智能雲平臺控制臺
2、選擇「產品服務>雲函數計算 CFC」,進入「函數列表」頁面,點擊從模板創建函數,進入從模板創建函數界面。
3、點擊後,界面上會顯示目前所有的模板,選擇「simple-file-server」模板,點擊下面的「創建」按鈕。
4、在彈框中輸入函數名稱,點擊確定。
5、增加HTTP觸發器,選擇左側「觸發器」選項卡,點擊「新增觸發器」,在彈出的窗口中,「觸發器」選擇「HTTP觸發器」,「URL路徑」選擇「/file/{path+}」,「HTTP方法」可以只選「GET」,「身份驗證」選擇「不驗證」。
6、查看程序包的結構,在「函數代碼」界面點擊「點擊下載完整 ZIP 程序包」,然後解壓,可以看到包中的asset目錄下有一個圖片和一個txt文件。如果想在此服務中訪問其他文件,可以將其放入asset目錄下,再次打包成zip文件,點擊「上傳函數.ZIP包」。
測試函數
1、在函數列表頁點擊函數名最右側的「測試「按鈕,或者在函數基本信息頁和函數代碼頁面,都可找到「測試「按鈕,進入測試彈窗。
2、輸入測試的事件,選擇任意模板,輸入以下json字符串:
{
"resource": "/test/{path+}",
"path": "/test/poetry.txt",
"httpMethod": "GET",
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Connection": "close",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36",
"X-Bce-Request-Id": "f6cb833e-f818-4b80-b30c-fff437e69886"
},
"queryStringParameters": {
"a": "111"
},
"pathParameters": {
"path": "poetry.txt"
},
"requestContext": {
"stage": "cfc",
"requestId": "f6cb833e-f818-4b80-b30c-fff437e69886",
"resourcePath": "/test/{path+}",
"httpMethod": "GET",
"apiId": "7grmt1xfky5jf"
},
"body": "",
"isBase64Encoded": false
}
3、點擊「執行」按鈕,即可得到返回。
解釋一下測試數據中的要點欄位。pathParameters中有一個path變量,值為poetry.txt,這裡指定了訪問的文件名。可以在函數代碼頁面看到相關實現,var filename = event.pathParameters.path;這一行提取到事件中的文件名,var filepath = __dirname + "/assets/" + filename;將文件定位在「assets」目錄下。
運行測試後可以看到成功的字樣,而且結果中輸出了poetry.txt中的詩。
使用函數的文件服務
1、查找函數對應的HTTP地址,在觸發器界面找到「URL路徑」,其中的「{path+}」在此函數就表示自定義的文件名。
2、訪問文件服務中的圖片,在瀏覽器中輸入"{url}/landscape.jpg",url是上一步查找到的地址。
3、訪問文件服務中的詩文件,在在瀏覽器中輸入"{url}/poetry.txt"。
使用Siri朗讀詩
1、新建捷徑,在iPhone上打開捷徑app,點擊右上的加號新增捷徑,進入捷徑的配置。
2、指定詩的地址,增加「URL」,內容填入「{url}/poetry.txt」。
3、讀取詩的內容,增加「獲取URL內容」,「高級」的「方法」中選擇「GET」。
4、讓手機朗讀詩,增加「朗讀文本」。
5、測試功能,點擊「完成」,然後點擊此捷徑。
6、綁定個性化短語,點擊捷徑右上方的設置圖標,再點擊「添加到Siri」,錄製短語與捷徑綁定。
7、使用Siri讀詩,喚醒Siri,說出上一步的短語。
猜數字遊戲
需求
這個實驗複雜一些,需求如下:
-隨機生成一個正整數
-用戶說出數字
*如果猜錯,告知數字過大或者過小
*如果猜對,遊戲結束,重新開一局
架構
看到需求中需要用戶「說出」數字,你應該能想到這裡需要一個外部服務來提供語音識別功能了,所以我們引入了小度音箱。小度音箱背後提供的DuerOS平臺服務可以接入CFC,即使你沒有音箱設備也無需擔心,我們可以使用DuerOS平臺的模擬測試功能。在這個實驗中,小度音箱將用戶說出的語音發送到DuerOS平臺,後續的數據經過一種新的觸發器——DuerOS觸發器轉換為CFC能識別的事件,最終發送給函數。
流程
來看看CFC的函數需要實現的遊戲流程。
遊戲開始時需要生成隨機數,存儲到DuerOS平臺的session接口(可以看作Web服務的session功能,提供臨時存儲功能)中。在接收到數字後,比較該數字與隨機數的大小,不相等則讓小度音箱報出對應的提示語,否則遊戲接收,重新開局。
實驗步驟
創建函數
1、登陸百度智能雲平臺控制臺
2、選擇「產品服務>雲函數計算 CFC」,進入「函數列表」頁面,點擊從模板創建函數,進入從模板創建函數界面。
3、點擊後,界面上會顯示目前所有的模板,選擇「dueros-bot-guess」模板,點擊下面的「創建」按鈕。
4、在彈框中輸入函數名稱,點擊確定。
5、增加DuerOS觸發器,在函數配置界面的「觸發器」下點擊「新增觸發器」,選擇「DuerOS觸發器」,點擊「確定」。
測試創建的函數
1、在函數列表頁點擊函數名最右側的「測試「按鈕,或者在函數基本信息頁和函數代碼頁面,都可找到「測試「按鈕,進入測試彈窗。
2、輸入測試的事件,選擇任意模板,輸入以下json字符串:
{
"version": "2.0",
"session": {
"new": false,
"sessionId": "{{session_id}}",
"attributes": {}
},
"context": {
"System": {
"application": {
"applicationId": "{{application_id}}"
}
}
},
"request": {
"type": "IntentRequest",
"requestId": "{{request_id}}",
"timestamp": "1499169543",
"query": {
"type": "TEXT",
"original": "34567"
},
"intents": [
{
"name": "guess",
"confirmationStatus": "NONE",
"slots": {
"number": {
"name": "number",
"value": "75301",
"values": [
"20000",
"20000",
"50000",
"75301"
]
}
}
}
]
}
}
3、點擊「執行」按鈕,即可得到返回。
解釋一下測試數據中的幾個與DuerOS平臺相關的重要欄位。intents代表「意圖」,可以設置多個,這裡只配置了一個名為guess的意圖。在這個意圖中有一個slots欄位代表「槽位」,其中有個number槽位,它的value是75301。「意圖」和「槽位」的概念都可以在DuerOS平臺看到解釋,接下來創建技能過程中會使用到這兩個概念。
增加DuerOS技能,並綁定CFC函數
1、新建DuerOS技能,在DuerOS技能平臺選擇創建小技能,選擇「自定義>從頭開始」,在頁面下方填入「技能名稱」、「調用名稱」、「應用場景」、「技能付費」,點擊確定。
2、創建意圖,在DuerOS技能平臺中,找到上一步創建的技能,點擊編輯,然後選擇「創建意圖」進入創建意圖界面。
3、意圖信息填寫,按照要求填寫。為了與CFC的函數匹配,「意圖標識名」設置為「guess」。
4、常用表達,您可以根據創建函數的用處,輸入運行函數的常用表達語句。「常用表達」中輸入任意整數(比如20000)回車,此時可以看到「對應詞典」自動設為sys.number,將此表達的「槽位標識」修改為「number」(與CFC函數對應)。最後點擊頁面最下方的「保存」。
5、查詢函數BRN,在CFC「函數列表」頁面點擊想要獲得BRN的函數名稱,進入函數詳情可以查看函數的BRN。
6、與CFC函數綁定,在DuerOS技能平臺點擊「配置服務」,在「服務部署」中選擇「百度雲CFC」,在「BRN」中填入上一步獲取的函數BRN,「是否回調」列,選擇不執行回調,點擊「保存」。
測試DuerOS技能
1、使用百度帳號登錄DuerOS技能平臺
2、選擇需要測試的自定義技能名稱,進入技能詳情頁面,在左側導航欄中選擇「測試驗證>模擬測試」,進入測試頁面。
3、在輸入框中輸入「打開+調用名稱」打開事件,然後輸入想要猜的數字,開始遊戲。
圖片自動添加水印服務
需求
這是一個常見的Web服務需求,先來實現簡單的文字水印,需求如下:
-用戶自定義文字
-上傳圖片時將文字水印添加到圖片
架構
為了存儲圖片,在實驗中引入了新的外部服務——對象存儲BOS,這是百度雲提供的存儲服務,與CFC對接極其便利。另外在這個實驗中也引入了新的BOS觸發器。BOS中可以設置規則,在圖片上傳後如果滿足條件則自動觸發並將消息發送給CFC,然後經過BOS觸發器將事件傳入函數中。
實驗步驟
創建函數
1、登陸百度智能雲平臺控制臺
2、選擇「產品服務>雲函數計算 CFC」,進入「函數列表」頁面,點擊從模板創建函數,進入從模板創建函數界面。
3、點擊後,界面上會顯示目前所有的模板,選擇「bos-add-watermark」模板,點擊下面的「創建」按鈕。
4、在彈框中輸入函數名稱,點擊確定。
創建BOS Bucket,並綁定CFC函數
1、登陸百度智能雲平臺控制臺,選擇「產品服務>對象存儲 BOS」。
2、創建Bucket,點擊「存儲管理」旁邊的加號,填入「Bucket」名稱,「所屬地域」選擇「華北-北京」,然後點擊「確定」。
3、BOS Bucket綁定CFC函數,在「全局概覽」中選擇創建好的Bucket,點擊「事件通知」,再點擊「創建規則」。在「創建新規則」窗口中,填入「名稱」,「監測事件」選擇「PutObject」(上傳文件),「覆蓋資源」選擇「前後綴」,並在前綴中填入「image」,「觸發應用」中點擊「添加>點擊選擇應用」,「觸發應用方式」選擇「函數計算CFC」,「函數列表」選擇剛剛創建的CFC函數,點擊「確認」。最後點擊「確定」,完成新規則的創建。
你可能注意到在這個實驗中到此為止都沒有創建過觸發器,現在回到CFC函數的觸發器再看看,可以發現已經有一個BOS觸發器創建好了,並且屬性與BOS中的規則一致。因為BOS的配置和CFC是聯動,在一方設置好以後另一方會同步配置。
測試添加水印功能
1、上傳圖片,進入BOS中創建好的Bucket,選擇「文件列表」,點擊「上傳文件」,選擇一張本地的png格式文件,點擊「開始上傳」。
2、查看結果,進入Bucket,選擇「文件列表」,可以看到多了一個「wartermarked-images」目錄,點擊進入,目錄裡有與上一步同名的圖片文件,再點擊圖片,可以看到圖片上有水印。
3、自定義水印文字內容,進入CFC函數代碼,有一處水印文字信息text = "Hello World!",修改此值再上傳圖片即可生成新的水印文字。
4、自定義水印文字字體,下載程序包並解壓,可以看到裡面有一個名為「HELVETI1-1.ttf」的字體,另外代碼中有一句font_path = './HELVETI1-1.ttf',文件和代碼可以替換為其它true type字體。
5、自定義水印的位置、顏色、透明度等屬性,代碼使用Python的pillow庫,可以查看pillow官方文檔,自行修改代碼。
相信大家對CFC實驗已經有了初步的了解和認識,後續我們會持續發布2篇技術文章,請持續關注哦。