昨天,棧長應(yīng)騰訊云小伙伴邀請參加了Techo Day 技術(shù)開放日的線上活動,這一期的主題是”輕量級云開發(fā)與云應(yīng)用“,包括輕量級應(yīng)用服務(wù)器、容器和中間件、云開發(fā)、微服務(wù)、大數(shù)據(jù)、安全等領(lǐng)域的應(yīng)用和原理等。
這其中有一項技術(shù)講解——Serverless讓我感觸比較深。這門課打破了我對軟件開發(fā)領(lǐng)域的定義。
在現(xiàn)代越來越強(qiáng)大的云計算加持下,我們大量運(yùn)用了一些云組件,比如:
- IaaS(基礎(chǔ)設(shè)施即服務(wù))
- PaaS(平臺即服務(wù))
- SaaS(軟件即服務(wù))
沒錯,即使云服務(wù)應(yīng)用再多,我們也僅限在 “SaaS(軟件即服務(wù))” 層面的應(yīng)用。
但這門課程提到的,是傳統(tǒng)的 “SaaS(軟件即服務(wù))” 不再是顆粒度最小的云服務(wù)器了,取而代之的是,你可以理解為 “方法級別” 的云服務(wù),即可以以方法作為獨(dú)立載體被部署在云上,顆粒度更小、靈活性更強(qiáng),可以獲得盡可能大的彈性。
大部分人看到 Serverless 仍是一知半解,所以我想有必要給大家做個專題分享,包括 Serverless 的正確理解及實現(xiàn)方案,以及騰訊云的 Serverless 是如何應(yīng)用的。
Serverless 到底是什么?
Serverless 介紹
現(xiàn)在 Serverless 很火啊,到處都是人,包括 Spring 都已經(jīng)支持 Serverless 適配了,棧長當(dāng)初看到這個名詞的時候以為是指 “無服務(wù)器”,相信很多人也會這樣以為,不過不要理解錯了,棧長在這里掃個盲。
Serverless 是指 “無服務(wù)器架構(gòu)”,這里的 “無服務(wù)器” 并不是指程序不需要服務(wù)器運(yùn)行,而是指我們的開發(fā)工作不需要關(guān)注服務(wù)器底層的資源,比如我們部署應(yīng)用時,經(jīng)常遇到以下一些服務(wù)器及基礎(chǔ)設(shè)施的相關(guān)工作:
- 應(yīng)用需要用多少臺服務(wù)器?
- 應(yīng)用需要用多少帶寬?
- 應(yīng)用需要用什么操作系統(tǒng)?
- 應(yīng)用需要運(yùn)行多少個實例?
- 應(yīng)用需要用到什么容器,怎么調(diào)度?
- 等等……
這些工作在傳統(tǒng)的業(yè)務(wù)中需要運(yùn)維人員和開發(fā)人員一起協(xié)調(diào)完成,而 Serverless 的到來,我們通通都不用管了,Serverless 幫我們?nèi)ネ瓿蛇@些,程序員只需要關(guān)注業(yè)務(wù)邏輯本身即可。
來看 Spring Serverless 第一張圖就明白了:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
Serverless 只需要關(guān)注一件事:函數(shù)??!
這里的 FaaS 就是 Serverless 最基本的一種表現(xiàn)形式。
Serverless 優(yōu)勢
Serverless 具有資源編排、自動伸縮、事件驅(qū)動等能力,覆蓋編碼-調(diào)試-測試-部署等全生命周期,減少維護(hù)基礎(chǔ)設(shè)施的成本和風(fēng)險,利用云的能力可以更迅速的擴(kuò)展。
我們來看下面這張圖:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
我們可以看到,Serverless 始終能滿足日益增長的需求,并能對資源做到靈活動態(tài)調(diào)整,一方面能在閑時減少資源以避免浪費(fèi),另一方面,即使流量溢出也能應(yīng)對。
這里總結(jié)下 Serverless 的優(yōu)勢:
高可用: 如多活、容災(zāi)、擴(kuò)容、備份等能力,這些都不在話下;
高彈性: 以方法為部署載體,比微服務(wù)更微,獲得極致彈性;
輕運(yùn)維: 免去大量的運(yùn)維工作,專注核心開發(fā)業(yè)務(wù),大大節(jié)省工作量;
等等……
Serverless 實現(xiàn)方案
Serverless 經(jīng)常不會單獨(dú)出現(xiàn),還有以下兩個衍生概念,也是目前最常見的 Serverless 實現(xiàn)方案:
FaaS(函數(shù)即服務(wù)) + BaaS(后端即服務(wù))
Function as a Service (FaaS)
Function as a Service(FaaS)函數(shù)即服務(wù),這也是 Serverless 的基石,它是比 SaaS(軟件即服務(wù))/ BaaS(后端即服務(wù)) 更小的載體,每一個函數(shù)就是一個服務(wù),函數(shù)之間相互獨(dú)立。
我們來看一張基于 FaaS 的架構(gòu)圖:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
基于 FaaS 服務(wù)器底層的關(guān)系從下到上依次是這樣的:
物理服務(wù)器(IaaS) > 虛擬機(jī)(PaaS) > 容器(PaaS) > 函數(shù)(FaaS)
函數(shù)(也可以說方法)顆粒度更小,可以幫助應(yīng)用獲得極致彈性。
Backend as Service(BaaS)
Backend as a Service(Baas)后端即服務(wù),即為應(yīng)用提供后端云服務(wù),可以理解為 PaaS 和 SaaS 之間的一種服務(wù),它也是 Serverless 架構(gòu)中的一種表現(xiàn)形式,大量開箱即用的后端云上功能提升研發(fā)效能。
后端服務(wù) BaaS 并不是必須的,F(xiàn)aaS 和 BaaS 都屬于 Serverless 架構(gòu)不同的表現(xiàn)形式,也可以說是 FaaS 和 BaaS 是 Serverless 架構(gòu),它們是相輔相成的。
騰訊云 Serverless
基本介紹
騰訊云中的 Serverless 是指 Serverless Cloud Function,簡稱:SCF,也可以叫 “云函數(shù)”,是騰訊云提供的 Serverless 服務(wù),騰訊云用戶無需購買云服務(wù)器和虛擬機(jī),代碼即可在騰訊云基礎(chǔ)設(shè)施上彈性、安全地運(yùn)行,支持所有主流的編程語言。
官方文檔:
https://cloud.tencent.com/document/product/583
騰訊云函數(shù)的魅力如下:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
棧長了解到的情況如下:
- 按量付費(fèi): 沒有用戶訪問時不花錢,可節(jié)約服務(wù)器開銷 30%;
- 超低運(yùn)維成本: 無需學(xué)習(xí)服務(wù)器知識,大幅度降低運(yùn)維成本;
- 彈性伸縮: 自動彈性伸縮,上不封頂,下可到 0;
- 超高并發(fā): 每秒最高支持 10 萬并發(fā)請求數(shù);
整個請求邏輯如下:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
雖然我們只需要寫云函數(shù),但前面會有一道 API 網(wǎng)關(guān),是云函數(shù)的主要入口,它提供 HTTP 接口、參數(shù)校驗、鑒權(quán)、限流、自定義域名、自動化文檔等功能,這也是對云函數(shù)的強(qiáng)大支撐。
解決方案
通用解決方案
結(jié)合 API 網(wǎng)關(guān),騰訊云函數(shù)提供基于小程序,H5,WEB 服務(wù),微服務(wù),REST API 等通用 HTTP 解決方案:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
云函數(shù)無處不在,支持常用的、主流的客戶端載體,現(xiàn)在都支持上了云函數(shù)。
這也讓我聯(lián)想到的一個云函數(shù)的優(yōu)勢:
比如我們寫個 JavaScript 函數(shù)部署到了云端,然后客戶端再調(diào)用該云函數(shù),而不是像傳統(tǒng)軟件開發(fā)將函數(shù)直接內(nèi)嵌在客戶端代碼中,這樣在安全方面也能杜絕前端代碼被破譯的可能。
所以,用上云函數(shù)真香!
Serverless 應(yīng)用中心:
https://cloud.tencent.com/product/sls
彈性微服務(wù) TEM
隨著團(tuán)隊和業(yè)務(wù)規(guī)模的發(fā)展,后端服務(wù)逐漸從單體架構(gòu)演變成微服務(wù)架構(gòu),微服務(wù)架構(gòu)提供敏捷開發(fā)、靈活部署和高擴(kuò)展性的同時,也增加了服務(wù)治理和運(yùn)維的復(fù)雜度,提高了技術(shù)門檻。
彈性微服務(wù)(Tencent Cloud Elastic Microservice,TEM)是面向微服務(wù)應(yīng)用的 Serverless 平臺,實現(xiàn) Serverless 與微服務(wù)的完美結(jié)合,提供開箱即用的微服務(wù)解決方案,提供應(yīng)用托管、服務(wù)注冊發(fā)現(xiàn)、微服務(wù)治理、多維度監(jiān)控等能力,支持 Zookeeper、Nacos、Consul 等注冊中心。
產(chǎn)品地址:
https://cloud.tencent.com/product/tem
我們來看官網(wǎng)的架構(gòu)圖:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
通過它我們可以快速構(gòu)建微服務(wù)應(yīng)用,只需要實現(xiàn)我們自己的微服務(wù)即可(灰色區(qū)域),這樣就能大幅提升運(yùn)維效率,降低服務(wù)治理的復(fù)雜度與技術(shù)門檻,有更多的時間去聚焦核心業(yè)務(wù)本身。
騰訊云函數(shù)初體驗
棧長也第一時間拿到了騰訊云小伙伴給我的實驗資格,終于體驗了一把 Serverless 的魅力!
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
安裝 TCCLI
TCCLI 是管理騰訊云資源的統(tǒng)一工具,可以快速調(diào)用騰訊云 API 來管理您的騰訊云資源。
官方文檔:
https://cloud.tencent.com/document/product/440/6176
需要安裝 Python 環(huán)境和 pip 工具,Python 版本必須為 2.7 及以上版本。
這里我們使用使用yum安裝Python3:
yum install python3 -y
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
安裝 Python3 會同時安裝一些相關(guān)的依賴包,比如 pip。
再執(zhí)行下面的命令安裝 TCCLI:
sudo pip3 install tccli
安裝完成之后,執(zhí)行以下命令,檢測是否安裝成功:
tccli –version
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
TCCLI 安裝成功了。
啟用命令自動補(bǔ)全
TCCLI 提供了一個自動補(bǔ)全的功能,可以使用下面的命令進(jìn)行啟用:
echo “$(which tccli_completer)” && complete -C “$(which tccli_completer)” tccli
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
開通云函數(shù)
點擊登錄騰訊云控制臺,開通云函數(shù)服務(wù):
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
完成以后,自動進(jìn)入概覽控制面板,這里可以看到各種 SCF 應(yīng)用的調(diào)用統(tǒng)計信息:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
配置 TCCLI
首先要獲取訪問密鑰,訪問密鑰是構(gòu)建騰訊云 API 請求的重要憑證,調(diào)用任何一個騰訊云 API 都需要提供訪問密鑰,一對完整的訪問密鑰包括 SecretId 和 SecretKey 兩部分。
進(jìn)入訪問管理控制臺,找到【訪問密鑰】- 【API密鑰管理】,并在其中新建一個訪問密鑰:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
再進(jìn)行 TCCLI 初始化配置,使其完成使用云 API 的必要前提條件:
tccli configure
進(jìn)入交互模式,TCCLI 會要求提供 SecretId 和 SecretKey 等信息,配置完成后,可測試下使用 CLI 拉取云主機(jī)列表:
tccli cvm DescribeInstances
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
OK,配置成功了。
創(chuàng)建云函數(shù)
下面我們來創(chuàng)建一個無服務(wù)器云函數(shù),并且調(diào)用它。
mkdir -p /data/hello && touch /data/hello/hello.py
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
這里實驗?zāi)J(rèn)用的是 Python,云函數(shù)支持所有主流編程語言。
部署云函數(shù)
現(xiàn)在開始部署上面的云函數(shù):
tccli scf CreateFunction –FunctionName “hello” –Code ‘{“ZipFile”:”‘$(cd /data/hello && zip -r – * | base64 | tr -d “”)'”}’ –Handler “hello.main_handler” –Description “My first scf”
部署成功后,會有 Success 的返回。
管理云函數(shù)
再次進(jìn)入控制臺,可以看到剛部署好的云函數(shù):
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
點擊該函數(shù)進(jìn)入函數(shù)管理頁面:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
其實在這個控制臺頁面也可以新建、編輯、上傳、部署云函數(shù)。
測試云函數(shù)
新建一個測試模板發(fā)起測試:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
點擊測試按鈕:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
成功返回了,日志也輸出了,到這里我就全程體驗了一把云函數(shù)。
回到實驗頁面,退出實驗。
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
騰訊云函數(shù)再體驗(Java)
創(chuàng)建云函數(shù)
實驗?zāi)J(rèn)使用的是 Python,并且會要安裝、配置很多東西,那是實驗臺,而在真實控制臺是不需要這么麻煩的流程的,我們到控制臺來創(chuàng)建一個 Java 云函數(shù)試試。
在函數(shù)服務(wù)中點擊新建按鈕,官方有很多內(nèi)置的 Java 云函數(shù)模板,我們選擇一個 Java 8 相關(guān)的模板進(jìn)行快速創(chuàng)建,當(dāng)然也可以從 0 開始。
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
創(chuàng)建成功了。
部署云函數(shù)
現(xiàn)在進(jìn)去部署吧:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
下載示例代碼,然后上傳部署即可。
Java 云函數(shù)的核心代碼其實就是一個基于 Spring Boot 的接口:
@RestController@SpringBootApplicationpublic class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @GetMapping(“/hello”) public String hello(@RequestParam(value = “name”, defaultValue = “World”) String name) { return String.format(“Hello %s!”, name); }}
測試云函數(shù)
部署成功后,現(xiàn)在發(fā)起測試:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
Java 云函數(shù)也成功了!
云函數(shù)的魅力
棧長體驗了兩把云函數(shù),最大的感受就是不需要自己運(yùn)維服務(wù)器了,包括環(huán)境配置、JDK 安裝配置、權(quán)限、開放端口、日志、網(wǎng)絡(luò)等設(shè)置全都內(nèi)置或者有自定義配置。
下面我們來看幾個配置頁面。
各種函數(shù)的配置管理:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
流量設(shè)置,可以做灰度發(fā)布:
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
并發(fā)配額,可以設(shè)置函數(shù)獨(dú)占配額、函數(shù)預(yù)置并發(fā)數(shù):
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
實操教學(xué) 用Serverless 分分鐘部署一個 Spring Boot 應(yīng)用,真香!
還有更多配置,這里就不一一介紹了。
總結(jié)
看到這里,想必大家對 Serverless 有了一定程序的認(rèn)識了,總之,程序員要做的只是上傳函數(shù)代碼而已,其他一切底層資源都可以在云上管理,并且是函數(shù)級別的資源管理,再結(jié)合騰訊云的各種云能力,簡直不要太香了。
當(dāng)然,這也會產(chǎn)生一定的費(fèi)用,但都是按量付費(fèi)的,并且可以按需要自動彈性調(diào)整,肯定要比自己全套搞要劃算,畢竟連運(yùn)維和服務(wù)器都省了,最重要的是省心、省時間。
>來源公眾號:Java技術(shù)棧