gRPC - google Remote Procedure Call. Вызов функции на удалённой машине так, как будто это локальная функция. Общается с приложением посредством Protocol Buffers, поддерживает streaming. Не грузит процессор, в отличии от REST, поскольку работает с бинарным представлением, которое не нужно парсить и проверять на валидность. Легко интегрировать с mTLS, по умолчанию работает на TLS
Суть в том, что клиент может выполнять серверные команды со своего приложения. Принцип похож на REST API, но здесь более точная работа, которая должна выполняться клиентом - формат отправляемого файла сложнее JSON
Благодаря proto файлу можно использовать разные ЯП, метод общения между ними сохранится из-за единообразия сообщений и заранее определённого формата
Пример proto файла
syntax = "proto3";
package calculator;
service Calculator {
rpc Add (AddRequest) returns (AddResponse);
}
message AddRequest {
int32 a = 1;
int32 b = 2;
}
message AddResponse {
int32 result = 1;
}
Сервер:
class CalculatorServicer(calculator_pb2_grpc.CalculatorServicer):
def Add(self, request, context):
result = request.a + request.b
return calculator_pb2.AddResponse(result=result)
def server():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
calculator_pb2_grpc.add_CalculatorServicer_to_server(CalculatorServicer(), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
server()
Клиент:
channel = grpc.insecure_channel('localhost:50051')
stub = calculator_pb2_grpc.CalculatorStub(channel)
response = stub.Add(calculator_pb2.AddRequest(a=10, b=20))
print("Result:", response.result) # 30