更新时间:2024-07-08 GMT+08:00
使用FunctionGraph HTTP函数处理gRPC请求
方案概述
本章节主要指导用户使用gRPC,在FunctionGraph中处理gRPC请求。
本章节以gRPC example code项目中“example/helloworld”为例,使用HTTP函数的方式在FunctionGraph中处理gRPC请求。由于HTTP函数本身不支持Go语言直接代码部署,因此本章节将以转换成二进制的方式为例,将Go编写的程序部署到FunctionGraph上。
- 当前仅拉美-圣地亚哥支持。
- 用户默认没有gRPC权限,如果需要使用,请在工单系统提交工单添加白名单。
操作流程
- 构建代码包
创建源文件“main.go”,代码如下:
// Package main implements a grpc_server for Greeter service. package main import ( "context" "flag" "fmt" "log" "net" pb "helloworld/helloworld" "google.golang.org/grpc" ) var ( port = flag.Int("port", 8000, "The grpc_server port") ) // server is used to implement helloworld.GreeterServer. type server struct { pb.UnimplementedGreeterServer } // SayHello implements helloworld.GreeterServer func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { log.Printf("Received: %v", in.GetName()) return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil } func main() { flag.Parse() lis, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%d", *port)) if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() pb.RegisterGreeterServer(s, &server{}) log.Printf("grpc_server listening at %v", lis.Addr()) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } }
# bootstrap $RUNTIME_CODE_ROOT/grpc-server
在“main.go”中,使用8000端口启动了一个gRPC服务器,并注册了“helloworld.GreeterServer”,调用该服务将返回“Hello XXX”。
- 编译打包
- 在linux机器下,将上述代码编译 go build -o grpc-server main.go。然后,将grpc-server和bootstrap打包为xxx.zip。
- 在windows机器下使用Golang编译器完成打包,具体步骤如下:
# 切换编译环境方式 # 查看之前的golang编译环境 go env # 设置成linux对应的 set GOARCH=amd64 go env -w GOARCH=amd64 set GOOS=linux go env -w GOOS=linux # go build -o [目标可执行程序] [源程序] # 例子 go build -o grpc-server main.go # 还原之前的编译环境 set GOARCH=amd64 go env -w GOARCH=amd64 set GOOS=windows go env -w GOOS=windows
- 创建HTTP函数并上传代码
创建1个HTTP函数,并上传已打包的xxx.zip包。请参见创建HTTP函数。
- 创建APIG触发器
请参见使用APIG触发器,创建APIG触发器,“请求协议”建议选择“gRPC”,“安全认证”建议选择“None”,方便调试
图1 APIG触发器
- 调用测试
用postman去调试gRPC。
图2 gRPC请求结果