為函數綁定網域名稱後,您可以通過gRPC用戶端發起gRPC請求,此時函數可以看作一個gRPC Server,可以處理gRPC請求並將處理結果返回給調用端。本文以Golang語言為例,介紹如何通過Serverless Devs工具部署函數並使用gRPC請求觸發函數。
使用說明
調用方式
網域名稱:僅支援使用自訂網域名調用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請求
用戶端流式請求
服務端流式請求
雙向流式請求
在Function Compute中,資源使用量=規格 × 計費時間,普通gRPC請求和流式gRPC請求的計費時間不同,具體如下:
普通gRPC請求:
對於並發度設定為1的函數,計費時間從請求開始到請求結束。
對於並發度大於1的函數,計費時間從第一個請求開始,到最後一個請求結束。一個執行個體如果同時處理多個請求,不會被重複計費。
如下圖所示,一個函數的並發度設定為2,第一個請求到達的時間為T1,結束時間為T3,第二個請求到達時間為T2,結束時間為T4,計費時間為T1-T4,其中T2到T3這段時間只會被計費一次,不會被重複計費。
用戶端流式、服務端流式和雙向流式請求:計費時間從第一個gRPC串連開始,到最後一個gRPC串連斷開結束。
前提條件
操作步驟
在本地執行以下命令,初始化專案。
sudo s init fc-custom-golang-grpc -d fc-custom-golang-grpc執行以下命令,進入專案目錄
fc-custom-golang-grpc。cd fc-custom-golang-grpc在當前專案目錄下,編輯s.yaml檔案。
樣本如下:
edition: 3.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 # 密鑰別名,請根據實際情況修改 resources: helloworld: # 業務名稱/模組名稱 component: fc3 actions: # 自訂執行邏輯,關於actions 的使用,可以參考:https://www.serverless-devs.com/serverless-devs/yaml#行為描述 pre-deploy: # 在deploy之前運行 - run: go mod tidy path: ./code - run: GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o target/main main.go path: ./code props: region: cn-shanghai # 應用部署地區,請根據實際情況修改 functionName: "fc-custom-golang-grpc" handler: index.handler role: '' description: 'hello world by serverless devs' timeout: 60 diskSize: 512 internetAccess: true layers: - acs:fc:cn-shanghai:official:layers/Go1/versions/1 customRuntimeConfig: port: 8089 command: - ./main runtime: custom.debian10 cpu: 0.35 instanceConcurrency: 2 memorySize: 512 environmentVariables: PATH: >- /opt/Go1/bin:/usr/local/bin/apache-maven/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/ruby/bin:/opt/bin:/code:/code/bin LD_LIBRARY_PATH: >- /code:/code/lib:/usr/local/lib:/opt/lib:/opt/php8.1/lib:/opt/php8.0/lib:/opt/php7.2/lib code: ./code/target執行
sudo s deploy -y部署函數。執行完成後,函數將部署至Function Compute。此外,Function Compute會產生一個可直接存取的URL地址,您可以使用該URL地址調用函數進行測試。
在本地執行以下命令,安裝運行gRPC用戶端所需的依賴。
go mod vendor為函數綁定自訂網域名,具體操作,請參見配置自訂網域名。
在本地執行以下命令,調用gRPC用戶端,發起gRPC調用,測試函數的正確性。
執行前請先替換命令中
${your-custom-domain}為您的自訂網域名。go run ./greeter_client -addr ${your-custom-domain}: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認證驗證。