Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Power-up micro-services with gRPC and ProtoBuffers

44 views

Published on

Nowadays, many of us choose the micro-service architecture for their projects. But with this solution, you can take many additional problems as efficient and transparent interaction between all of them in one infrastructure. In addition, there is an issue of communication and integration among teams that responsible for those services.

The decent solution is gRPC. In this talk we going to focus on how gRPC and ProtoBuffers work, compare with alternatives like REST+JSON, RPC via RabbitMQ.

The presentation will be useful to anyone who uses or plans to use a micro-service approach in the development process.

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

Power-up micro-services with gRPC and ProtoBuffers

  1. 1. Заряжаем микросервисы на успех с помощью gRPC and Protocol Buffers Алексей Диденко BigCommerce Inc.
  2. 2. Кто Я? Борюсь с умирающим PHP почти с пеленок. Более 12 лет :) Евангелист Symfony с момента первого релиза. Научился работать с 10-летним кодом и сохранять спокойствие. Творю “великие дела” в BigCommerce.
  3. 3. Что общего у этих компаний?
  4. 4. Что общего у этих компаний?
  5. 5. От монолита к микросервисам PHP PHP PHP PHP PHP PHP PHP PHP PHP PHP PHP PHP PHP PHP Scala PHP PHP PHP Scala PHP Ruby
  6. 6. От монолита к микросервисам
  7. 7. “Эффективная” коммуникация
  8. 8. Требования к межсервисному взаимодействию Описание протокола API должно быть строго декларативным. Контракт должен быть однозначным и человеко-понятным, необходимо проводить (code) review. Возможность описания как и успешного сценария так и ошибки. При чем это должно делаться явно для каждого метода. “Скучный” код должен быть автогенерирован из контракта для PHP, Scala, GO и Ruby
  9. 9. Возможные решения
  10. 10. Возможные решения
  11. 11. SOAP Stateful - необходимо состояние как и сервера, так и клиента. Требует наличие клиентской библиотеки. Многие языки не поддерживают Требует много вычислительных ресурсов, в результате - низкое быстродействие. Раздувает данные в несколько раз (XML) Сложен для разработчиков в использовании
  12. 12. RPC over RabbitMQ
  13. 13. REST? Приложение (микросервис) 1. Открываем HTTP соединение с сервером 2. Формируем и отправляем HTTP запрос. 3. Ждем ответ! Документация REST API Url: https//api.domain.com/products Method: POST Body: {“name”: “new product”}
  14. 14. REST? Приложение (микросервис) 1. Открываем HTTP соединение с сервером 2. Формируем и отправляем HTTP запрос. 3. Ждем ответ! 4. Парсими валидируем ответ Документация REST API Url: https//api.domain.com/products Method: POST Body: {“name”: “new product”} { “id”: 12344 “name”: “new product” }
  15. 15. REST замечателен! Легко понять что происходит и как работает (текстовая репрезентация) Построен на основе HTTP методов Легко дебажить Низкая зависимость сервера и клиента Высококачественная имплементация на многих языках
  16. 16. Но не всегда... REST - это про ресурсы. Сложно смоделировать не CRUD операции. Нет формального (машино-удобного) описания API контракта, реализация клиентов требует участия человека. Люди не любят создавать клиентских библиотек :) Проблемы со стримингом данных, невозможность двустроннего стриминга. Неэффективность: передача текста по сети не оптимально. Сложность получения множества ресурсов в одном запросе.
  17. 17. Частичное решение + Множество кодогенераторов клиентов, server stubs (swagger-codegen, AutoRest, oas-nodegen, APIMATIC). +Отлична сгенерированная документация с “песочницей” − Большие и длинные JSON: сложность при code review. − Не форсирует подход “Contract first”. − Сложно описать корректный API в одном стиле: разные точки зрения на REST :)
  18. 18. 100% подходящее решение: gRPC + Protocol Buffers
  19. 19. Очередной стандарт?
  20. 20. Что такое gRPC? “gRPC is a modern open source high performance Remote Procedure Call framework that can run in any environment. grpc.io
  21. 21. Первый шаг - декларация контракта. Protocol Buffers v3 syntax = "proto3"; // The contacts service definition. service Contacts { // Perform a search. rpc Search (Request) returns (Response); } // The request message containing the search params. message Request { // The text to search for. string text = 1; } // The response message containing the search results. message Response { // The list of results. repeated User results = 1; } // User. message User { string name = 1; bool active = 2; } ● Единый источник истины. ● Строгая типизация. ● Правила осуществления обратной совместимости. ● Эффективное бинарное представление. ● Комплексное руководство по стилю написания.
  22. 22. Генерация кода из Protocol Buffer protoc *.proto
  23. 23. PHP: автогенерируемый клиент
  24. 24. PHP: использование
  25. 25. gRPC workflow
  26. 26. Мультиплатформенность
  27. 27. gRPC использует HTTP/2 как транспорт
  28. 28. gRPC: двунаправленный стриминг
  29. 29. Дедлайны/Таймауты
  30. 30. Отмены
  31. 31. Аутентификация ● SSL/TLS: gRPC has SSL/TLS integration and promotes the use of SSL/TLS to authenticate the server, and to encrypt all the data exchanged between the client and the server. Optional mechanisms are available for clients to provide certificates for mutual authentication. ● Token-based authentication with Google: gRPC provides a generic mechanism (described below) to attach metadata based credentials to requests and responses. Additional support for acquiring access tokens (typically OAuth2 tokens) while accessing Google APIs through gRPC is provided for certain auth flows: you can see how this works in our code examples below. In general this mechanism must be used as well as SSL/TLS on the channel - Google will not allow connections without SSL/TLS, and most gRPC language implementations will not let you send credentials on an unencrypted channel. grpc.io
  32. 32. Производительность
  33. 33. Производительность
  34. 34. Как обстоят дела с PHP? Also note that currently you can only create clients in PHP for gRPC services - you can find out how to create gRPC servers in our other tutorials… - grpc.io
  35. 35. Как обстоят дела с PHP? Also note that currently you can only create clients in PHP for gRPC services - you can find out how to create gRPC servers in our other tutorials… - grpc.io “Пхпшники не сдаются!” ● FastCGI Proxy (Go, Rust) ● Spiral: gRPC сервер на основе RoadRunner.
  36. 36. FastCGI Proxy 1. Принимаем запрос; 2. Вынимаем из него тело, сериализованное в Protobuf; 3. Формируем заголовки для FastCGI-запроса; 4. Отправляем FastCGI-запрос в PHP-FPM; 5. В PHP обрабатываем запрос. Формируем ответ; 6. Получаем ответ, конвертируем в gRPC, отправляем адресату;
  37. 37. Postman для gRPC: BloomRPC
  38. 38. Инструменты разработчика  gRPC command line tool выводит список доступных сервисов для порта grpc_cli ls localhost:50051 выводит список методов для сервиса grpc_cli ls localhost:50051 helloworld.Greeter.SayHello -l инспектирует список сообщений для метода grpc_cli type localhost:50051 helloworld.HelloRequest унарный вызов метода $ grpc_cli call localhost:50051 SayHello"name: 'gRPC CLI'" proto-gen-lint проверяет .proto на соответствие официальному руководству по стилю Google’s Protocol Buffers protoc --lint_out=. *.proto
  39. 39. Трансформация gRPC в REST API: grpc-gateway
  40. 40. Цель REST(HTTP+JSON) gRPC Единый источник истины ✗ ✔ Мультиплатформенность + мультиязычность ✗ ✔ Обработка ‘non-breaking’ изменений ✗ ✔ Сеть: обработка запросов ✗ (1 запрос на соединение) ✔ (множество запросов на соединение) Скорость: передача данных Текст ✗ Бинарный ✔ CPU: оптимальное использование ресурсов ✗ ✔ Трассировка Вручную ✗ Легко подключить ✔ Логирование Вручную ✗ Легко подключить ✔ Мониторинг Вручную ✗ Легко подключить ✔ COMPATIBILITYPERFORMANCEMAINTENANCE
  41. 41. Во-первых, перестаньте писать интерфейсный код для вашего API вручную.
  42. 42. Во-вторых, перестаньте писать интерфейсный код для вашего API вручную.
  43. 43. В-третьих, перестаньте писать интерфейсный код для вашего API вручную.
  44. 44. Обращайте больше внимания на методологию создания вашего API.
  45. 45. Разработайте и используйте руководства по стилю вашего API вручную.
  46. 46. В конце концов, исользуйте OpenAPI или gRPC.

×