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

61

Upload: dataart

Post on 19-Jan-2017

1.283 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Макс Волошин «Микросервисы на практике»
Page 2: Макс Волошин «Микросервисы на практике»
Page 3: Макс Волошин «Микросервисы на практике»

● Вы слышали про идею микросервисов● Вы знаете какой профит это принесёт● Вы провели совещание на эту тему● . . .● . . .● и что теперь делать?..

Краткое содержание предыдущих серий

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

микросервис

Больше сути

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

● Декомпозиция приложения на сервисы● Интеграция UI с сервисами● Интеграция сервисов между собой

Сегодня в программе

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

Декомпозиция приложения

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

Проблема

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

Приложение-пример

FooSource

BarSource

Extract FooDestination

BarDestinationTr

ansf

orm

Load

{Pipeline}

Awesome-ETL

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

Практика монолитного приложения

UserPipelineFoo

Access Source

Destination

Bar

Access Source

DestinationHistory Payment

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

Сущность

Бизнес-функция

Bounded Context

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

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

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

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

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

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

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

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

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

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

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

Интеграция UI с сервисами

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

UI

Foo to Bar

Service

Bar to Foo

Service

Billing Servic

e

Identity

Service

Порядок взаимодействия

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

● 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)

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

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/; }}

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

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/; }}

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

Сервисы без состояния + аутентификация

Credentials

UI

Identity

Service

JSON Web Token

ServiceAuthorization: Bearer {identity token}

Page 22: Макс Волошин «Микросервисы на практике»
Page 23: Макс Волошин «Микросервисы на практике»
Page 24: Макс Волошин «Микросервисы на практике»
Page 25: Макс Волошин «Микросервисы на практике»
Page 26: Макс Волошин «Микросервисы на практике»
Page 27: Макс Волошин «Микросервисы на практике»
Page 28: Макс Волошин «Микросервисы на практике»

Cущности на пересечении сервисов

UIid=1id=2id=3

Foo BarBaz

Page 29: Макс Волошин «Микросервисы на практике»
Page 30: Макс Волошин «Микросервисы на практике»
Page 31: Макс Волошин «Микросервисы на практике»
Page 32: Макс Волошин «Микросервисы на практике»
Page 33: Макс Волошин «Микросервисы на практике»

Связь 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]}

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

jwt.ioJSON Web Tokens libraries and

debugger

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

Интеграция сервисов

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

● shared database● REST / RPC● asynchronous messaging

Возможные способы

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

● подкупает своей простотой● нарушает инкапсуляцию сервисов● не всегда плохо

Shared database

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

● очевидный и логичный● связывает пару сервисов● не является fault tolerance

REST / RPC

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

● сохраняет слабую связанность сервисов● снимает ограничение по доступности

сервисов● усложняет всё решение в целом

Asynchronous messaging

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

Шина сообщений

UI

Foo to Bar

Service

Bar to Foo

Service

Billing Servic

e

Identity

Service

MessageBus

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

● Сообщение● Канал● Производитель сообщений● Потребитель сообщений

Сущности шины сообщений

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

● передаёт однородные сообщения● именуем в scope.under_score стиле

Канал

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

{version: ...body: {

...}

}

Сообщение

● body – содержимое сообщения● version – версия структуры body● можно использовать JSON Schema для валидации body● свойства именуем в under_score стиле

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

● Команда – необходимо сделатьПример канала: billing.register_usage_command

● Событие – уже произошлоПозволяют синхронизировать сущности между сервисами.Пример канала: billing.overdue_payment_event

● Запрос – необходимо получитьПример канала: some_component.whatever_query

● Ответ – получено при запросеПример канала: some_component.whatever_response

Типы сообщений

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

Производитель сообщенийTransaction

DB

Entity Message MessageBus

async

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

Push режимСервис получает сообщение сразу после его размещения.Быстрая реакция на сообщение.

Pull режимCервис потребляет сообщение когда считает нужным.Управление интенсивностью потребления.

Мы используем гибрид: push режим, но складываем во внутреннею очередь из который получаем сообщения в pull режиме.

Потребитель сообщений

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

Примеры идемпотентных операций:● сложение с нулём: ● умножение на единицу:

Идемпоте́нтностьТермин, означающий свойство математического объекта, которое проявляется в том, что повторное действие над объектом не изменяет его.

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

● идемпотентные потребители● потребление с подтверждением

Best practice потребления сообщений

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

● RabbitMQ● Apache Kafka● . . .● iron.io● Amazon SQS● Google Pub/Sub● . . .

Реализации MessageBus

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

Eventual consistency

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

● данные между сервисами консистенты с задержкой

● в UI приходиться принимать локальные решения

Компромисы Eventual consistency

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

Ресурсы к изучению

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

Domain-Driven Design

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

Enterprise Integration Patterns

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

Building Microservices

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

Exploring CQRS and Event Sourcing

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

Microservices Resource Guide

http://martinfowler.com/microservices/

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

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

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

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

maxvoloshin.com

[email protected]