Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Александр Кравченков: gRPC

Александр Кравченков: gRPC

CocoaHeads

May 07, 2018
Tweet

More Decks by CocoaHeads

Other Decks in Technology

Transcript

  1. Требования к продукту • Высокая безопасность • Высокая скорость транспорта

    • Высокая скорость парсинга • Поддержка долгого соединения с сервером 2
  2. Data + Int32 + Int32 + Int32 + Int32 +

    Int32 + Double + Double + Double + String + String Container + [Data] 4 Модель для тестирования в UML
  3. 5

  4. 6

  5. 7

  6. Protobuf JSON 0a1110011802320934313233333930363140010a2410 01180229c9c7e07c0c58a140320a3230313938313535 36364001490000000000c05e400a2c088f01100121000 0000000c05e40290000000000c05e40320a313734373 03231383034480000000000006940 7b226f72646572734172726179223a5b7b226f726967436c69656e7449 64223a22222c226f72646572537461747573223a322c22717479223a3 02c22636c69656e744964223a22343133333339303631222c226f7264

    65724964223a302c2273696465223a312c226372656174696f6e44617 465223a302c226c6561766573517479223a302c227365637572697479 4964223a312c247072696365223a302c226d6f64696669636174696f6e 44617465223a307d2c7b226f726967436c69656e744964223a22222c2 26f72646533537461747573223a322c22717479223a323232302e3032 34333930323433392c22636c69656e744964223a22323036393831352 53636222c226f726465724964223a302c2273696465223a312c226372 656174696f6e44617465223a302c226c6561766573517479223a302c2 273656375726974794964223a312c227072696365223a3132332c226d 6f64696669636174696f6e44617465223a307d2c7b226f726967436c69 656e744964223a22222c226f72646572537461747573223a302c22717 479223a3132332c22636c69656e744964223a22313734373032313830 34222c226f726465724964223a3134332c2273696465223a302c22637 2656174696f6e44617465223a302c226c6561766573517479223a3132 332c2273656375726974794964223a312c227072696365223a3230302 c226d6f64696669636174696f6e44617465223a307d5d7a 8
  7. Фичи • HTTP/2 - новая версия протокола HTTP • Protobuf

    - протокол сериализации • Stream API - удобный интерфейс 10
  8. 14 ..01011101010101.. HTTP/2 Request Response ..11011110101010111.. Плюсы: • Бинарный протокол

    • Мультиплексирование TCP потоков • Более безопасный
  9. 15 Protobuf • Формат сериализации бинарный • Оптимизация веса сообщений

    • Быстрый парсинг • Отдельный синтаксис для описания спецификации • Кодогенерация
  10. service SampleInterface { rpc GetContainer (EmptyMessage) returns (Container) {} rpc

    Stream (stream Container) returns (stream Container) {} } 16 proto3
  11. 17 service SampleInterface { rpc GetContainer (EmptyMessage) returns (Container) {}

    rpc Stream (stream Container) returns (stream Container) {} } proto3
  12. 18 service SampleInterface { rpc GetContainer (EmptyMessage) returns (Container) {}

    rpc Stream (stream Container) returns (stream Container) {} } proto3
  13. 19 service SampleInterface { rpc GetContainer (EmptyMessage) returns (Container) {}

    rpc Stream (stream Container) returns (stream Container) {} } proto3
  14. 20 service SampleInterface { rpc GetContainer (EmptyMessage) returns (Container) {}

    rpc Stream (stream Container) returns (stream Container) {} } proto3
  15. 21 service SampleInterface { rpc GetContainer (EmptyMessage) returns (Container) {}

    rpc Stream (stream Container) returns (stream Container) {} } proto3
  16. 22 service SampleInterface { rpc GetContainer (EmptyMessage) returns (Container) {}

    rpc Stream (stream Container) returns (stream Container) {} } proto3
  17. message OrderData { int32 Id = 1; string OtherId =

    2; bool Status = 3; double Side = 4; int64 Date = 5; } message Container { repeated OrderData Data = 1; } 23 proto3
  18. 24 message OrderData { int32 Id = 1; string OtherId

    = 2; bool Status = 3; double Side = 4; int64 Date = 5; } message Container { repeated OrderData Data = 1; } proto3
  19. 25 message OrderData { int32 Id = 1; string OtherId

    = 2; bool Status = 3; double Side = 4; int64 Date = 5; } message Container { repeated OrderData Data = 1; } proto3
  20. Проблемы.Неважные 1. Нет нормальной реализации для Swift 2. Ошибку можно

    передать только в message 3. Нельзя вызывать метод без параметров или вернуть ничего 4. Нет null-значений у полей 26
  21. func firstMethod(entity: FirstRequestEntity) -> AnyContext<FirstReplyEntity> { let request = GrpcInterface.default.grpcFirstMethod

    return GrpcServiceContext(request: request, model: entity).start() } func secondMethod(entity: RequestEntity) -> AnyContext<SecondReplyEntity> { let request = GrpcInterface.default.grpcSecondMethod return GrpcServiceContext(request: request, model: entity).start() } 31
  22. 1. Быстрая передача данных 2. Быстрый парсинг 3. Кодогенерация 4.

    Разделяемая клиентом и сервером спецификация 5. Удобный интерфейс взаимодействия Польза 32
  23. Как использовать 1. Идем на официальный сайт и читаем документацию

    2. Через brew ставим Protobuf compiler и плагин для obj-c 3. Через cocoapods тянем нужные зависимости 4. Пишем свой podspec (пример) или генерим через консоль. 5. На все мы потратили около часа. 33