配置HTTP觸發(fā)器并使用gRPC觸發(fā)
函數(shù)計(jì)算支持HTTP觸發(fā)器,配置HTTP觸發(fā)器的函數(shù)可以通過(guò)gRPC請(qǐng)求被觸發(fā)執(zhí)行。此時(shí)函數(shù)可以看做一個(gè)gRPC Server,處理gRPC請(qǐng)求并將處理結(jié)果返回給調(diào)用端。本文介紹如何在函數(shù)計(jì)算控制臺(tái)配置HTTP觸發(fā)器并使用gRPC請(qǐng)求觸發(fā)函數(shù)。
使用說(shuō)明
調(diào)用方式
域名:支持使用子域名
fcapp.run
或自定義域名調(diào)用gRPC函數(shù),不支持使用舊域名fc.aliyuncs.com
調(diào)用gRPC函數(shù)。說(shuō)明如果需要使用自定義域名,自定義域名需要配置請(qǐng)求路徑與函數(shù)的映射關(guān)系。建議您將請(qǐng)求的路徑配置為
/*
,可以讓所有g(shù)RPC請(qǐng)求都轉(zhuǎn)發(fā)到對(duì)應(yīng)的gRPC函數(shù)中,gRPC函數(shù)會(huì)將請(qǐng)求路由到客戶端定義的gRPC方法。端口:gRPC請(qǐng)求端口為
8089
。
傳輸安全性
為保證gRPC請(qǐng)求的安全性,函數(shù)計(jì)算線上環(huán)境僅支持使用TLS協(xié)議的客戶端。否則,請(qǐng)求會(huì)報(bào)錯(cuò)
rpc error: code = Unavailable desc = connection closed before server preface received
。自定義域名支持使用自定義HTTPS證書(shū),gRPC服務(wù)端不需要定義TLS證書(shū)驗(yàn)證,函數(shù)計(jì)算網(wǎng)關(guān)層會(huì)進(jìn)行TLS驗(yàn)證。
請(qǐng)求超時(shí)控制
gRPC請(qǐng)求的最長(zhǎng)超時(shí)時(shí)間不得超過(guò)函數(shù)的執(zhí)行超時(shí)時(shí)間。執(zhí)行超時(shí)時(shí)間默認(rèn)為60秒,最長(zhǎng)為86400秒。
請(qǐng)求并發(fā)度控制
gRPC請(qǐng)求受函數(shù)計(jì)算并發(fā)度的控制。一個(gè)gRPC請(qǐng)求被視為占用一個(gè)并發(fā)度。gRPC的協(xié)議基于HTTP/2,在函數(shù)計(jì)算中,對(duì)于一個(gè)函數(shù)實(shí)例而言,分配到這個(gè)函數(shù)實(shí)例的gRPC請(qǐng)求會(huì)復(fù)用同一條HTTP/2連接,則這條HTTP/2連接上的并發(fā)流就等于實(shí)例的并發(fā)度。您可以設(shè)置函數(shù)的單實(shí)例并發(fā)度來(lái)控制一個(gè)實(shí)例上的并發(fā)流數(shù)量。具體操作,請(qǐng)參見(jiàn)設(shè)置實(shí)例并發(fā)度。
負(fù)載均衡
函數(shù)計(jì)算支持將gRPC請(qǐng)求分發(fā)到不同的實(shí)例上,自動(dòng)為gRPC請(qǐng)求做負(fù)載均衡。
計(jì)費(fèi)方式
gRPC有以下四種請(qǐng)求類型:
普通gRPC請(qǐng)求
客戶端流式請(qǐng)求
服務(wù)端流式請(qǐng)求
雙向流式請(qǐng)求
不同請(qǐng)求類型對(duì)應(yīng)的計(jì)費(fèi)方式不同,具體如下:
普通gRPC請(qǐng)求:計(jì)費(fèi)方式與使用HTTP的計(jì)費(fèi)方式完全一致。
對(duì)于并發(fā)度設(shè)置為1的函數(shù),計(jì)費(fèi)時(shí)間從gRPC連接建立開(kāi)始到gRPC連接斷開(kāi)結(jié)束。
對(duì)于并發(fā)度大于1的函數(shù),實(shí)例的計(jì)費(fèi)時(shí)間從收到第一個(gè)gRPC連接建立開(kāi)始,到最后一個(gè)gRPC連接斷開(kāi)結(jié)束。一個(gè)實(shí)例中多個(gè)連接同時(shí)存在期間,不會(huì)被重復(fù)計(jì)費(fèi)。
如下圖所示,一個(gè)函數(shù)的并發(fā)度設(shè)置為2,第一個(gè)請(qǐng)求到達(dá)的時(shí)間為T1,結(jié)束時(shí)間為T3,第二個(gè)請(qǐng)求到達(dá)時(shí)間為T2,結(jié)束時(shí)間為T4,計(jì)費(fèi)時(shí)間為T4-T1,其中T2到T3這段時(shí)間只會(huì)被計(jì)費(fèi)一次,不會(huì)被重復(fù)計(jì)費(fèi)。
客戶端流式、服務(wù)端流式和雙向流式請(qǐng)求:實(shí)例的計(jì)費(fèi)從第一個(gè)gRPC連接開(kāi)始,到最后一個(gè)gRPC連接斷開(kāi)結(jié)束。
準(zhǔn)備工作
準(zhǔn)備gRPC函數(shù)代碼
您可以自己編寫(xiě)代碼,也可以在安裝并配置Serverless Devs工具后執(zhí)行s init fc-custom-golang-grpc
,下載一套完整的使用Golang語(yǔ)言,在函數(shù)計(jì)算運(yùn)行g(shù)RPC服務(wù)的示例代碼。完整的代碼目錄結(jié)構(gòu)如下所示,其中./greeter_client
目錄為客戶端代碼,./code
目錄為服務(wù)端代碼。
fc-custom-golang-grpc
├── build-image
│ └── Dockerfile
├── certificate
├── code
│ ├── bootstrap
│ └── main.go
├── go.mod
├── greeter_client
│ ├── main
│ └── main.go
├── Makefile
├── privatekey
├── proto
│ ├── helloworld_grpc.pb.go
│ ├── helloworld.pb.go
│ └── helloworld.proto
├── readme.md
├── s_en.yaml
└── s.yaml
準(zhǔn)備ZIP代碼包
在項(xiàng)目目錄fc-custom-golang-grpc
,執(zhí)行make deploy
,會(huì)在./code
目錄下生成二進(jìn)制文件bootstrap
,將其打包為bootstrap.zip
。
安裝依賴
在項(xiàng)目目錄fc-custom-golang-grpc
,執(zhí)行go mod vendor
安裝運(yùn)行g(shù)RPC客戶端需要的依賴。
使用控制臺(tái)部署函數(shù)
前提條件
操作步驟
- 登錄函數(shù)計(jì)算控制臺(tái),在左側(cè)導(dǎo)航欄,單擊服務(wù)及函數(shù)。
- 在頂部菜單欄,選擇地域,然后在服務(wù)列表頁(yè)面,單擊目標(biāo)服務(wù)。
- 在函數(shù)管理頁(yè)面,單擊創(chuàng)建函數(shù)。
在創(chuàng)建函數(shù)頁(yè)面,選擇使用自定義運(yùn)行時(shí)創(chuàng)建方式,設(shè)置相關(guān)參數(shù),然后單擊創(chuàng)建。
需要設(shè)置的參數(shù)說(shuō)明如下,其余參數(shù)保持默認(rèn)值即可。更多參數(shù)信息,請(qǐng)參見(jiàn)創(chuàng)建函數(shù)。
函數(shù)名稱:設(shè)置您要?jiǎng)?chuàng)建的函數(shù)名稱,例如grpc-demo。
請(qǐng)求處理程序類型:選擇處理 HTTP 請(qǐng)求。
運(yùn)行環(huán)境:選擇Debian 9。
代碼上傳方式:選擇通過(guò) ZIP 包上傳代碼。
代碼包:選擇并上傳您已打包的
bootstrap.zip
文件。啟動(dòng)命令:如不填寫(xiě),默認(rèn)執(zhí)行
./bootstrap
。監(jiān)聽(tīng)端口:監(jiān)聽(tīng)端口與服務(wù)端監(jiān)聽(tīng)的端口保持一致,本文示例值為8089。
在函數(shù)詳情頁(yè)面,單擊觸發(fā)器管理頁(yè)簽,查看觸發(fā)器的公網(wǎng)訪問(wèn)地址。
執(zhí)行以下命令調(diào)用gRPC客戶端,發(fā)起gRPC調(diào)用,測(cè)試函數(shù)的正確性。
go run ./greeter_client -addr grpc-demo-service-*********.cn-qingdao.fcapp.run:8089
您也可以為您創(chuàng)建的gRPC函數(shù)配置自定義域名,并使用自定義域名調(diào)用該函數(shù)。
使用Serverless Devs工具部署函數(shù)
前提條件
操作步驟
執(zhí)行以下命令,初始化項(xiàng)目。
s init fc-custom-golang-grpc -d fc-custom-golang-grpc
執(zhí)行以下命令,進(jìn)入項(xiàng)目目錄
fc-custom-golang-grpc
。cd fc-custom-golang-grpc
可選:編輯s.yaml文件。
示例如下:
edition: 1.0.0 name: hello-world-app # access為當(dāng)前應(yīng)用所需要的密鑰信息 # 密鑰配置可以參考:https://www.serverless-devs.com/serverless-devs/command/config # 密鑰使用順序可以參考:https://www.serverless-devs.com/serverless-devs/tool# access: "default" vars: # 全局變量 region: "cn-hangzhou" # 您要部署的函數(shù)所在的地域 service: name: "grpc-demo" # 您要部署的函數(shù)所在的服務(wù)名稱 description: 'hello world by serverless devs' internetAccess: true services: helloworld: # 您自定義的業(yè)務(wù)名稱或模塊名稱 # 如果只想針對(duì)helloworld下面的業(yè)務(wù)進(jìn)行相關(guān)操作,可以在命令行中加上helloworld,例如,只對(duì)helloworld進(jìn)行構(gòu)建:s helloworld build # 如果不帶有helloworld,而是直接執(zhí)行s build,工具則會(huì)對(duì)當(dāng)前Yaml下,所有和helloworld平級(jí)的業(yè)務(wù)模塊(如有其他平級(jí)的模塊,例如下面注釋的next-function),按照一定順序進(jìn)行build操作 component: fc actions: # 自定義執(zhí)行邏輯,關(guān)于actions的使用,可以參考:https://www.serverless-devs.com/serverless-devs/yaml pre-deploy: # 在deploy之前運(yùn)行 - run: make build path: ./ # - component: fc build --use-docker --dockerfile ./code/Dockerfile # 要運(yùn)行的組件,格式為【component: 組件名 命令 參數(shù)】(可以通過(guò)s cli registry search --type Component 獲取組件列表) # - run: docker build xxx # 要執(zhí)行的系統(tǒng)命令,類似于一種鉤子的形式 # path: ./src # 執(zhí)行系統(tǒng)命令/鉤子的路徑 # - plugin: myplugin # 運(yùn)行的插件(可以通過(guò)s cli registry search --type Plugin獲取插件列表) # args: # 插件的參數(shù)信息 # testKey: testValue # post-deploy: # 在deploy之后運(yùn)行 # - component: fc versions publish # 要運(yùn)行的命令行 props: region: ${vars.region} service: ${vars.service} # logConfig: # project: mypro-dev # logstore: function-log function: name: "golang-grpc" # 您要部署的函數(shù)名稱 description: 'hello world by serverless devs' timeout: 30 memorySize: 512 runtime: custom codeUri: ./code instanceConcurrency: 3 caPort: 8089 triggers: - name: http2Trigger type: http config: authType: anonymous # HTTP觸發(fā)器的觸發(fā)方式配置,必須配置POST方式 methods: - GET - POST # customDomains: # - domainName: auto # protocol: HTTP,HTTPS # routeConfigs: # - path: /* # serviceName: "grpc-demo" # functionName: "golang-grpc" # certConfig: # certName: certtest # certificate: ./certificate # privateKey: ./privatekey
執(zhí)行
s deploy -y
部署函數(shù)。執(zhí)行完成后,函數(shù)將部署至函數(shù)計(jì)算。此外,函數(shù)計(jì)算會(huì)生成一個(gè)可直接訪問(wèn)的URL地址,您可以使用該URL地址調(diào)用函數(shù)進(jìn)行測(cè)試。
執(zhí)行以下命令,安裝運(yùn)行g(shù)RPC客戶端所需的依賴。
go mod vendor
執(zhí)行以下命令,調(diào)用gRPC客戶端,發(fā)起gRPC調(diào)用,測(cè)試函數(shù)的正確性。
使用HTTP函數(shù)觸發(fā)器的公網(wǎng)訪問(wèn)地址,示例如下:
go run ./greeter_client -addr golang-grpc-grpc-demo-torcawakky.cn-qingdao.fcapp.run:8089
更多示例
Custom Runtime | Custom Container |
無(wú) |
常見(jiàn)問(wèn)題
函數(shù)錯(cuò)誤
客戶端報(bào)錯(cuò)rpc error: code = Internal desc = server closed the stream without sending trailers
,表示函數(shù)計(jì)算服務(wù)端提前異常關(guān)閉gRPC請(qǐng)求。這種錯(cuò)誤屬于函數(shù)錯(cuò)誤,例如函數(shù)超時(shí)、函數(shù)進(jìn)程異常退出或函數(shù)出現(xiàn)內(nèi)存溢出OOM錯(cuò)誤等。您可以從函數(shù)日志中查詢具體的錯(cuò)誤原因并排查處理。更多信息,請(qǐng)參見(jiàn)查看調(diào)用日志。
gRPC請(qǐng)求未使用TLS協(xié)議客戶端
需使用TLS協(xié)議客戶端調(diào)用gRPC請(qǐng)求,否則會(huì)報(bào)錯(cuò)rpc error: code = Internal desc = server closed the stream without sending trailers
。例如,Golang語(yǔ)言可以使用如下示例代碼:
var opts []grpc.DialOption
cred := credentials.NewTLS(&tls.Config{
InsecureSkipVerify: false,
})
opts = append(opts, grpc.WithTransportCredentials(cred))
conn, err := grpc.Dial(*addr, opts...)
InsecureSkipVerify的值可以設(shè)置為true,即跳過(guò)TLS證書(shū)驗(yàn)證,或者設(shè)置為false,即不跳過(guò)TLS證書(shū)驗(yàn)證。
更多信息
除了函數(shù)計(jì)算控制臺(tái),您還可通過(guò)SDK配置觸發(fā)器。具體操作,請(qǐng)參見(jiàn)SDK參考(2021-04-16推薦)。
如需修改或刪除觸發(fā)器,具體操作,請(qǐng)參見(jiàn)觸發(fā)器管理。