Макс Волошин «Микросервисы на практике»
TRANSCRIPT
● Вы слышали про идею микросервисов● Вы знаете какой профит это принесёт● Вы провели совещание на эту тему● . . .● . . .● и что теперь делать?..
Краткое содержание предыдущих серий
микросервис
Больше сути
● Декомпозиция приложения на сервисы● Интеграция UI с сервисами● Интеграция сервисов между собой
Сегодня в программе
Декомпозиция приложения
Проблема
Приложение-пример
FooSource
BarSource
Extract FooDestination
BarDestinationTr
ansf
orm
Load
{Pipeline}
Awesome-ETL
Практика монолитного приложения
UserPipelineFoo
Access Source
Destination
Bar
Access Source
DestinationHistory Payment
Сущность
Бизнес-функция
Bounded Context
Billing Service
Identity Service
Foo to Bar Service
UserPayment
Foo Access Source Pipeline
History User
Bar Access Destination
UserAuthentication Log
Bar to Foo Service
Bar Access Source Pipeline
History User
Foo Access Destination
Billing Service
Identity Service
Foo to Bar Service
UserPayment
Foo Access Source Pipeline
History User
Bar Access Destination
UserAuthentication Log
Bar to Foo Service
Bar Access Source Pipeline
History User
Foo Access Destination
Billing Service
Identity Service
Foo to Bar Service
UserPayment
Foo Access Source Pipeline
History User
Bar Access Destination
UserAuthentication Log
Bar to Foo Service
Bar Access Source Pipeline
History User
Foo Access Destination
Billing Service
Identity Service
Foo to Bar Service
UserPayment
Foo Access Source Pipeline
History User
Bar Access Destination
UserAuthentication Log
Bar to Foo Service
Bar Access Source Pipeline
History User
Foo Access Destination
Billing Service
Identity Service
Foo to Bar Service
UserPayment
Foo Access Source Pipeline
History User
Bar Access Destination
UserAuthentication Log
Bar to Foo Service
Bar Access Source Pipeline
History User
Foo Access Destination
Интеграция UI с сервисами
UI
Foo to Bar
Service
Bar to Foo
Service
Billing Servic
e
Identity
Service
Порядок взаимодействия
● Request headerso Origino Access-Control-Request-Methodo Access-Control-Request-Headers
● Response headerso Access-Control-Allow-Origino Access-Control-Allow-Credentialso Access-Control-Expose-Headerso Access-Control-Max-Ageo Access-Control-Allow-Methodso Access-Control-Allow-Headers
CORS (Cross-origin resource sharing)
server { server_name awesome-etl.com; location /services/foo-to-bar/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://awesome-etl-foo-to-bar.appspot.com/; } location /services/bar-to-foo/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://awesome-etl-bar-to-foo.appspot.com/; } location /services/billing/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://awesome-etl-billing.heroku.com/; } location /services/identity/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://awesome-etl-identity.heroku.com/; }}
server { server_name awesome-etl.com; location /services/foo-to-bar/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://awesome-etl-foo-to-bar.appspot.com/; } location /services/bar-to-foo/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://awesome-etl-bar-to-foo.appspot.com/; } location /services/billing/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://awesome-etl-billing.heroku.com/; } location /services/identity/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://awesome-etl-identity.heroku.com/; }}
Сервисы без состояния + аутентификация
Credentials
UI
Identity
Service
JSON Web Token
ServiceAuthorization: Bearer {identity token}
Cущности на пересечении сервисов
UIid=1id=2id=3
Foo BarBaz
Связь Identity и Entity токена{ iat: 1437133223 exp: 1437738023 sub: de305d54-75b4-431b-adb2-eb6b9e546014 iss: identity aud: da23614e02469a0d7c7bd1bdab5c9c474b1904dc}
{ iat: 1437134451 exp: 1437138051 iss: foo aud: de305d54-75b4-431b-adb2-eb6b9e546014 sub: 123e4567-e89b-12d3-a456-426655440000 permissions: [edit, delete]}
jwt.ioJSON Web Tokens libraries and
debugger
Интеграция сервисов
● shared database● REST / RPC● asynchronous messaging
Возможные способы
● подкупает своей простотой● нарушает инкапсуляцию сервисов● не всегда плохо
Shared database
● очевидный и логичный● связывает пару сервисов● не является fault tolerance
REST / RPC
● сохраняет слабую связанность сервисов● снимает ограничение по доступности
сервисов● усложняет всё решение в целом
Asynchronous messaging
Шина сообщений
UI
Foo to Bar
Service
Bar to Foo
Service
Billing Servic
e
Identity
Service
MessageBus
● Сообщение● Канал● Производитель сообщений● Потребитель сообщений
Сущности шины сообщений
● передаёт однородные сообщения● именуем в scope.under_score стиле
Канал
{version: ...body: {
...}
}
Сообщение
● body – содержимое сообщения● version – версия структуры body● можно использовать JSON Schema для валидации body● свойства именуем в under_score стиле
● Команда – необходимо сделатьПример канала: billing.register_usage_command
● Событие – уже произошлоПозволяют синхронизировать сущности между сервисами.Пример канала: billing.overdue_payment_event
● Запрос – необходимо получитьПример канала: some_component.whatever_query
● Ответ – получено при запросеПример канала: some_component.whatever_response
Типы сообщений
Производитель сообщенийTransaction
DB
Entity Message MessageBus
async
Push режимСервис получает сообщение сразу после его размещения.Быстрая реакция на сообщение.
Pull режимCервис потребляет сообщение когда считает нужным.Управление интенсивностью потребления.
Мы используем гибрид: push режим, но складываем во внутреннею очередь из который получаем сообщения в pull режиме.
Потребитель сообщений
Примеры идемпотентных операций:● сложение с нулём: ● умножение на единицу:
Идемпоте́нтностьТермин, означающий свойство математического объекта, которое проявляется в том, что повторное действие над объектом не изменяет его.
● идемпотентные потребители● потребление с подтверждением
Best practice потребления сообщений
● RabbitMQ● Apache Kafka● . . .● iron.io● Amazon SQS● Google Pub/Sub● . . .
Реализации MessageBus
Eventual consistency
● данные между сервисами консистенты с задержкой
● в UI приходиться принимать локальные решения
Компромисы Eventual consistency
Ресурсы к изучению
Domain-Driven Design
Enterprise Integration Patterns
Building Microservices
Exploring CQRS and Event Sourcing
Microservices Resource Guide
http://martinfowler.com/microservices/
Немного философии