Макс Волошин «Микросервисы на практике»

Post on 19-Jan-2017

1.283 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

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/

Немного философии

Буду благодарен за обратную связь!

maxvoloshin.com

maxvoloshin.com@gmail.com

top related