service HelloService {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string greeting = 1;
}
message HelloResponse {
string reply = 1;
}
rpc GetFeature(Point) returns (Feature) {}
解决的问题
分类
rpc ListFeatures(Rectangle) returns (stream Feature) {}
rpc RecordRoute(stream Point) returns (RouteSummary) {}
rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
具体介绍看官方文档,现在没用到这块
在 gRPC-Go 中,RPC 以阻塞/同步模式运行,这意味着 RPC 调用等待服务器响应,并且将返回响应或错误。
看来只能自己起goroutine了,但这样很麻烦,野生goroutine需要自己去维护异常处理和日志
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
执行buf mod init生成buf.yaml
配置buf,buf.gen.yaml
# 配置protoc生成规则
version: v1
managed:
enabled: true
go_package_prefix:
# proto文件中不使用option定义包名称,因为proto生成代码可以放在不同项目中使用,因此在buf.gen.yaml中进行定义
default: helloworld
except:
- buf.build/googleapis/googleapis
plugins:
# 使用go插件生成go代码
- name: go
out: ./
opt: paths=source_relative
# 使用go-grpc插件生成grpc代码
- name: go-grpc
out: ./
opt:
- paths=source_relative
- require_unimplemented_servers=false
执行buf generate 生成helloworld.pb.go
、helloworld_grpc.pb.go
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
}
flag.Parse()
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterGreeterServer(s, &server{})
log.Printf("server listening at %v", lis.Addr())
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
Serve()
服务器以进行阻塞等待,直到进程被杀死或被Stop()
调用 flag.Parse()
// Set up a connection to the server.
conn, err := grpc.Dial(*addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewGreeterClient(conn)
// Contact the server and print out its response.
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
r, err := c.SayHello(ctx, &pb.HelloRequest{Name: *name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.GetMessage())
DialOptions
在服务需要时设置身份验证凭据(例如,TLS、GCE 凭据或 JWT 凭据)