全部產品
Search
文件中心

Function Compute:配置HTTP觸發器並使用gRPC觸發

更新時間:Oct 16, 2025

Function Compute支援gRPC協議,允許通過HTTP觸發器直接觸發gRPC服務。此時函數可以看做一個gRPC Server,處理用戶端流式/非流式請求,同時享受Serverless架構的彈性擴縮容與免營運能力。

使用說明

調用方式

  • 網域名稱:支援使用子網域名稱fcapp.run或自訂網域名調用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串連斷開結束。

前提條件

  • 在本地安裝Go語言環境。Function Compute已支援Go 1.x版本,推薦使用最新版本。

  • 在本地安裝並配置Serverless Devs工具。具體操作,請參見快速入門

操作步驟

  1. 在本地執行以下命令,初始化專案。

    sudo s init fc-custom-golang-grpc -d fc-custom-golang-grpc
  2. 執行以下命令,進入專案目錄fc-custom-golang-grpc

    cd fc-custom-golang-grpc
  3. 在當前專案目錄下,編輯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
  4. 執行sudo s deploy -y部署函數。

    執行完成後,函數將部署至Function Compute。此外,Function Compute會產生一個可直接存取的URL地址,您可以使用該URL地址調用函數進行測試。

  5. 建立HTTP觸發器,並擷取觸發器的公網訪問地址。具體操作,請參見建立觸發器

    trigger

  6. 在本地執行以下命令,安裝運行gRPC用戶端所需的依賴。

    go mod vendor
  7. 執行以下命令調用gRPC用戶端,發起gRPC調用,測試函數的正確性。

    fc-custang-grpc-*****.cn-shanghai.fcapp.run為您在步驟5擷取的觸發器公網訪問地址。

    go run ./greeter_client -addr  fc-custang-grpc-*****.cn-shanghai.fcapp.run:8089
說明

您也可以為您建立的gRPC函數配置自訂網域名,並通過自訂網域名發起gRPC請求,詳見自訂網域名支援gRPC協議

更多樣本

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認證驗證。