使用grpc的2个微服务之间的通信如何工作?

时间:2020-07-15 16:00:20

标签: grpc grpc-python grpc-go grpc-node

假设您有一个像书店这样的应用程序,并且在后端将它分为两​​个简单的微服务->

微服务1:图书购买者(带有帐户) 微服务2:图书清单。

假设您从前端发出请求,进入反向代理,然后该请求进入微服务1。

您如何准确地可视化微服务1与微服务2的通信方式?

您是否对微服务进行容器化,并且在其中具有grpc客户端和服务器?

客户端是否与微服务1的服务器以及微服务2的服务器通信?

在此图中,您好像分别容器化了客户端和服务器...?

gRPC如何在微服务之间通信? enter image description here

1 个答案:

答案 0 :(得分:1)

IIUC,您在问gRPC服务器如何实现protobuf描述的功能?

我认为您是指此example

protobuf编译器生成必须实现的客户端和服务器存根。您可以用任何语言实现来实现这些。实施服务器时,您有责任确保例如ListBooks()(用于书架)将返回CreateBook()添加到书架中的所有图书。

该实现独立于gRPC。

rpc ListBooks(ListBooksRequest) returns (ListBooksResponse) {}
rpc CreateBook(CreateBookRequest) returns (Book) {}

gRPC从概念上仅确保您的客户端认为他们正在调用本地方法:CreateBook()实际上是在他们调用本地存根时将其通过网络传输到远程服务器会收到CreateBook()请求并对此进行处理。

因此,让我们关注服务器,它可能会使用某种形式的持久性来记录书架和书籍。实际上,这将是一些数据库:

type Server struct {
  db db
}

func (s *Server) CreateBook(r *pb.CreateBookRequest) {
  shelf := s.db.Get(r.get_shelf())
  shelf.Add(r.get_book())
}

func (s *server) ListBooksRequest(r *pb.ListBooksRequest) {
  shelf := s.db.Get(r.get_shelf())
  for _, book := range shelf.Get() {
    fmt.Println(book)
  }
}

注意在上面,gRPC服务的服务器实现包括数据库连接,gRPC方法用于与数据库交互。这也可能代表其他一些微服务……一路难堪!

因此,为了回答您的问题,在微服务的某个地方,存在某种形式的共享状态(例如数据库或类似状态),例如书籍被保存在书架上。

是否将客户端和/或服务器容器化,虽然可能是一种好的做法,但与通信如何发生无关。