與 Serverless 的一次近距離接觸

索引:

  1. 如何理解 Serverless
  2. Web 開發工程師與 Serverless 的第一次接觸

  3. 雲計算環境下的 Serverless

  4. 實例 Demo 展示

正文:

如何理解 Serverless

Serverless 是基於互聯網的系統,系統中的各個服務模塊不使用常規的服務進程,而是使用第三方的服務。

Serverless 可以讓演算法工程師把注意力集中到代碼與演算法上,而不是伺服器部署、擴展性的保證,更不需要關心基礎設施和服務架構。

正如選擇 Python 作為主語言的原因是它的語法糖、泛型夠簡單,我可以把更多的注意力集中在業務邏輯的整理和抽象上面

具體一點:

Serverless 的功能以 function 為最小的單元(FaaS · Function-as-a-Service),用戶訪問某個 function 時啟動一個容器執行 function 內的程序,執行結束回收這個容器,整個過程快至幾個毫秒就能完成。

Web 開發工程師與 Serverless 的第一次接觸

想像一下,你是一名 Web 開發工程師,你需要做一個單頁面應用,上傳一張圖並在幾秒後獲得一張梵高風格化的圖,像這樣:

Google 一下:

alexjc/neural-doodle

你好,我叫星辰,如果我告訴你,我還需要面向 Google 編程,你會藉此『證明』我不是一個『真正的』工程師。

這就尷尬了,不不...是這就簡單了

python doodle.py --style samples/Monet.jpg n --output samples/Coastline.png n --device=cpu --iterations=40n

Web 化對使用 Python 語言的 Web 工程師使用起來都不是事,理一遍邏輯:

  1. 瀏覽器發請求給服務端,body 是一張圖片二進位流;
  2. 服務端從 body 中取出二進位流,轉成圖片,調用 doodle.py 中的方法,轉換風格存儲之並返回存儲位置;
  3. 瀏覽器按位置請求圖片並展示之。

共三步,So easy!

下面,我們來試試 Serverless 的方式,理一遍邏輯:

  1. 將風格轉換的 function 製成一個 Docker 鏡像,上傳之後記住鏡像 ID;
  2. 將瀏覽器傳來的圖片和鏡像 ID 傳給 API-Gateway;

  3. API-Gateway 根據參數啟動指定鏡像的容器,並將圖片交給它,然後容器返迴風格轉換後的圖片;
  4. 接收並展示之

共四步,還多了一步,製作 Docker 鏡像什麼的,好麻煩,為什麼選擇後者呢?

因為傳統的方式:

  • 需要一個 Server
  • 需要自己部署
  • 需要考慮負載
  • 需要業務日誌
  • 需要運維與監控

Serverless 的方式就高大上了:

  • 數萬核級的計算能力,自動高效完成計算分布

  • 只需關注業務演算法及任務編排,減輕運維負擔(資源部署、環境配置等)

  • 以Docker方式打包自定義演算法,支持API方式編排、調用計算服務,易於集成到應用的業務流程

  • 按實際消耗的計算資源計費,無需付出非計算資源(內存、磁碟)的費用,無需擔心浪費

都別說話,看我一頓操作 ↓

雲計算環境下的 Serverless (UCloud UGC)

  1. 創建私有倉庫(Web 界面)
  2. 登錄鏡像倉庫(CLI)
  3. 製作 HelloWorld Docker 鏡像(CLI)
  4. 上傳鏡像(CLI)
  5. 查看鏡像信息(Web 界面)
  6. 告警模板配置 (Web 界面)
  7. 發布任務(使用官方提供的 Python sdk)
  8. 查看任務統計(Web 界面)
  9. 查看監控(Web 界面)

>> 創建私有倉庫

consolev3.ucloud.cn/ugc

>> 登錄鏡像倉庫

docker login cn-bj2.ugchub.service.ucloud.cnn

注意:使用 UCloud 賬號登錄即可,點擊註冊

>> 製作 helloworld Docker 鏡像(CLI)

docker build -t cn-bj2.ugchub.service.ucloud.cn/demo/helloworld:first .n

這裡使用最簡單的 HelloWorld Docker 鏡像來演示

Dockerfile

FROM centos:latestnCOPY ./helloworld.py /usr/bin/HelloWorld.pynRUN chmod +x /usr/bin/HelloWorld.pynRUN echo "export TERM=xterm" >> /root/.bashrcnENTRYPOINT ["/usr/bin/helloworld.py"]n

HelloWorld.py

#!/usr/bin/env pythonnimport sysnprint("hello world")nbody = sys.stdin.read()nsys.stderr.write(str(sys.argv[1:]))nwith open("/tmp/result", "w") as f:n f.write(body)n

>> 上傳鏡像(CLI)

docker push cn-bj2.ugchub.service.ucloud.cn/demo/helloworld:firstn

>> 查看鏡像信息(Web 界面)

>> 告警模板配置 (Web 界面)

目前包含請求超時和失敗兩個模板

>> 發布任務(使用官方提供的 Python sdk)

python example_SubmitTaskAndGetResult.pyn

注意配置一下自己賬號的公私鑰和你剛創建的 Docker image ID,具體看這個例子

這裡要注意,API-Gateway 的域名只有使用 UCloud 雲主機 UHost 才能解析

我如何使用 Django + Vue.js 快速構建項目 其中的第九步提到了如何創建 UHost 雲主機

>> 查看任務統計(Web 界面)

包含調用次數,成功率,返回結果,還有花費的CPU時間等信息

consolev3.ucloud.cn/ugc

>> 查看監控(Web 界面)

實例Demo展示

Demo展示:圖片水印與風格化 - 知乎專欄 (此文牢騷有點多,直接看圖)

最後

希望您通過本文了解 Serverless 與 UCloud,歡迎關注 我

So,如果你是公司的研發 Leader ,合適的話,你會擁抱 Serverless 嗎?如果是創業公司呢?

推薦閱讀:

深入淺出新一代雲網路——VPC中的那些功能與基於OpenStack Neutron的實現(三)-路由與隧道
數字化轉型加速 華為要建一個怎樣的生態圈?
Google Drive 支持增量同步嗎?國內使用速度如何?
從跑馬圈地到深耕細作 雲計算競爭態勢悄然轉變

TAG:云计算 | API | Docker |