Как работает связь между 2 микросервисами с помощью grpc?

Предположим, у вас есть приложение, такое как книжный магазин, и вы разбили его на два простых микросервиса в серверной части - ›

Микросервис 1: Покупатели книг (с аккаунтами) Микросервис 2: Список книг.

Допустим, вы делаете запрос из внешнего интерфейса, переходит в обратный прокси-сервер, и запрос отправляется в микросервис 1.

Как именно вы можете представить себе, как микросервис 1 взаимодействует с микросервисом 2?

Вы контейнеризуете микросервисы, и внутри у вас есть клиент и сервер grpc?

Обменивается ли клиент с сервером микросервиса 1, а также сервером микросервиса 2?

На этом изображении похоже, что вы помещаете клиент и сервер в контейнеры отдельно ...?

Как именно gRPC обменивается данными между микросервисами? введите описание изображения здесь


person TheRoadLessTaken    schedule 15.07.2020    source источник


Ответы (1)


IIUC, вы спрашиваете, как сервер gRPC реализует функциональность, описанную protobuf?

Я думаю, вы имеете в виду этот пример

Компилятор 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 используют для взаимодействия с базой данных. Это тоже может представлять какой-то другой микросервис ... вплоть до черепах!

Итак, чтобы ответить на ваш вопрос, где-то в недрах ваших микросервисов есть какая-то форма общего состояния (например, база данных или подобное), где, например, книги сохранились (на полках).

Являются ли клиенты и серверы контейнерными, хотя это, вероятно, хорошая практика, не имеет отношения к вопросу о том, как происходит обмен данными.

person DazWilkin    schedule 15.07.2020