Function Compute支援HTTP觸發器,配置HTTP觸發器的函數可以通過gRPC請求被觸發執行。此時函數可以看做一個gRPC Server,處理gRPC請求並將處理結果返回給調用端。本文介紹如何在Function Compute控制台配置HTTP觸發器並使用gRPC請求觸發函數。
使用說明
調用方式
網域名稱:支援使用子網域名稱
fcapp.run或自訂網域名調用gRPC函數,不支援使用舊網域名稱fc.aliyuncs.com調用gRPC函數。說明如果需要使用自訂網域名,自訂網域名需要配置請求路徑與函數的映射關係。建議您將請求的路徑配置為
/*,可以讓所有gRPC請求都轉寄到對應的gRPC函數中,gRPC函數會將請求路由到用戶端定義的gRPC方法。連接埠:gRPC請求連接埠為
8089。
傳輸安全性
為保證gRPC請求的安全性,Function Compute線上環境僅支援使用TLS協議的用戶端。否則,請求會報錯
rpc error: code = Unavailable desc = connection closed before server preface received。自訂網域名支援使用自訂HTTPS認證,gRPC服務端不需要定義TLS認證驗證,Function Compute網關層會進行TLS驗證。
請求逾時控制
gRPC請求的最長逾時時間不得超過函數的執行逾時時間。執行逾時時間預設為60秒,最長為86400秒。
請求並發度控制
gRPC請求受Function Compute並發度的控制。一個gRPC請求被視為佔用一個並發度。gRPC的協議基於HTTP/2,在Function Compute中,對於一個函數執行個體而言,分配到這個函數執行個體的gRPC請求會複用同一條HTTP/2串連,則這條HTTP/2串連上的並發流就等於執行個體的並發度。您可以設定函數的單一實例並發度來控制一個執行個體上的並發流數量。具體操作,請參見設定執行個體並發度。
負載平衡
Function Compute支援將gRPC請求分發到不同的執行個體上,自動為gRPC請求做負載平衡。
計費方式
gRPC有以下四種請求類型:
普通gRPC請求
用戶端流式請求
服務端流式請求
雙向流式請求
不同請求類型對應的計費方式不同,具體如下:
普通gRPC請求:計費方式與使用HTTP的計費方式完全一致。
對於並發度設定為1的函數,計費時間從gRPC串連建立開始到gRPC串連斷開結束。
對於並發度大於1的函數,執行個體的計費時間從收到第一個gRPC串連建立開始,到最後一個gRPC串連斷開結束。一個執行個體中多個串連同時存在期間,不會被重複計費。
如下圖所示,一個函數的並發度設定為2,第一個請求到達的時間為T1,結束時間為T3,第二個請求到達時間為T2,結束時間為T4,計費時間為T4-T1,其中T2到T3這段時間只會被計費一次,不會被重複計費。
用戶端流式、服務端流式和雙向流式請求:執行個體的計費從第一個gRPC串連開始,到最後一個gRPC串連斷開結束。
準備工作
準備gRPC函數代碼
您可以自己編寫代碼,也可以在安裝並配置Serverless Devs工具後執行s init fc-custom-golang-grpc,下載一套完整的使用Golang語言,在Function Compute運行gRPC服務的範例程式碼。完整的代碼目錄結構如下所示,其中./greeter_client目錄為用戶端代碼,./code目錄為服務端代碼。
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準備ZIP程式碼封裝
在專案目錄fc-custom-golang-grpc,執行make deploy,會在./code目錄下產生二進位檔案bootstrap,將其打包為bootstrap.zip。
安裝依賴
在專案目錄fc-custom-golang-grpc,執行go mod vendor安裝運行gRPC用戶端需要的依賴。
使用控制台部署函數
前提條件
操作步驟
- 登入Function Compute控制台,在左側導覽列,單擊服務及函數。
- 在頂部功能表列,選擇地區,然後在服務列表頁面,單擊目標服務。
- 在函數管理頁面,單擊建立函數。
在建立函數頁面,選擇使用自訂運行時建立方式,設定相關參數,然後單擊建立。
需要設定的參數說明如下,其餘參數保持預設值即可。更多參數資訊,請參見建立函數。
函數名稱:設定您要建立的函數名稱,例如grpc-demo。
請求處理常式類型:選擇處理 HTTP 要求。
運行環境:選擇Debian 9。
代碼上傳方式:選擇通過 ZIP 包上傳代碼。
程式碼封裝:選擇並上傳您已打包的
bootstrap.zip檔案。啟動命令:如不填寫,預設執行
./bootstrap。監聽連接埠:監聽連接埠與服務端監聽的連接埠保持一致,本文樣本值為8089。
在函數詳情頁面,單擊觸發器管理頁簽,查看觸發器的公網訪問地址。

執行以下命令調用gRPC用戶端,發起gRPC調用,測試函數的正確性。
go run ./greeter_client -addr grpc-demo-service-*********.cn-qingdao.fcapp.run:8089
您也可以為您建立的gRPC函數配置自訂網域名,並使用自訂網域名調用該函數。
使用Serverless Devs工具部署函數
前提條件
操作步驟
執行以下命令,初始化專案。
s init fc-custom-golang-grpc -d fc-custom-golang-grpc執行以下命令,進入專案目錄
fc-custom-golang-grpc。cd fc-custom-golang-grpc可選:編輯s.yaml檔案。
樣本如下:
edition: 1.0.0 name: hello-world-app # access為當前應用所需要的密鑰資訊 # 密鑰配置可以參考:https://www.serverless-devs.com/serverless-devs/command/config # 密鑰使用順序可以參考:https://www.serverless-devs.com/serverless-devs/tool# access: "default" vars: # 全域變數 region: "cn-hangzhou" # 您要部署的函數所在的地區 service: name: "grpc-demo" # 您要部署的函數所在的服務名稱 description: 'hello world by serverless devs' internetAccess: true services: helloworld: # 您自訂的業務名稱或模組名稱 # 如果只想針對helloworld下面的業務進行相關操作,可以在命令列中加上helloworld,例如,只對helloworld進行構建:s helloworld build # 如果不帶有helloworld,而是直接執行s build,工具則會對當前Yaml下,所有和helloworld平級的業務模組(如有其他平級的模組,例如下面注釋的next-function),按照一定順序進行build操作 component: fc actions: # 自訂執行邏輯,關於actions的使用,可以參考:https://www.serverless-devs.com/serverless-devs/yaml pre-deploy: # 在deploy之前運行 - run: make build path: ./ # - component: fc build --use-docker --dockerfile ./code/Dockerfile # 要啟動並執行組件,格式為【component: 組件名 命令 參數】(可以通過s cli registry search --type Component 擷取組件列表) # - run: docker build xxx # 要執行的系統命令,類似於一種鉤子的形式 # path: ./src # 執行系統命令/鉤子的路徑 # - plugin: myplugin # 啟動並執行外掛程式(可以通過s cli registry search --type Plugin擷取外掛程式列表) # args: # 外掛程式的參數資訊 # testKey: testValue # post-deploy: # 在deploy之後運行 # - component: fc versions publish # 要啟動並執行命令列 props: region: ${vars.region} service: ${vars.service} # logConfig: # project: mypro-dev # logstore: function-log function: name: "golang-grpc" # 您要部署的函數名稱 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觸發器的觸發方式配置,必須配置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執行
s deploy -y部署函數。執行完成後,函數將部署至Function Compute。此外,Function Compute會產生一個可直接存取的URL地址,您可以使用該URL地址調用函數進行測試。
執行以下命令,安裝運行gRPC用戶端所需的依賴。
go mod vendor執行以下命令,調用gRPC用戶端,發起gRPC調用,測試函數的正確性。
使用HTTP函數觸發器的公網訪問地址,樣本如下:
go run ./greeter_client -addr golang-grpc-grpc-demo-torcawakky.cn-qingdao.fcapp.run:8089
更多樣本
Custom Runtime | Custom Container |
無 |
常見問題
函數錯誤
用戶端報錯rpc error: code = Internal desc = server closed the stream without sending trailers,表示Function Compute服務端提前異常關閉gRPC請求。這種錯誤屬於函數錯誤,例如函數逾時、函數進程異常退出或函數出現記憶體溢出OOM錯誤等。您可以從函數日誌中查詢具體的錯誤原因並排查處理。更多資訊,請參見查看調用日誌。
gRPC請求未使用TLS協議用戶端
需使用TLS協議用戶端調用gRPC請求,否則會報錯rpc error: code = Internal desc = server closed the stream without sending trailers。例如,Golang語言可以使用如下範例程式碼:
var opts []grpc.DialOption
cred := credentials.NewTLS(&tls.Config{
InsecureSkipVerify: false,
})
opts = append(opts, grpc.WithTransportCredentials(cred))
conn, err := grpc.Dial(*addr, opts...)InsecureSkipVerify的值可以設定為true,即跳過TLS認證驗證,或者設定為false,即不跳過TLS認證驗證。
更多資訊
除了Function Compute控制台,您還可通過SDK配置觸發器。具體操作,請參見SDK參考(2021-04-16推薦)。
如需修改或刪除觸發器,具體操作,請參見觸發器管理。