跨國合作:Serverless Components 在騰訊雲的落地和實踐

騰訊雲+社群發表於2020-12-08

導語 | Serverless Components 是 Serverless Framework 推出的最新解決⽅案,具有基礎設施編排能⼒,開發者通過使⽤ Serverless Components,可以靈活構建、組合和部署 Serverless 應⽤。本文是對騰訊云云函式團隊前端負責人蔡衛峰在雲+社群沙龍online的分享整理,介紹Serverless Components在騰訊雲的落地和實踐,希望與大家一同交流。

 

點選此連結檢視完整直播回放

 

一、Serverless Components 實現原理 

1. Serverless CLI 工具

 

Serverless是一個重開發和部署的產品應用,服務提供了彈性伸縮、自動運維的能力,開發者主要關心開發和部署。所以,開發和部署的體驗對於serverless業務來說是非常重要的。

 

Serverless的函式本身只是提供了計算的資源,要想實現一個完整的應用,必然會涉及到雲上的其他資源,比如閘道器、cdn、資料庫等。

 

如果是控制檯操作,需要在不同的服務之間跳來跳去,比較割裂。如果能有一個基於應用的統一的命令列管理工具,對於開發者必然會方便很多

 

Serverless CLI 是使用者授權後,通過命令列工具,呼叫雲API幫助使用者管理雲資源,方便對雲上資源進行比較完整的操作。

                                 

2. 什麼是 Serverless Framework 

Serverless Framework 現在大量的使用者是 web 服務的開發者,主要定位於 web 服務場景,它是北美研發團隊開源的一個專案,是業界⾮常受歡迎的⽆伺服器應⽤框架,開發者⽆需關⼼底層資源即可部署完整可⽤的 Serverless 應⽤架構。

 

Serverless Framework 定義了一套完整的標準化規範,各公有云的外掛遵循這套規範,通過對雲上資源的編排,覆蓋編碼、除錯、部署、排障等全⽣命週期,幫助開發者通過聯動雲資源,迅速構建 Serverless 應⽤。 

 

3. Serverless Framework CLI

 

Serverless Framework CLI 是一個開源命令列工具,它使用基於事件觸發的計算資源,例如騰訊云云函式,AWS Lambda,阿里雲函式計算等。

 

Serverless Framework 為開發和部署 Serverless 架構提供腳手架,自動化工作流以及最佳實踐。並且它支援通過豐富的外掛進行功能擴充套件。 

 

Serverless Framework 在 Github 有將近 4 萬的 Star,在國外比較受歡迎。我們團隊最開始也維護了一個自己的 CLI,但是維護成本比較高,想做體驗好操作流暢的 CLI 需要投入大量人力精力,Serverless Framework 的 CLI 開發者接受程度比較高,它的協議也開放,所以按照規範接入即可。

 

我們也有使用者原來用 Serverless Framework 的命令列工具,從 AWS 遷移到騰訊云云函式環境時候提出了這樣的要求。對使用者而言底層的雲資源操作是遮蔽的,只需要跟Serverless Framework打交道就可以了,希望我們也可以提供對接 Serverless Framework 的方式,這樣遷移到騰訊雲上比較方便。

 

通過和 Serverless Framework 團隊的溝通,他們正好也有意願打入國內市場,雙方的合作也就水到渠成了。

 

Serverless Framework 強於 CLI 整體的體驗,但是對騰訊雲本身的瞭解比較少,於是就有了基本的合作模式,北美團隊負責 CLI 的開發和整體體驗,騰訊雲團隊負責具體落地到騰訊雲的 components 的開發和維護。雙方合力,打造 Serverless Framework 在國內的實際落地方案。 

 

4. 什麼是 Serverless Components

 

Serverless Components 是 Serverless Framework 的一個解決方案,本身具備快速部署、靈活配置、模板共享的理念。

 

公有云對接 Serverless Framework 後具有了公有云基本的操作能力,但是落地到具體的應用場景就會變得複雜。

 

外部應用不是單純靠計算資源,也會涉及到靜態資源,比如圖片、CSS、JS 檔案的託管和域名的管理,涉及到底層資料庫的管理,也有一些更復雜的應用會涉及到更多的雲上的資源。

 

如果開發者要想實現一個應用的管理,則需要通過一系列的操作才能完成一個應用管理和部署,而 Serverless Components 是為了適配各種具體化的應用場景而開發的模板能力。

 

Serverless Components 是 Serverless Framework 推出的最新解決方案,具有基礎設施編排能力,開發者通過使用 Serverless Components,可以靈活構建、組合和部署 Serverless 應用。

二 、Serverless Components 全生命流程 

 

Serverless Component 部署流程 

 

 

 

Serverless Components 部署的完整全流程,首先讀取 .env 檔案,在 .env 檔案中可以輸入騰訊雲固定的金鑰資訊進行授權,也可以通過微信掃碼賦予 CLI 臨時的授權,授權 Serverless Components CLI 在某一段時間可以操作雲上某些資源的能力。

 

同時在 .env 檔案裡面可以注入相應環境變數,你可以直接在 serverless.yml 中通過 ${env} 的方式,直接引用環境變數配置(包含 .env 檔案中的環境變數配置,以及手動配置在環境中的變數引數)。

 

接著讀取 yaml 配置。yaml 檔案要指定使用到的元件名以及元件相應的輸入引數,每個元件因為涉及的操作會不一樣,所以每個元件對引數也有自己的一套固定的規範。

 

通過 CLI 的命令進行部署的時候,會把使用者程式碼壓縮之後上傳。首先壓縮指定的程式碼目錄,上傳到一個公共的 COS 裡面。然後新建或者更新元件的狀態,同時會在服務端把程式碼下載下來,並注入 Proxy 程式碼。

 

proxy 程式碼都實現了什麼能力呢?雲函式主要的適用場景是事件驅動型的,對於 http 請求的實現是通過 API 閘道器觸發器轉發的。閘道器接收到的 http request 會轉換為雲函式需要的引數物件,在函式執行包裝後的 web 框架,執行完後再把 http response 轉換成 API Gateway 需要的結構返回給閘道器,閘道器再把 response 轉換成標準的 http response 返回,這樣就實現了整個 HTTP 的訪問。

 

使用者不需要關注這部分的實現,按照正常的開發就可以,Components 部署的時候會自動注入這部分轉換邏輯的程式碼。服務端在注入完 proxy 程式碼後會把程式碼上傳到使用者 COS 裡面,然後建立或更新雲函式,同時會再建立或者更新 API 閘道器的配置。

 

這個時候再把整個建立的過程以及建立的狀態儲存到服務端,控制檯再輸出整個元件最終需要給使用者看到的一些雲上資源的資訊,比如 SCF 的資訊、API 閘道器的資訊、CDN 的資料和資料庫資訊等,整個部署就算是完成了。

 

應用部署完後會返回 API 閘道器公用的二級域名的一個訪問地址,跟正常的函式與自己組裝資源去訪問應用方式是一樣的。

 

大家可以看到,我們抹平了一些雲函式和正常伺服器差異化的實現,抹平後通過 Serverless Components 可以不用關心這些特殊的邏輯邏輯,也不需要關心其他的雲上的資源。

 

如果自己要建立一個應用,同時要建立雲函式,程式碼裡面要自己轉換 HTTP 請求,然後建立一個觸發器繫結到雲函式。

 

如果需要做靜態資源的加速,需要拆分靜態資源部署到 COS,並配置一個 CDN。這中間涉及到多個雲資源的操作。而我們在 Serverless Components 中已經將整套都實現了,只需要在 yaml 檔案裡把這些配置進去就可以,部署完成後就可以看到你的應用了。

 

三、Components生態建設

 

1. Serverless Components 生態

            

如上圖所示,其中列舉了一些使用者使用比較多的 Serverless Components 元件,還有一些沒有列舉出來的,這些基礎的元件包括了騰訊雲上的各種常用的基礎資源。可以通過對多個元件的組合來組成完整的應用,也可以直接使用現有的高階元件。

 

我們也歡迎第三方開發者貢獻他們的元件,現在就已經有很多第三方的開發者在貢獻他們的元件。

 

2. Serverless Next.js

  

 

接下來詳細介紹一個 Serverless Components 的具體實現。以 Next jS 專案為例,首先是初始化一個專案,安裝 CLI,原來的專案不需要做什麼改動,按照 Serverless Components 要求的規範進行配置後,直接用命令列工具進行部署。

 

執行部署後 component 會幫使用者通過 CLI 進行程式碼的構建,完成構建後會把程式碼部署到雲函式上,建立 API 閘道器代理 web 服務,同時部署靜態資源,會把目錄下的靜態檔案自動拆分,並部署到 COS 上面。

 

我們後面也會做更加智慧化的優化,next 框架程式碼比較大,每次部署都要上傳兩三百兆程式碼,對上傳的效率和啟動效率也有影響。

 

騰訊雲提供 layer 的能力,我們會自動拆分使用者的n ode_modules 到 layer,之後的部署只需要把業務程式碼上傳和部署就可以了,對部署效率有很大的提升。

 

這裡是部署一個有一些複雜度的 next 應用的螢幕截圖,可以看到完成部署僅需 31 秒,部署效率非常高

 

 

四、跨國合作:挑戰和收穫

 

1. 跨國合作:挑戰 

 

從開始合作到現在已經有一年多了,還在不斷的磨合中。下面是我總結下來的,我們在一年多的合作裡面具體的挑戰,與大家一起分享交流。

 

(1)溝通效率

 

 由於時差,語言表達,以及東西方思考方式的差異,導致整體的溝通效率比較低 。

 

(2)開發模式

 

他們那邊是游擊隊的開發模式,有一些研發釋出比較隨意,導致了一些線上的問題。而我們其實是有比較嚴格的開發流程,釋出前的驗證,釋出後的確認,監控告警的體系等等,都有嚴格的要求。

 

慢慢把我們這一套嚴格的規範灌輸給他們,並要求他們能夠按照我們的要求執行。 

 

(3)問題定位

 

由於整套體系比較龐大,大家在前面也看到了,一個完整的 component 的生命流程比較長,步驟比較多,之前也沒有統一的日誌收集體系和系統,導致出現了使用者問題定位花費比較長的時間。 

 

(4)目標

 

兩個團隊的目標導向不完全一樣,我們更注重使用者雲上資源的安全,對於金鑰的使用及許可權控制比較嚴格,而他們更多的考慮的是使用上的便利。

 

(5)人才招聘

 

整套體系採用 nodejs 開發,涉及到後端、儲存、資料庫等方方面面,對於開發的要求比較高。

 

另外,需要開發和產品有技術運營的理念,有開放的心態。對於英語也有一定的要求,最好能和北美的開發團隊直接對話。

 

(6)運營理念的問題

 

國內外開發者習慣是有差別的,國外比較多的開發者更容易接受命令列工具,而國內開發者對這套東西不熟悉,需要有一個接受的過程。

 

我們也會做一些妥協,比如後面可以考慮提供介面化的配置方式等。其實對於 Serverless Framework 與 Serverless Components,騰訊雲本地化的運營方式和引導上跟國外會有所差別,我們會針對國內開發者做一些貼合開發者習慣的嘗試。

   

其實在跨國合作中涉及 CLI 的時候,我們一直很迷惑。雖然我們很想把事情做好,但是對命令列工具的設計和互動設計方面受限於騰訊雲的產品,無法突破自己的框架。

 

通過跟北美團隊的交流合作,對我們的思路也有很大的開拓,我們跟他們學習到了他們的產品設計理念,在產品設計方面,AWS 和周圍的生態確實對於我們是很好的借鑑意義。

 

進行大型開源專案的實現,合作過程中對協作方式也學習到了不少,對於整個後期的開源專案推進,後面再去參加別的開源專案,對於我們而言都是非常寶貴的經驗。

 

同時,我們也把嚴格的軟體開發經驗輸出給北美,並獲得了他們的認可,對於我們而言也是比較自豪的一件事。以前軟體開發方面北美領先於我們,所有方面我們向他們學習。現在並不完全是這樣了,我們比較嚴格的軟體開發規範比他們走得更靠前,把我們的規範輸出給他們的同時也得到了北美團隊的認可。

 

2. 跨國合作:收穫 

 

  • 學習先進的互動設計以及產品設計理念;

  • 以AWS的理念要求我們自己的產品;

  • 大型開源專案的協作方式;

  • 輸出嚴格的軟體開發規範,獲得認可;

  • 同型別開源專案的借鑑和學習,開闊視野。

 

同型別開源專案的借鑑和學習開拓了我們的視野,北美團隊也會經常發一些他們能夠了解到的資訊同步給我們,我們能夠從中得到借鑑和學習,並得到自己的增長。所以未來也會更加緊密合作。

 

Q&A

 

Q:Serverless現階段適用和適用的場景,騰訊內部有哪些業務在用?

A:所有的場景都是可以的。小程式雲開發底層雲函式的能力就是用我們 Serverless 的實現,騰訊內部還有比如微信支付、微信讀書、騰訊視訊、騰訊課堂有不少場景在用 Serverless 的服務。

 

Q:部署而言Serverless相對TKE有什麼優勢和劣勢?

A:TKE 本身是需要自己管理的,但是 Serverless 在計算資源方面完全不需要自己去管理,我們有一個完全的動態彈性伸縮能力,會根據訪問的請求量去做自動的伸縮,基本上省去了運營的需要。

   

Q:監控方面有什麼成熟元件的接入?

A:正常的外部應用都是可以接入的,和虛擬機器、容器等計算資源使用的方式相同。我們平臺也提供了一些基礎的監控和日誌能力,另一方面,也在聯合騰訊雲的監控團隊做了自定義監控元件上報能力的接入,可以在程式碼裡面自定義的上報到騰訊雲監控,自定義監控平臺可以看到監控的資料。

   

Q:Serverless對業務較複雜的大型專案是否適合?

A:肯定適合,比如微信支付、微信讀書、騰訊視訊、騰訊課堂都有不少場景在用Serverless的服務。

   

Q:穩定性保障的情況如何?

A:Serverless 是基於騰訊雲整套體系來建設的,穩定性方面也是經過了大規模的壓測,有可靠的保障。比較大型的專案提前跟架構師溝通,來做資源的預留或者是資源等級的提升

 

Q:學習路線是什麼?

A:部署自己的業務到 Serverless 服務上面來,可以在實踐中不斷的熟悉。還可以加入我們的微信或者qq群,和大量的開發者一起學習和探討,這樣在不斷的討論和學習過程中可以得到不斷的成長。有使用上的疑問或者問題也可以直接和我們的開發或者架構師溝通。

   

Q:冷啟動支援需要有低延時的應用嗎?

A:如果對冷啟動比較敏感的業務,可以通過預置併發來應對冷啟動的問題,設定了預置併發後,服務保留一定的最小資源量,這些資源量長時間存在,更大的併發到來時再通過自動伸縮去拉起,就可以保證服務既可以解決低延時的問題也可以應對大請求的流量

   

Q:如果部署在騰訊雲的Serverless服務受到DDoS攻擊怎麼收費?

A:使用者可以設定併發的上限,更多的請求自動幫著擋住,不會把這些流量放進來,實際消費用到消耗的 Serverless 請求才會收費,其他的擋在控制併發外的請求我們不會收費。

   

Q:平臺具體實施中如何避開Serverless的劣勢?

A:關於 Serverless 的劣勢,一是冷啟動,二是開發習慣的一些改變,這些劣勢可以通過一些手段避開。冷啟動的問題可以通過預置併發等高階能力解決,web 場景用 Serverless Components 的能力就可以幫助抹平中間的差異

   

Q:企業應該如何設定Serverless Components?

A:要看具體的應用場景,騰訊內部的團隊在使用上也有各種差別,主要還是依賴具體的應用場景和需求。

   

Q:Java這種啟動慢的語言,未來可以在Serverless上應用嗎?

A:其實國內 java 開發者比較多,我覺得這是非常有潛力的發展方向,我們也在考慮啟動比較慢的 java 應用如何部署到 SCF 上面,這是我們努力的一個方向。

相關文章