PAI-EAS支援通過gRPC協議進行高效能的模型推理調用。與HTTP/JSON相比,gRPC具有更高的序列化效率和更好的串流支援,適用於對效能敏感或需要流式推理的情境。
前提條件
在開始之前,請確保已滿足以下條件:
已部署EAS推理服務
Golang 開發環境已配置(推薦 Go 1.18 及以上版本)
已安裝必要的 gRPC 依賴包
核心要點
服務地址格式
通過網關調用時,從控制台擷取對應地址後,提取網域名稱部分並追加連接埠號碼:80即可,步驟參見擷取訪問地址和Token。
連接埠固定為80,因為EAS通過網關對外提供gRPC服務時,該網關的連接埠固定為80。
地址樣本:
調用方式 | 控制台地址樣本 | gRPC端點(追加 |
公網調用 |
|
|
VPC調用 |
|
|
注意:gRPC端點不包含http://首碼。
Token 鑒權
調用 PAI-EAS gRPC 推理服務的核心在於通過 Metadata傳遞鑒權Token。PAI-EAS 使用 Bearer Token 進行身分識別驗證,在發起gRPC調用時,需要在Metadata中如下設定authorization欄位:
authorization: Bearer <Token>其中Token值必須使用Bearer首碼(注意Bearer與Token之間有一個空格),Token本身可在EAS控制台的目標服務詳情頁面擷取。
程式碼範例
在編寫調用代碼之前,請先準備好對應服務的 proto 檔案並編譯產生用戶端代碼。
以下樣本展示通過gRPC協議調用PAI-EAS推理服務的核心流程。其相關的proto檔案及服務端代碼參見gRPC服務demo。
package main
import (
"context"
"log"
"time"
pb "your-project/proto"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/metadata"
)
func main() {
// 替換為實際的gRPC服務地址(可從EAS控制台調用資訊面板擷取)
// 公網調用地址格式為:服務名.{uid}.{region}.pai-eas.aliyuncs.com:80 (連接埠固定80)
host := "your-service-endpoint:your port"
// 替換為您的服務Token(可在EAS控制台服務詳情頁面擷取)
token := "your-service-token"
log.Printf("正在串連EAS gRPC服務 (%s)...", host)
// 1. 建立串連(串連是安全執行緒的,建議建立後複用)
conn, err := grpc.NewClient(
host,
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
if err != nil {
log.Fatalf("串連失敗:%v", err)
}
defer conn.Close()
// 2. 建立用戶端
client := pb.NewGreeterServiceClient(conn)
// 3. 通過 gRPC metadata 注入鑒權 Token
md := metadata.Pairs("authorization", "Bearer " + token)
ctx := metadata.NewOutgoingContext(context.Background(), md)
// 4. 設定逾時
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
// 5. 構造請求
req := &pb.HelloRequest{Name: "World"}
// 6. 發起調用
resp, err := client.SayHello(ctx, req)
if err != nil {
log.Fatalf("調用失敗:%v", err)
}
log.Printf("收到響應:%s", resp.Message)
}import grpc
import helloworld_pb2
import helloworld_pb2_grpc
# 替換為實際的gRPC服務地址(可從EAS控制台調用資訊面板擷取)
# 公網調用地址格式為:服務名.{uid}.{region}.pai-eas.aliyuncs.com:80 (連接埠固定80)
host = "your-service-endpoint:your port"
# 替換為您的服務Token(可在EAS控制台服務詳情頁面擷取)
token = "your-service-token"
# 1. 建立通道 (串連服務端)
channel = grpc.insecure_channel(host)
# 2. 初始化 Stub (用戶端控制代碼)
stub = helloworld_pb2_grpc.GreeterServiceStub(channel)
# 3. 構造請求
request = helloworld_pb2.HelloRequest(name="World")
# 4. 構造鑒權metadata,將Token傳遞給PAI-EAS服務
metadata = (("authorization", "Bearer " + token),)
print("正在發起 gRPC 調用...")
try:
# 5. 發起請求 (同步調用),注意傳入metadata以完成鑒權
response = stub.SayHello(request, metadata=metadata, timeout=5.0)
print(response.message)
except grpc.RpcError as e:
print(f"調用失敗:{e.code()} - {e.details()}")
finally:
channel.close()最佳實務
串連複用:gRPC串連是安全執行緒的,建議在應用啟動時建立串連並複用,而不是每次請求建立。
重要預設情況下空閑串連可能被網路裝置切斷。生產環境中務必啟用 Keepalive 心跳(Go 使用
KeepaliveParams,Python 使用options),以主動維持串連活躍,實現真正的無感自動重連。逾時設定:強烈建議為每次gRPC調用設定合理的逾時時間,避免因網路或服務異常導致請求長時間阻塞。
常見問題
Q:鑒權失敗(UNAUTHENTICATED)
請檢查Token是否正確、是否已到期,以及Metadata中的authorization欄位名是否拼字正確。注意Token值必須使用Bearer首碼,且Bearer與Token之間有一個空格。
Q:連線逾時(UNAVAILABLE)
確認gRPC端點是否正確,以及網路是否可達。
如使用VPC調用地址,請確保用戶端與EAS服務在同一地區的VPC網路內,並檢查安全性群組規則是否允許存取了對應連接埠。
附錄
gRPC服務demo
介面定義
在專案根目錄建立檔案
helloworld.proto,定義一個GreeterService服務,包含一個SayHello方法:請求:
HelloRequest,包含一個name欄位(字串)響應:
HelloResponse,包含一個message欄位(字串)
編譯產生
.proto檔案對應的代碼helloworld_pb2_grpc.py、helloworld_pb2.py(以 Python 為例):python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. helloworld.proto
2. 服務端部署
部署服務到EAS,專案結構如下:
my-grpc-demo
├── helloworld_pb2_grpc.py
├── helloworld_pb2.py
└── server.py