为什么选 gRPC?

相比 REST/JSON,gRPC 基于 HTTP/2 + Protobuf 二进制序列化,延迟低、带宽占用小,且天然支持双向流。

定义 Proto

syntax = "proto3";
service ArticleService {
  rpc GetArticle(GetArticleRequest) returns (Article);
  rpc ListArticles(ListArticlesRequest) returns (stream Article);
}
message Article {
  int64  id    = 1;
  string title = 2;
}

Go 服务实现

func (s *server) GetArticle(ctx context.Context, req *pb.GetArticleRequest) (*pb.Article, error) {
    a, err := s.store.Get(req.Id)
    if err != nil {
        return nil, status.Errorf(codes.NotFound, "not found")
    }
    return a, nil
}