Go语言的 gogrpc 框架
gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。其主要特点包括简单的服务定义方式、跨语言的平台 service、双向流、认证等。
在 Go 语言中,gRPC 框架可以使用 Protocol Buffers 作为接口定义语言(IDL),来定义服务以及数据结构。
以下是一个简单的 gRPC 服务的例子:
首先,你需要定义你的 Protocol Buffers 消息。例如,在 helloworld.proto
文件中:
syntax = "proto3";
package helloworld;
// 定义一个服务
service Greeter {
// 定义一个简单的 RPC 调用
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// 定义请求消息
message HelloRequest {
string name = 1;
}
// 定义回复消息
message HelloReply {
string message = 1;
}
然后,你可以使用 protoc
编译器来生成 Go 代码:
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative helloworld.proto
生成的 Go 代码会包括 GreeterClient, GreeterServer 接口和相关的请求、回复消息的结构体。
接下来,你可以实现服务端:
package main
import (
"context"
"log"
"net"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
"your_package_path/helloworld"
)
// 实现 GreeterServer 接口
type server struct{}
// SayHello 实现方法
func (s *server) SayHello(ctx context.Context, req *helloworld.HelloRequest) (*helloworld.HelloReply, error) {
return &helloworld.HelloReply{Message: "Hello " + req.Name}, nil
}
func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
helloworld.RegisterGreeterServer(s, &server{})
// 注册反射服务,可以使用 gRPC 提供的工具来查看服务信息
reflection.Register(s)
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
最后,实现客户端:
package main
import (
"context"
"log"
"google.golang.org/grpc"
"your_package_path/helloworld"
)
func main() {
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := helloworld.NewGreeterClient(conn)
// 调用 RPC
response, err := c.SayHello(context.Background(), &helloworld.HelloRequest{Name: "gRPC"})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", response.Message)
}
以上代码实现了一个简单的 gRPC 服务,包括服务端监听、注册服
评论已关闭