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.
2. Кто Я?
Борюсь с умирающим PHP почти с пеленок.
Более 12 лет :)
Евангелист Symfony с момента первого релиза.
Научился работать с 10-летним кодом и
сохранять спокойствие.
Творю “великие дела” в BigCommerce.
8. Требования к межсервисному взаимодействию
Описание протокола API должно быть строго декларативным.
Контракт должен быть однозначным и человеко-понятным, необходимо проводить (code)
review.
Возможность описания как и успешного сценария так и ошибки. При чем это должно
делаться явно для каждого метода.
“Скучный” код должен быть автогенерирован из контракта для PHP, Scala, GO и Ruby
11. SOAP
Stateful - необходимо состояние как и сервера,
так и клиента.
Требует наличие клиентской библиотеки.
Многие языки не поддерживают
Требует много вычислительных ресурсов, в
результате - низкое быстродействие.
Раздувает данные в несколько раз (XML)
Сложен для разработчиков в использовании
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 :)
20. Что такое gRPC?
“gRPC is 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;
}
● Единый источник истины.
● Строгая типизация.
● Правила осуществления обратной
совместимости.
● Эффективное бинарное
представление.
● Комплексное руководство по стилю
написания.
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
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, отправляем адресату;
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