RPC (Remote Procedure Call) - это технология, позволяющая вызывать функции или методы на удалённой системе так, как если бы они выполнялись локально. Основная идея - абстрагировать сетевое взаимодействие, предоставив программисту интерфейс, аналогичный вызову обычных функций.
Современная кроссплатформенная RPC-библиотека от Google, использующая HTTP/2 и Protocol Buffers.
// Пример определения сервиса в .proto файле
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
Особенности:
Разработан в Facebook, поддерживает множество языков и протоколов.
// Пример определения сервиса в Thrift IDL
service Calculator {
i32 add(1:i32 num1, 2:i32 num2),
i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),
}
Особенности:
Альтернатива Protocol Buffers с нулевой стоимостью сериализации.
Особенности:
Простые текстовые протоколы на основе XML/JSON.
// Пример JSON-RPC запроса
{
"jsonrpc": "2.0",
"method": "subtract",
"params": [42, 23],
"id": 1
}
Особенности:
Хотя REST не является классическим RPC, многие современные API реализуются поверх HTTP REST.
Производительность:
Поддержка языков:
Особенности проекта:
Экосистема:
// Серверная часть
class MathService : public RPCService {
public:
RPCRESULT add(int a, int b) override {
return a + b;
}
};
// Клиентская часть
class MathClient {
public:
int add(int a, int b) {
RPCMessage request("add", {a, b});
RPCMessage response = transport_->send(request);
return response.getResult<int>();
}
};
// Использование
MathClient client;
int result = client.add(5, 3); // Вызов удалённого метода
Латентность сети:
Надёжность:
Совместимость версий:
Безопасность:
RPC - мощная абстракция для распределённых систем, которая:
Для C++ разработчиков наиболее актуальны:
Выбор конкретной технологии зависит от требований проекта, необходимой производительности и экосистемы.