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