Заряжаем микросервисы
на успех с помощью
gRPC and Protocol Buffers
Алексей Диденко
BigCommerce Inc.
Кто Я?
Борюсь с умирающим PHP почти с пеленок.
Более 12 лет :)
Евангелист Symfony с момента первого релиза.
Научился работать с 10-летним кодом и
сохранять спокойствие.
Творю “великие дела” в BigCommerce.
Что общего у этих компаний?
Что общего у этих компаний?
От монолита к микросервисам
PHP
PHP PHP
PHP PHP
PHP PHP
PHP
PHP
PHP PHP
PHP
PHP
PHP
Scala
PHP
PHP
PHP
Scala
PHP
Ruby
От монолита к микросервисам
“Эффективная” коммуникация
Требования к межсервисному взаимодействию
Описание протокола API должно быть строго декларативным.
Контракт должен быть однозначным и человеко-понятным, необходимо проводить (code)
review.
Возможность описания как и успешного сценария так и ошибки. При чем это должно
делаться явно для каждого метода.
“Скучный” код должен быть автогенерирован из контракта для PHP, Scala, GO и Ruby
Возможные решения
Возможные решения
SOAP
Stateful - необходимо состояние как и сервера,
так и клиента.
Требует наличие клиентской библиотеки.
Многие языки не поддерживают
Требует много вычислительных ресурсов, в
результате - низкое быстродействие.
Раздувает данные в несколько раз (XML)
Сложен для разработчиков в использовании
RPC over RabbitMQ
REST?
Приложение (микросервис)
1. Открываем HTTP соединение с сервером
2. Формируем и отправляем HTTP запрос.
3. Ждем ответ!
Документация
REST
API
Url: https//api.domain.com/products
Method: POST
Body: {“name”: “new product”}
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”
}
REST замечателен!
Легко понять что происходит и как работает
(текстовая репрезентация)
Построен на основе HTTP методов
Легко дебажить
Низкая зависимость сервера и клиента
Высококачественная имплементация на многих
языках
Но не всегда...
REST - это про ресурсы. Сложно смоделировать не CRUD операции.
Нет формального (машино-удобного) описания API контракта, реализация клиентов
требует участия человека. Люди не любят создавать клиентских библиотек :)
Проблемы со стримингом данных, невозможность двустроннего стриминга.
Неэффективность: передача текста по сети не оптимально.
Сложность получения множества ресурсов в одном запросе.
Частичное решение
+ Множество кодогенераторов клиентов, server
stubs (swagger-codegen, AutoRest, oas-nodegen,
APIMATIC).
+Отлична сгенерированная документация с
“песочницей”
− Большие и длинные JSON: сложность при code
review.
− Не форсирует подход “Contract first”.
− Сложно описать корректный API в одном стиле:
разные точки зрения на REST :)
100% подходящее решение: gRPC + Protocol Buffers
Очередной стандарт?
Что такое gRPC?
“gRPC is a modern open
source high performance
Remote Procedure Call
framework that can run in any
environment.
grpc.io
Первый шаг - декларация
контракта.
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;
}
● Единый источник истины.
● Строгая типизация.
● Правила осуществления обратной
совместимости.
● Эффективное бинарное
представление.
● Комплексное руководство по стилю
написания.
Генерация кода из Protocol Buffer
protoc
*.proto
PHP: автогенерируемый клиент
PHP: использование
gRPC workflow
Мультиплатформенность
gRPC использует HTTP/2 как транспорт
gRPC: двунаправленный стриминг
Дедлайны/Таймауты
Отмены
Аутентификация
● 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
Производительность
Производительность
Как обстоят дела с 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
Как обстоят дела с 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.
FastCGI Proxy
1. Принимаем запрос;
2. Вынимаем из него тело, сериализованное в Protobuf;
3. Формируем заголовки для FastCGI-запроса;
4. Отправляем FastCGI-запрос в PHP-FPM;
5. В PHP обрабатываем запрос. Формируем ответ;
6. Получаем ответ, конвертируем в gRPC, отправляем адресату;
Postman для gRPC: BloomRPC
Инструменты разработчика
 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
Трансформация gRPC в REST API: grpc-gateway
Цель REST(HTTP+JSON) gRPC
Единый источник истины ✗ ✔
Мультиплатформенность +
мультиязычность
✗ ✔
Обработка ‘non-breaking’ изменений ✗ ✔
Сеть: обработка запросов ✗ (1 запрос на соединение) ✔ (множество запросов на
соединение)
Скорость: передача данных Текст ✗ Бинарный ✔
CPU: оптимальное использование ресурсов ✗ ✔
Трассировка Вручную ✗ Легко подключить ✔
Логирование Вручную ✗ Легко подключить ✔
Мониторинг Вручную ✗ Легко подключить ✔
COMPATIBILITYPERFORMANCEMAINTENANCE
Во-первых, перестаньте писать интерфейсный
код для вашего API вручную.
Во-вторых, перестаньте писать интерфейсный
код для вашего API вручную.
В-третьих, перестаньте писать интерфейсный
код для вашего API вручную.
Обращайте больше внимания на методологию
создания вашего API.
Разработайте и используйте руководства по
стилю вашего API вручную.
В конце концов, исользуйте OpenAPI или gRPC.
Power-up micro-services with gRPC and ProtoBuffers

Power-up micro-services with gRPC and ProtoBuffers

  • 1.
    Заряжаем микросервисы на успехс помощью gRPC and Protocol Buffers Алексей Диденко BigCommerce Inc.
  • 2.
    Кто Я? Борюсь сумирающим PHP почти с пеленок. Более 12 лет :) Евангелист Symfony с момента первого релиза. Научился работать с 10-летним кодом и сохранять спокойствие. Творю “великие дела” в BigCommerce.
  • 3.
    Что общего уэтих компаний?
  • 4.
    Что общего уэтих компаний?
  • 5.
    От монолита кмикросервисам PHP PHP PHP PHP PHP PHP PHP PHP PHP PHP PHP PHP PHP PHP Scala PHP PHP PHP Scala PHP Ruby
  • 6.
    От монолита кмикросервисам
  • 7.
  • 8.
    Требования к межсервисномувзаимодействию Описание протокола API должно быть строго декларативным. Контракт должен быть однозначным и человеко-понятным, необходимо проводить (code) review. Возможность описания как и успешного сценария так и ошибки. При чем это должно делаться явно для каждого метода. “Скучный” код должен быть автогенерирован из контракта для PHP, Scala, GO и Ruby
  • 9.
  • 10.
  • 11.
    SOAP Stateful - необходимосостояние как и сервера, так и клиента. Требует наличие клиентской библиотеки. Многие языки не поддерживают Требует много вычислительных ресурсов, в результате - низкое быстродействие. Раздувает данные в несколько раз (XML) Сложен для разработчиков в использовании
  • 12.
  • 13.
    REST? Приложение (микросервис) 1. ОткрываемHTTP соединение с сервером 2. Формируем и отправляем HTTP запрос. 3. Ждем ответ! Документация REST API Url: https//api.domain.com/products Method: POST Body: {“name”: “new product”}
  • 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.
    REST замечателен! Легко понятьчто происходит и как работает (текстовая репрезентация) Построен на основе HTTP методов Легко дебажить Низкая зависимость сервера и клиента Высококачественная имплементация на многих языках
  • 16.
    Но не всегда... REST- это про ресурсы. Сложно смоделировать не CRUD операции. Нет формального (машино-удобного) описания API контракта, реализация клиентов требует участия человека. Люди не любят создавать клиентских библиотек :) Проблемы со стримингом данных, невозможность двустроннего стриминга. Неэффективность: передача текста по сети не оптимально. Сложность получения множества ресурсов в одном запросе.
  • 17.
    Частичное решение + Множествокодогенераторов клиентов, server stubs (swagger-codegen, AutoRest, oas-nodegen, APIMATIC). +Отлична сгенерированная документация с “песочницей” − Большие и длинные JSON: сложность при code review. − Не форсирует подход “Contract first”. − Сложно описать корректный API в одном стиле: разные точки зрения на REST :)
  • 18.
  • 19.
  • 20.
    Что такое gRPC? “gRPCis a modern open source high performance Remote Procedure Call framework that can run in any environment. grpc.io
  • 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.
    Генерация кода изProtocol Buffer protoc *.proto
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
    gRPC использует HTTP/2как транспорт
  • 28.
  • 29.
  • 30.
  • 31.
    Аутентификация ● SSL/TLS: gRPChas 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.
  • 33.
  • 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.
    Как обстоят делас 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.
    FastCGI Proxy 1. Принимаемзапрос; 2. Вынимаем из него тело, сериализованное в Protobuf; 3. Формируем заголовки для FastCGI-запроса; 4. Отправляем FastCGI-запрос в PHP-FPM; 5. В PHP обрабатываем запрос. Формируем ответ; 6. Получаем ответ, конвертируем в gRPC, отправляем адресату;
  • 37.
  • 38.
    Инструменты разработчика  gRPC commandline 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.
    Трансформация gRPC вREST API: grpc-gateway
  • 40.
    Цель REST(HTTP+JSON) gRPC Единыйисточник истины ✗ ✔ Мультиплатформенность + мультиязычность ✗ ✔ Обработка ‘non-breaking’ изменений ✗ ✔ Сеть: обработка запросов ✗ (1 запрос на соединение) ✔ (множество запросов на соединение) Скорость: передача данных Текст ✗ Бинарный ✔ CPU: оптимальное использование ресурсов ✗ ✔ Трассировка Вручную ✗ Легко подключить ✔ Логирование Вручную ✗ Легко подключить ✔ Мониторинг Вручную ✗ Легко подключить ✔ COMPATIBILITYPERFORMANCEMAINTENANCE
  • 41.
    Во-первых, перестаньте писатьинтерфейсный код для вашего API вручную.
  • 42.
    Во-вторых, перестаньте писатьинтерфейсный код для вашего API вручную.
  • 43.
    В-третьих, перестаньте писатьинтерфейсный код для вашего API вручную.
  • 44.
    Обращайте больше вниманияна методологию создания вашего API.
  • 45.
    Разработайте и используйтеруководства по стилю вашего API вручную.
  • 46.
    В конце концов,исользуйте OpenAPI или gRPC.