Перейти к содержимому

Быстрый старт

Добро пожаловать в RPC Dart! Это руководство поможет вам быстро начать работу с RPC Dart в вашем проекте на Dart или Flutter.

Добавьте RPC Dart в ваш проект, выполнив следующую команду:

Окно терминала
dart pub add rpc_dart

Для дополнительных типов транспортов (HTTP, WebSocket, Isolate) также добавьте:

Окно терминала
dart pub add rpc_dart_transports

Давайте создадим простой сервис калькулятора для демонстрации основных концепций RPC Dart.

Сначала определите контракт сервиса с константами для имён сервиса и методов:

calculator_contract.dart
abstract interface class ICalculatorContract {
static const name = 'Calculator';
static const methodAdd = 'add';
}

Определите модели данных для ваших RPC вызовов:

models.dart
class AddRequest {
final double a;
final double b;
AddRequest(this.a, this.b);
}
class AddResponse {
final double result;
AddResponse(this.result);
}

Создайте responder, который обрабатывает входящие RPC вызовы:

calculator_responder.dart
import 'package:rpc_dart/rpc_dart.dart';
final class CalculatorResponder extends RpcResponderContract {
CalculatorResponder() : super(ICalculatorContract.name);
@override
void setup() {
// Регистрируем обработчик унарного метода
addUnaryMethod<AddRequest, AddResponse>(
methodName: ICalculatorContract.methodAdd,
handler: _add,
);
}
Future<AddResponse> _add(AddRequest request, {RpcContext? context}) async {
final result = request.a + request.b;
return AddResponse(result);
}
}

Реализуйте клиент, который вызывает RPC методы:

calculator_caller.dart
import 'package:rpc_dart/rpc_dart.dart';
final class CalculatorCaller extends RpcCallerContract {
CalculatorCaller(RpcCallerEndpoint endpoint)
: super(ICalculatorContract.name, endpoint);
Future<AddResponse> add(AddRequest request) {
return callUnary<AddRequest, AddResponse>(
methodName: ICalculatorContract.methodAdd,
request: request,
);
}
}

Теперь давайте создадим полный пример, который настраивает транспорт, эндпоинты и делает RPC вызов:

main.dart
import 'package:rpc_dart/rpc_dart.dart';
void main() async {
// Создаём пару InMemory транспортов
final (clientTransport, serverTransport) = RpcInMemoryTransport.pair();
// Настраиваем responder endpoint
final responder = RpcResponderEndpoint(transport: serverTransport);
responder.registerServiceContract(CalculatorResponder());
responder.start();
// Настраиваем caller endpoint
final caller = RpcCallerEndpoint(transport: clientTransport);
// Создаём клиент калькулятора
final calculator = CalculatorCaller(caller);
// Делаем RPC вызов
final result = await calculator.add(AddRequest(10, 5));
print('10 + 5 = ${result.result}'); // Вывод: 10 + 5 = 15.0
// Очистка ресурсов
await caller.close();
await responder.close();
}

🚀 Производительность без копирования: С InMemory транспортом объекты передаются напрямую без накладных расходов на сериализацию.

🔒 Типобезопасность: Все RPC вызовы строго типизированы, ошибки обнаруживаются на этапе компиляции.

🧪 Лёгкое тестирование: InMemory транспорт делает модульное и интеграционное тестирование простым.

🔌 Независимость от транспорта: Переключайтесь между InMemory, HTTP, WebSocket без изменения бизнес-логики.

  • Ознакомьтесь с FAQ для ответов на частые вопросы
  • Просмотрите примеры на GitHub
  • Создайте issue на GitHub, если нашли баги или у вас есть вопросы