Дикие микросервисы на jug Екатеринбург

237
WILD microSERVICES 18+

Upload: -

Post on 20-Mar-2017

159 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Дикие микросервисы на JUG Екатеринбург

WILD microSERVICES

18+

Page 2: Дикие микросервисы на JUG Екатеринбург

@tolkv

@lavcraft

Page 3: Дикие микросервисы на JUG Екатеринбург

@aatarasoff

@aatarasoff

Page 4: Дикие микросервисы на JUG Екатеринбург

WILD microSERVICES

18+

Page 5: Дикие микросервисы на JUG Екатеринбург

DISCLAIMER

No warranty guarantee

5

Page 6: Дикие микросервисы на JUG Екатеринбург

Agenda

1. Theory

2. Practice

3. Q&A

6

Page 7: Дикие микросервисы на JUG Екатеринбург

7

● делается с первого раза

● не меняется годами

● не зависит от людей

● не зависит от процессов

Page 8: Дикие микросервисы на JUG Екатеринбург

8

У всех нас конечно же так

Page 9: Дикие микросервисы на JUG Екатеринбург

9

У всех нас конечно же так

Page 10: Дикие микросервисы на JUG Екатеринбург

10

Закон “Почему”

Page 11: Дикие микросервисы на JUG Екатеринбург

11

“Почему JQuery?”

Page 12: Дикие микросервисы на JUG Екатеринбург

12

Page 13: Дикие микросервисы на JUG Екатеринбург

13

Page 14: Дикие микросервисы на JUG Екатеринбург

14

Точка зрения: архитектор

Page 15: Дикие микросервисы на JUG Екатеринбург

15

Работа идеального архитектора

Page 16: Дикие микросервисы на JUG Екатеринбург

16

Работа идеального архитектора

Page 17: Дикие микросервисы на JUG Екатеринбург

17

Работа идеального архитектора

Page 18: Дикие микросервисы на JUG Екатеринбург

18

Точка зрения: разработчик

Page 19: Дикие микросервисы на JUG Екатеринбург

Немного деталей не помешает

19

Page 20: Дикие микросервисы на JUG Екатеринбург

Немного деталей не помешает

20

Page 21: Дикие микросервисы на JUG Екатеринбург

Архитектура

21

Page 22: Дикие микросервисы на JUG Екатеринбург

АрхитектураЧто это?

22

Page 23: Дикие микросервисы на JUG Екатеринбург

Что же такое архитектура?

23

Page 24: Дикие микросервисы на JUG Екатеринбург

Что же такое архитектура?

24

Page 25: Дикие микросервисы на JUG Екатеринбург

Что же такое архитектура?

25

https://www.youtube.com/watch?v=_Kex5hwGE-w

Page 26: Дикие микросервисы на JUG Екатеринбург

26

Page 27: Дикие микросервисы на JUG Екатеринбург

yoman

Yo

start.spring.io

Ss

python

Py

lazybones

Lzjava

Ja

spring boot

Sb

gradle

Grasciidoctor

Adthrift

Thdocker

Dr

mesos

Ms

marathon

Machronos

Chaurora

AuArtifactory

Ar

Kubernetes

Kb

eureka

Eu

consul

Cl

etcd

Ed

zookeeper

Zkhystrix

Hx

sleuth

Sl

zipkin

Zn

groovy

Gy

27

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdConway’s Law

CoSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

An

Page 28: Дикие микросервисы на JUG Екатеринбург

yoman

Yo

start.spring.io

Ss

python

Py

lazybones

Lzjava

Ja

spring boot

Sb

gradle

Grasciidoctor

Adthrift

Thdocker

Dr

mesos

Ms

marathon

Machronos

Chaurora

AuArtifactory

Ar

Kubernetes

Kb

eureka

Eu

consul

Cl

etcd

Ed

zookeeper

Zkhystrix

Hx

sleuth

Sl

zipkin

Zn

groovy

Gy

28

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdConway’s Law

CoSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

An

Page 29: Дикие микросервисы на JUG Екатеринбург

yoman

Yo

start.spring.io

Ss

python

Py

lazybones

Lzjava

Ja

spring boot

Sb

gradle

Grasciidoctor

Adthrift

Thdocker

Dr

mesos

Ms

marathon

Machronos

Chaurora

AuArtifactory

Ar

Kubernetes

Kb

eureka

Eu

consul

Cl

etcd

Ed

zookeeper

Zkhystrix

Hx

sleuth

Sl

zipkin

Zn

groovy

Gy

29

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdConway’s Law

CoSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

An

Page 30: Дикие микросервисы на JUG Екатеринбург

30

Закон Конвея

Page 31: Дикие микросервисы на JUG Екатеринбург

Big Ball of Mud

31

Page 32: Дикие микросервисы на JUG Екатеринбург

SOLID

Counter-Strike Cats

32

Page 33: Дикие микросервисы на JUG Екатеринбург

GOF

SOLID

TDD

Counter-Strike Cats

33

Page 34: Дикие микросервисы на JUG Екатеринбург

12 April 1996Первое упоминание SOA

https://www.gartner.com/doc/302868/service-oriented-architectures- 34

Page 35: Дикие микросервисы на JUG Екатеринбург

Принципы SOA1. Standardized service contract

2. Loose coupling

3. Encapsulation

4. Reusability

5. Autonomy

6. Statelessness

7. Discoverability35

Page 36: Дикие микросервисы на JUG Екатеринбург

Принципы SOA1. Standardized service contract

2. Loose coupling

3. Encapsulation

4. Reusability

5. Autonomy

6. Statelessness

7. Discoverability36

Page 37: Дикие микросервисы на JUG Екатеринбург

5 January 2009SOA is Dead

http://apsblog.burtongroup.com/2009/01/soa-is-dead-long-live-services.html 37

Page 38: Дикие микросервисы на JUG Екатеринбург

SOA != SOAP (WS-*)

38

Page 39: Дикие микросервисы на JUG Екатеринбург

39

Про тренды

Page 40: Дикие микросервисы на JUG Екатеринбург

In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.

-- James Lewis and Martin Fowler

Что такое микросервисы?

40

Page 41: Дикие микросервисы на JUG Екатеринбург

In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.

-- James Lewis and Martin Fowler

Что такое микросервисы?

41

Page 42: Дикие микросервисы на JUG Екатеринбург

Размер имеет значение?

● Method/Function = Microservice?

● 10-300 LOC = Microservice?

● 1 week = Microservice?

● 1 developer = Microservice?

42

Page 43: Дикие микросервисы на JUG Екатеринбург

Размер не имеет значения*

● Single Responsibility

● One capability

● Bounded context

“In your organization, you should be thinking not in terms of data that is shared, but about the capabilities those contexts provide the rest of the domain.”– Sam Newman, Building Microservices

*до разумных пределов конечно43

Page 44: Дикие микросервисы на JUG Екатеринбург

Domain-Driven Design

44

Page 45: Дикие микросервисы на JUG Екатеринбург

In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.

-- James Lewis and Martin Fowler

Что такое микросервисы?

45

Page 46: Дикие микросервисы на JUG Екатеринбург

Process segregation

46

Page 47: Дикие микросервисы на JUG Екатеринбург

In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.

-- James Lewis and Martin Fowler

Что такое микросервисы?

47

Page 48: Дикие микросервисы на JUG Екатеринбург

Независимый деплой

build test

48

Page 49: Дикие микросервисы на JUG Екатеринбург

In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.

-- James Lewis and Martin Fowler

Что такое микросервисы?

49

Page 50: Дикие микросервисы на JUG Екатеринбург

Language/technology segregation

50

Page 51: Дикие микросервисы на JUG Екатеринбург

Data segregation

51

Page 52: Дикие микросервисы на JUG Екатеринбург

Team segregation

52

Page 53: Дикие микросервисы на JUG Екатеринбург

53

DDD

DdSOA

SoConway’s Law

Co

Page 54: Дикие микросервисы на JUG Екатеринбург

54

Page 55: Дикие микросервисы на JUG Екатеринбург

55

Java

Python

JS

Page 56: Дикие микросервисы на JUG Екатеринбург

56

● Spring Boot/Spring Cloud

● Ratpack

● Dropwizard

● Vert.x

● Restlet

● Spark

● KumuluzEE

?

Page 57: Дикие микросервисы на JUG Екатеринбург

57

● Spring Boot/Spring Cloud

● Ratpack

● Dropwizard

● Vert.x

● Restlet

● Spark

● KumuluzEE

Выбирайте то, что больше нравится

/ в чем есть экспертиза

Page 58: Дикие микросервисы на JUG Екатеринбург

58

Page 59: Дикие микросервисы на JUG Екатеринбург

59

Page 60: Дикие микросервисы на JUG Екатеринбург

Принцип LSD

- L языков программирования- S среднее число фреймворков на язык- D типов источников данных

complexity = L * S * D

60

Page 61: Дикие микросервисы на JUG Екатеринбург

Немного LSD для вас

- три языка программирования- два в среднем фреймворка на язык- семь типов источников данных

- legacy WS, mongo db- OLTP, OLAP- elasticsearch, neo4j- Мишкина база %)

complexity = 3 * 2 * 7 = 42 (!)61

Page 62: Дикие микросервисы на JUG Екатеринбург

Чем нельзя пожертвовать?

min (L * S * D) → ?

62

Page 63: Дикие микросервисы на JUG Екатеринбург

min (L * S * D) → max (D)

63

Page 64: Дикие микросервисы на JUG Екатеринбург

L = Java 18+S = Spring BootD = ∞

64

Page 65: Дикие микросервисы на JUG Екатеринбург

L = Java

L += PythonL += JavaScript

65

Нарушать правила можно

Page 66: Дикие микросервисы на JUG Екатеринбург

java

Ja

spring boot

Sb

66

DDD

DdSOA

SoLSD principle

LsConway’s Law

Co

Page 67: Дикие микросервисы на JUG Екатеринбург

67

Page 68: Дикие микросервисы на JUG Екатеринбург

68

t0

Page 69: Дикие микросервисы на JUG Екатеринбург

git clone <golden_service_repo>

69

Page 70: Дикие микросервисы на JUG Екатеринбург

70

Код устарел

Page 71: Дикие микросервисы на JUG Екатеринбург

71

Код устарелНужно переименовать классы

Page 72: Дикие микросервисы на JUG Екатеринбург

72

Код устарелНужно переименовать классыНужно удалить неиспользуемое

Page 73: Дикие микросервисы на JUG Екатеринбург

73

Код устарелНужно переименовать классыНужно удалить неиспользуемоеПрочая магия

Время, ошибки, фрагментация

Page 74: Дикие микросервисы на JUG Екатеринбург

git clone <template_repo>

74

Page 75: Дикие микросервисы на JUG Екатеринбург

75

Нужно переименовать классыНужно кастомизировать руками

Время

актуализация

Page 76: Дикие микросервисы на JUG Екатеринбург

lazybones / start.spring.io / yeoman

76

Page 77: Дикие микросервисы на JUG Екатеринбург

lazybones create api 1.0.1 service_name

77

Page 78: Дикие микросервисы на JUG Екатеринбург

~home > lazybones create api 0.0.1 rent-service

78

Page 79: Дикие микросервисы на JUG Екатеринбург

~home > lazybones create api 0.0.1 rent-serviceCreating project from template api 0.0.1 in 'rent-service'Define value for 'group' [ru.vrn.jug]:

79

Page 80: Дикие микросервисы на JUG Екатеринбург

~home > lazybones create api 0.0.1 rent-serviceCreating project from template api 0.0.1 in 'rent-service'Define value for 'group' [ru.vrn.jug]:Define value for 'version' [0.0.1]:

80

Page 81: Дикие микросервисы на JUG Екатеринбург

~home > lazybones create api 0.0.1 rent-serviceCreating project from template api 0.0.1 in 'rent-service'Define value for 'group' [ru.vrn.jug]:Define value for 'version' [0.0.1]:

srv1 ├──srv2 └──srv3

loggingsleuth

Define value for 'dependencies' [logging,sleuth]:

81

Page 82: Дикие микросервисы на JUG Екатеринбург

~home > lazybones create api 0.0.1 rent-serviceCreating project from template api 0.0.1 in 'rent-service'Define value for 'group' [ru.vrn.jug]:Define value for 'version' [0.0.1]:

srv1 ├──srv2 └──srv3

loggingsleuth

Define value for 'dependencies' [logging,sleuth]:

Project created for rent-service!

82

Page 83: Дикие микросервисы на JUG Екатеринбург

83

Page 84: Дикие микросервисы на JUG Екатеринбург

lazybones

Lz

yeoman

Yo

start.spring.io

Ssjava

Ja

spring boot

Sbgroovy

Gy

84

LSD principle

LsDDD

DdSOA

SoConway’s Law

Co

Page 85: Дикие микросервисы на JUG Екатеринбург

DRY off

85

Page 86: Дикие микросервисы на JUG Екатеринбург

TServerTransport serverTransport = new TServerSocket( new InetSocketAddress(InetAddress.getLocalHost(), port));

TProcessor processor = new TInsuranceService.Processor<>(

//business value here);

server = new TSimpleServer(new

TServer.Args(serverTransport).processor(processor));

server.serve();

86

Page 87: Дикие микросервисы на JUG Екатеринбург

TSocket transport = new TSocket(host, port);transport.open();

TBinaryProtocol tBinaryProtocol = new TBinaryProtocol(transport);TInsuranceService.Client client =

new TInsuranceService.Client(tBinaryProtocol);

perform(client); //business value here

transport.close(); 87

Page 88: Дикие микросервисы на JUG Екатеринбург

@ThriftControllerpublic class InsuranceController implements TInsuranceService.Iface { @Override public void someMethod(TInsurance insurance){ //business value here }}

88

Page 89: Дикие микросервисы на JUG Екатеринбург

@ThriftClient(serviceId = "insurance-service")TInsuranceService.Client client;

...perform(client); //business value here...

89

Page 90: Дикие микросервисы на JUG Екатеринбург

smart libsstarters

launchers

shared libsutils

helpers

90

Page 91: Дикие микросервисы на JUG Екатеринбург

91

Старт приложения

Рабочее приложение

Page 92: Дикие микросервисы на JUG Екатеринбург

@ThriftClient(serviceId = "insurance-service")TInsuranceService.Client client;

TInsuranceService.Client client = Creator.create(TInsuranceService.Client.class,

"insurance-service");

...perform(client); //business value here...

92

Page 93: Дикие микросервисы на JUG Екатеринбург

93

Fluent annotations

Page 94: Дикие микросервисы на JUG Екатеринбург

@Getter // generate getters@Setter // generate setters@Aspect // we are an aspect@ToString // generate toString()@EnableWs // SOAP is so enterprisy, we definitely need it@Endpoint // Seriously, just read above@EnableWebMvc // we want MVC@EnableCaching // and we want to cache stuff@Configuration // this class can configure itself@RestController // we want some REST@XmlRootElement // this component is marshallable@EnableWebSocket // we want web socket, it's so new-generation@RedisHash("cat") // this class is an entity saved in redis@EnableScheduling // we want scheduled tasks@EnableWebSecurity // and some built-in security@NoArgsConstructor // generate no args constructor@ContextConfiguration // we want context configuration for unit testing@SpringBootApplication // this is a Sprint Boot application@Accessors(chain = true) // getters/setters are chained (ala jQuery)@EnableAspectJAutoProxy // we want AspectJ auto proxy@EnableAutoConfiguration // and auto configuration@EnableRedisRepositories // since it is an entity we want to enable spring data repositories for redis@EnableWebSocketMessageBroker // we want a broker for web socket messages

94

Fluent annotations

Page 95: Дикие микросервисы на JUG Екатеринбург

@Getter // generate getters@Setter // generate setters@Aspect // we are an aspect@ToString // generate toString()@EnableWs // SOAP is so enterprisy, we definitely need it@Endpoint // Seriously, just read above@EnableWebMvc // we want MVC@EnableCaching // and we want to cache stuff@Configuration // this class can configure itself@RestController // we want some REST@XmlRootElement // this component is marshallable@EnableWebSocket // we want web socket, it's so new-generation@RedisHash("cat") // this class is an entity saved in redis@EnableScheduling // we want scheduled tasks@EnableWebSecurity // and some built-in security@NoArgsConstructor // generate no args constructor@ContextConfiguration // we want context configuration for unit testing@SpringBootApplication // this is a Sprint Boot application@Accessors(chain = true) // getters/setters are chained (ala jQuery)@EnableAspectJAutoProxy // we want AspectJ auto proxy@EnableAutoConfiguration // and auto configuration@EnableRedisRepositories // since it is an entity we want to enable spring data repositories for redis@EnableWebSocketMessageBroker // we want a broker for web socket messages

95

Fluent annotations

Page 96: Дикие микросервисы на JUG Екатеринбург

smart libs/shared libs

96

Page 97: Дикие микросервисы на JUG Екатеринбург

documentation → smart documentation

97

Page 98: Дикие микросервисы на JUG Екатеринбург

Not smart= This is main documentation

This document describes how to be the most fundamental and important document in the world of documents

...COPY-PASTE documentation from another document...

98

Page 99: Дикие микросервисы на JUG Екатеринбург

Not so smart= This is main documentation

This document describes how to be the most fundamental and important document in the world of documents

include::https://raw.github.com/asciidoctor/asciidoctor/master/Gemfile[]

include::../other.adoc[]include::/home/tolkv/git/docs-0/superdoc.adoc[]

99

Page 100: Дикие микросервисы на JUG Екатеринбург

Really smart= This is main documentation

This document describes how to be the most fundamental and important document in the world of documents

include::https://raw.github.com/asciidoctor/asciidoctor/master/Gemfile[]

include::gradle://gradle-advanced:service-with-deps:1.0/deps.adoc[]include::gradle://:service/doc.adoc[]

100

Page 101: Дикие микросервисы на JUG Екатеринбург

Payment Service[jar,doc] Insurance Service [jar,doc]

One Point of View [UberDoc.zip]

Rent Service[jar,doc] Other Service [jar,doc]

Агрегация информации

101

Page 102: Дикие микросервисы на JUG Екатеринбург

Парадокс централизацииЧтобы эффективно разрабатывать распределённые

приложения, нам нужны очень хорошие централизованные библиотеки и инструменты

Например: логирование, health-checking, метрики, обработка типовых ошибок, автодокументирование

102

Page 103: Дикие микросервисы на JUG Екатеринбург

Парадокс централизацииЧтобы эффективно разрабатывать распределённые

приложения, нам нужны очень хорошие централизованные библиотеки и инструменты

Но: не выносите бизнес-логику или доменные объекты!Не размывайте бизнес-контекст вашего API

103

Page 104: Дикие микросервисы на JUG Екатеринбург

lazybones

Lz

yoman

Yo

start.spring.io

Ssjava

Ja

thrift

Th

spring boot

Sb

gradle

Grasciidoctor

Ad

groovy

Gy

104

Centralization paradox

CpLSD principle

LsDDD

DdSmart Docs

SdSmart Libs

SlSOA

SoConway’s Law

Co

Page 105: Дикие микросервисы на JUG Екатеринбург

Изоляция данных

105

Page 106: Дикие микросервисы на JUG Екатеринбург

106

Одно приложение - одна БД

Всё просто

Page 107: Дикие микросервисы на JUG Екатеринбург

N сервисов → 1 БД

Изоляция на уровне таблиц или схем107

Page 108: Дикие микросервисы на JUG Екатеринбург

N сервисов → 1 БД

Изоляция через хранимые процедуры

108

Page 109: Дикие микросервисы на JUG Екатеринбург

109

Transport Layer

API API API API API

Page 110: Дикие микросервисы на JUG Екатеринбург

110

Transport Layer

API API API API API

Page 111: Дикие микросервисы на JUG Екатеринбург

N сервисов → 1 БД

Распределённый монолит111

Page 112: Дикие микросервисы на JUG Екатеринбург

N сервисов → N БД

112

Page 113: Дикие микросервисы на JUG Екатеринбург

N сервисов → N БД

Распределённые транзакции – это больно

113

Page 114: Дикие микросервисы на JUG Екатеринбург

114

Transport Layer

API API API API API

Очень много кода

Page 115: Дикие микросервисы на JUG Екатеринбург

N сервисов → N БД

Ваше legacy тянет вас на дно115

Page 116: Дикие микросервисы на JUG Екатеринбург

116

Page 117: Дикие микросервисы на JUG Екатеринбург

M сервисов → 1 БД L сервисов → L БД

M + L = N, M << L117

Page 118: Дикие микросервисы на JUG Екатеринбург

118

Transport Layer

APIAPI API API API

Page 119: Дикие микросервисы на JUG Екатеринбург

M сервисов → 1 БД L сервисов → L БД

M + L = N, M << L119

Page 120: Дикие микросервисы на JUG Екатеринбург

lazybones

Lz

yoman

Yo

start.spring.io

Ssjava

Ja

thrift

Th

spring boot

Sb

gradle

Grasciidoctor

Ad

groovy

Gy

120

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdConway`s law

CoSmart Docs

SdSmart Libs

SlSOA

So

Page 121: Дикие микросервисы на JUG Екатеринбург

Доставка

121

Page 122: Дикие микросервисы на JUG Екатеринбург

war/ear

122

Зависимость от сервера приложений

Page 123: Дикие микросервисы на JUG Екатеринбург

executable fatJar

123

Зависимость от системных библиотек

Page 124: Дикие микросервисы на JUG Екатеринбург

124

not war < make Jar

Page 125: Дикие микросервисы на JUG Екатеринбург

executable fatJar/npm-пакет

125

Разный менеджмент для разных форматов дистрибуции

Page 126: Дикие микросервисы на JUG Екатеринбург

docker/rkt/packer

126

Page 127: Дикие микросервисы на JUG Екатеринбург

127

not jar < make docker

Page 128: Дикие микросервисы на JUG Екатеринбург

scp fat.jar root@prod101:/home/app/

128

Page 129: Дикие микросервисы на JUG Екатеринбург

scp fat.jar root@prod101:/home/app/

Что делать с консистентостью?Как быть с доступностью?

129

Page 130: Дикие микросервисы на JUG Екатеринбург

./gradlew deployToArtifactoryansible -i [stage,dev,test] -t deploy

130

Page 131: Дикие микросервисы на JUG Екатеринбург

./gradlew deployToArtifactoryansible -i [stage,dev,test] -t deploy

“Прибитая молотком” конфигурация131

Page 132: Дикие микросервисы на JUG Екатеринбург

132

Как быстро масштабироваться?

Page 133: Дикие микросервисы на JUG Екатеринбург

Нужна оркестрация

133

Page 134: Дикие микросервисы на JUG Екатеринбург

134

Page 135: Дикие микросервисы на JUG Екатеринбург

mesos / kubernetes / ∞

135

Page 136: Дикие микросервисы на JUG Екатеринбург

Как использовать ресурсы

136

Page 137: Дикие микросервисы на JUG Екатеринбург

137

t

Bare Metal

Page 138: Дикие микросервисы на JUG Екатеринбург

138

t

Bare Metal

Virtual Machines

Page 139: Дикие микросервисы на JUG Екатеринбург

139

t

Bare Metal

Virtual Machines

LightweightContainers

Page 140: Дикие микросервисы на JUG Екатеринбург

140

t

Bare Metal

Virtual Machines

LightweightContainers

Page 141: Дикие микросервисы на JUG Екатеринбург

141

Page 142: Дикие микросервисы на JUG Екатеринбург

Использование группы машин как одной

WEB

WASTED

CACHE

WASTED WASTED

HADOOP

142

Page 143: Дикие микросервисы на JUG Екатеринбург

Представьте, что кластер это просто одна большая машина

WEB

WASTED

CACHE

WASTED WASTED

HADOOP

WASTED

WEBCACHE

HADOOP FREE FREE

143

Page 144: Дикие микросервисы на JUG Екатеринбург

lazybones

Lz

yoman

Yo

start.spring.io

Ss

python

Py

java

Ja

spring boot

Sb

gradle

Grasciidoctor

Addocker

Dr

mesos

Ms

marathon

Machronos

Chaurora

Au

Kubernetes

Kbgroovy

Gy

144

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdSAGAS

SaSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

Anthrift

ThArtifactory

Ar

Page 145: Дикие микросервисы на JUG Екатеринбург

Найти нужный экземпляр

145

Page 146: Дикие микросервисы на JUG Екатеринбург

insert into settings_table values (key, endpoint)

146

“Прибитая молотком” конфигурация

Page 147: Дикие микросервисы на JUG Екатеринбург

update template → services.locationkill -s HUP nginx

147

Остаётся статическая привязка ресурсов

Page 148: Дикие микросервисы на JUG Екатеринбург

eureka/consul/etcd/zookeper

148

Page 149: Дикие микросервисы на JUG Екатеринбург

149

Service ClientRegistry-aware

HTTP Client

Service Registry

Service Instance 1

Service Instance N

Service Instance ...

Load balance request

Client side discovery

Page 150: Дикие микросервисы на JUG Екатеринбург

150

Service Client

Service Registry

Service Instance 1

Service Instance N

Service Instance ...

Load balance requestRouter/Proxy

Server side discovery

Page 151: Дикие микросервисы на JUG Екатеринбург

yoman

Yo

start.spring.io

Ss

python

Py

lazybones

Lzjava

Ja

spring boot

Sb

gradle

Grasciidoctor

Adthrift

Thdocker

Dr

mesos

Ms

marathon

Machronos

Chaurora

AuArtifactory

Ar

Kubernetes

Kb

eureka

Eu

consul

Cl

etcd

Ed

zookeeper

Zkgroovy

Gy

151

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdSAGAS

SaSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

An

Page 152: Дикие микросервисы на JUG Екатеринбург

Защити себя сам

152

Page 153: Дикие микросервисы на JUG Екатеринбург

153

Page 154: Дикие микросервисы на JUG Екатеринбург

154

Хочу бегемота!

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

5мс

Page 155: Дикие микросервисы на JUG Екатеринбург

155

Хочу бегемота!

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

300мс

Page 156: Дикие микросервисы на JUG Екатеринбург

156

Хочу бегемота!

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

300мс

Page 157: Дикие микросервисы на JUG Екатеринбург

157

Хочу бегемота!

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

300мс

Page 158: Дикие микросервисы на JUG Екатеринбург

158

Хочу бегемота!

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

300мс

Page 159: Дикие микросервисы на JUG Екатеринбург

159

Circuit Breaker

Page 160: Дикие микросервисы на JUG Екатеринбург

160

Хочу бегемота!

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

300мс

Page 161: Дикие микросервисы на JUG Екатеринбург

161

Хочу бегемота!

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

300мсOpen

Page 162: Дикие микросервисы на JUG Екатеринбург

162

Хочу бегемота!

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

300мсHalf-Open

Page 163: Дикие микросервисы на JUG Екатеринбург

163

Хочу бегемота!

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

5мсHalf-Open

Page 164: Дикие микросервисы на JUG Екатеринбург

164

Хочу бегемота!

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

5мс

Page 165: Дикие микросервисы на JUG Екатеринбург

hystrix/apache camel/akka

165

Page 166: Дикие микросервисы на JUG Екатеринбург

166

Page 167: Дикие микросервисы на JUG Екатеринбург

yoman

Yo

start.spring.io

Ss

python

Py

lazybones

Lzjava

Ja

spring boot

Sb

gradle

Grasciidoctor

Adthrift

Thdocker

Dr

mesos

Ms

marathon

Machronos

Chaurora

AuArtifactory

Ar

Kubernetes

Kb

eureka

Eu

consul

Cl

etcd

Ed

zookeeper

Zkhystrix

Hxgroovy

Gy

167

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

An

Conway’s Law

Co

Page 168: Дикие микросервисы на JUG Екатеринбург

Следи за своим ПО

168

Page 169: Дикие микросервисы на JUG Екатеринбург

Нет трассировки - нет проблем? :)

169

Page 170: Дикие микросервисы на JUG Екатеринбург

X-Request-Id = X-Request-Id ?: new ID

Простой вариант с ServletFilter170

Page 171: Дикие микросервисы на JUG Екатеринбург

spring-cloud-sleuth/open zipkin

171

Page 172: Дикие микросервисы на JUG Екатеринбург

172

Rent

Ser

vice

No TraceIdNo SpanId

TraceId = XSpanId = A

Page 173: Дикие микросервисы на JUG Екатеринбург

173

Rent

Ser

vice

Paym

ent

Serv

ice

No TraceIdNo SpanId

TraceId = XSpanId = A

TraceId = XSpanId = B

TraceId = XSpanId = C

Page 174: Дикие микросервисы на JUG Екатеринбург

174

Rent

Ser

vice

Paym

ent

Serv

ice

Bloc

kcha

in S

ervi

ce

No TraceIdNo SpanId

TraceId = XSpanId = A

TraceId = XSpanId = B

TraceId = XSpanId = C

TraceId = XSpanId = D

TraceId = XSpanId = D

TraceId = XSpanId = F

Page 175: Дикие микросервисы на JUG Екатеринбург

175

Rent

Ser

vice

Paym

ent

Serv

ice

Secu

rity

Ser

vice

Bloc

kcha

in S

ervi

ce

No TraceIdNo SpanId

TraceId = XSpanId = A

TraceId = XSpanId = B

TraceId = XSpanId = C

TraceId = XSpanId = D

TraceId = XSpanId = D

TraceId = XSpanId = E

TraceId = XSpanId = E

TraceId = XSpanId = F

TraceId = XSpanId = G

Page 176: Дикие микросервисы на JUG Екатеринбург

176

Rent

Ser

vice

Paym

ent

Serv

ice

Secu

rity

Ser

vice

Bloc

kcha

in S

ervi

ce

No TraceIdNo SpanId

TraceId = XSpanId = A

TraceId = XSpanId = B

TraceId = XSpanId = B

TraceId = XSpanId = C

TraceId = XSpanId = C

TraceId = XSpanId = D

TraceId = XSpanId = D

TraceId = XSpanId = E

TraceId = XSpanId = E

TraceId = XSpanId = F

TraceId = XSpanId = G

Page 177: Дикие микросервисы на JUG Екатеринбург

177

Rent

Ser

vice

Paym

ent

Serv

ice

Secu

rity

Ser

vice

Bloc

kcha

in S

ervi

ce

TraceId = XSpanId = A

No TraceIdNo SpanId

TraceId = XSpanId = A

TraceId = XSpanId = A

TraceId = XSpanId = B

TraceId = XSpanId = B

TraceId = XSpanId = C

TraceId = XSpanId = C

TraceId = XSpanId = D

TraceId = XSpanId = D

TraceId = XSpanId = E

TraceId = XSpanId = E

TraceId = XSpanId = F

TraceId = XSpanId = G

Page 178: Дикие микросервисы на JUG Екатеринбург

178

Page 179: Дикие микросервисы на JUG Екатеринбург

179

Page 180: Дикие микросервисы на JUG Екатеринбург

180

Rent

Ser

vice

Paym

ent

Serv

ice

Page 181: Дикие микросервисы на JUG Екатеринбург

181

Rent

Ser

vice

Paym

ent

Serv

ice

SpanId = BClient Send

TraceId = XSpanId = A

Page 182: Дикие микросервисы на JUG Екатеринбург

182

Rent

Ser

vice

Paym

ent

Serv

ice

SpanId = BClient Send

SpanId = BServer Received

TraceId = XSpanId = A

TraceId = XSpanId = C

Page 183: Дикие микросервисы на JUG Екатеринбург

183

Rent

Ser

vice

Paym

ent

Serv

ice

SpanId = BClient Send

SpanId = BServer Received

SpanId = BServer Send

TraceId = XSpanId = A

TraceId = XSpanId = C

Page 184: Дикие микросервисы на JUG Екатеринбург

184

Rent

Ser

vice

Paym

ent

Serv

ice

SpanId = BClient Send

SpanId = BServer Received

SpanId = BClient Received

SpanId = BServer Send

TraceId = XSpanId = A

TraceId = XSpanId = C

Page 185: Дикие микросервисы на JUG Екатеринбург

yoman

Yo

start.spring.io

Ss

python

Py

lazybones

Lzjava

Ja

spring boot

Sb

gradle

Grasciidoctor

Adthrift

Thdocker

Dr

mesos

Ms

marathon

Machronos

Chaurora

AuArtifactory

Ar

Kubernetes

Kb

eureka

Eu

consul

Cl

etcd

Ed

zookeeper

Zkhystrix

Hx

sleuth

Sl

zipkin

Zn

groovy

Gy

185

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

An

Conway’s Law

Co

Page 186: Дикие микросервисы на JUG Екатеринбург

yoman

Yo

start.spring.io

Ss

python

Py

lazybones

Lzjava

Ja

spring boot

Sb

gradle

Grasciidoctor

Adthrift

Thdocker

Dr

mesos

Ms

marathon

Machronos

Chaurora

AuArtifactory

Ar

Kubernetes

Kb

eureka

Eu

consul

Cl

etcd

Ed

zookeeper

Zkhystrix

Hx

sleuth

Sl

zipkin

Zn

groovy

Gy

186

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

An

Conway’s Law

Co

Page 187: Дикие микросервисы на JUG Екатеринбург

yoman

Yo

start.spring.io

Ss

python

Py

lazybones

Lzjava

Ja

spring boot

Sb

gradle

Grasciidoctor

Adthrift

Thdocker

Dr

mesos

Ms

marathon

Machronos

Chaurora

AuArtifactory

Ar

Kubernetes

Kb

eureka

Eu

consul

Cl

etcd

Ed

zookeeper

Zkhystrix

Hx

sleuth

Sl

zipkin

Zn

groovy

Gy

187

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

An

Conway’s Law

Co

?

Page 188: Дикие микросервисы на JUG Екатеринбург

Выводы

188

● Микросервисы - это просто

Page 189: Дикие микросервисы на JUG Екатеринбург

Выводы

189

● Микросервисы - это просто

● Микросервисы - это сложно

Page 190: Дикие микросервисы на JUG Екатеринбург

1. SOA принципы живы

Придерживайтесь принципов

190

Page 191: Дикие микросервисы на JUG Екатеринбург

1. SOA принципы живы2. Принцип LSD

Придерживайтесь принципов

191

Page 192: Дикие микросервисы на JUG Екатеринбург

1. SOA принципы живы2. Принцип LSD3. Изоляция данных делает жизнь приятнее

Придерживайтесь принципов

192

Page 193: Дикие микросервисы на JUG Екатеринбург

1. SOA принципы живы2. Принцип LSD3. Изоляция данных делает жизнь приятнее4. Парадокс централизации

Придерживайтесь принципов

193

Page 194: Дикие микросервисы на JUG Екатеринбург

1. SOA принципы живы2. Принцип LSD3. Изоляция данных делает жизнь приятнее4. Парадокс централизации5. Планируй ресурсы динамически

Придерживайтесь принципов

194

Page 195: Дикие микросервисы на JUG Екатеринбург

LinksЛекция Жени Кривошеева про архитектуру:https://www.youtube.com/watch?v=_Kex5hwGE-w

Пример Smart-библиотеки: https://github.com/lavcraft/grpc-spring-boot-starter

Пример реализации “умной документации”: https://github.com/aatarasoff/documentation-plugin-demo

195

Page 196: Дикие микросервисы на JUG Екатеринбург

Спасибо! Готовы ответить на ваши вопросы

@tolkv

@aatarasoff

196

@lavcraft

@aatarasoff

Page 197: Дикие микросервисы на JUG Екатеринбург

Типичная микросервисная архитектура

197

Page 198: Дикие микросервисы на JUG Екатеринбург

198

Page 199: Дикие микросервисы на JUG Екатеринбург

А что в этих ваших интернетах?

199

Page 200: Дикие микросервисы на JUG Екатеринбург

Post Scriptum

200

Page 201: Дикие микросервисы на JUG Екатеринбург

Event Sourcing / CQRS / SAGA

http://gotocon.com/dl/goto-chicago-2015/slides/CaitieMcCaffrey_ApplyingTheSagaPattern.pdf

201

Page 202: Дикие микросервисы на JUG Екатеринбург

202

Page 203: Дикие микросервисы на JUG Екатеринбург

203

Page 204: Дикие микросервисы на JUG Екатеринбург

Saga guarantee

● T1 -> T2 -> T3 -> … -> Tn

● T1 -> T2 -> … Tn -> Cn … -> C2 -> C1

204

Page 205: Дикие микросервисы на JUG Екатеринбург

205

Page 206: Дикие микросервисы на JUG Екатеринбург

206

Page 207: Дикие микросервисы на JUG Екатеринбург

207

Page 208: Дикие микросервисы на JUG Екатеринбург

208

Page 209: Дикие микросервисы на JUG Екатеринбург

209

Page 210: Дикие микросервисы на JUG Екатеринбург

210

Page 211: Дикие микросервисы на JUG Екатеринбург

211

Page 212: Дикие микросервисы на JUG Екатеринбург

Слишком сложно

212

Page 213: Дикие микросервисы на JUG Екатеринбург

Универсальный нож против

набора ножей

vs

213

Page 214: Дикие микросервисы на JUG Екатеринбург

Документация + Asciidoctor = ❤1. Все любят AsciiDoctor2. Все могут писать документацию с помощью AsciiDoctor3. Позволяет комбинировать документы4. Внешние документы

214

Page 215: Дикие микросервисы на JUG Екатеринбург

Как это выглядит= Самая главная документация

В этом документе описано как быть самым главным и важным документом в мире разнообразных документов

include::https://raw.github.com/asciidoctor/asciidoctor/master/Gemfile[]

include::../other.adoc[]include::/home/tolkv/git/docs-0/superdoc.adoc[]

215

Page 216: Дикие микросервисы на JUG Екатеринбург

Волшебные инклуды= Самая главная документация

В этом документе описано как быть самым главным и важным документом в мире разнообразных документов

include::https://raw.github.com/asciidoctor/asciidoctor/master/Gemfile[]

include::../other.adoc[]include::/home/tolkv/git/docs-0/superdoc.adoc[]

216

Page 217: Дикие микросервисы на JUG Екатеринбург

А как хотим? Ещё более волшебные= Самая главная документация

В этом документе описано как быть самым главным и важным документом в мире разнообразных документов

include::https://raw.github.com/asciidoctor/asciidoctor/master/Gemfile[]

include::gradle://gradle-advanced:service-with-deps:1.0/deps.adoc[]include::gradle://:service/doc.adoc[]

217

Page 218: Дикие микросервисы на JUG Екатеринбург

Где мы сейчас?1. Немного о том как люди проекты собирали/собирают2. Несколько жизненных примеров3. Микросервисный подход к сборке проекта детка

a. Дизайн того, что мы хотимb. Попробуем наивный императивный подходc. Уменьшим количество боли. Напишем плагин

4. А что там с тестами5. Немного о том как люди проекты будут собирать6. Резюме7. Q&A

218

Page 219: Дикие микросервисы на JUG Екатеринбург

Где мы сейчас?1. Немного о том как люди проекты собирали/собирают2. Несколько жизненных примеров3. Микросервисный подход к сборке проекта детка

a. Дизайн того, что мы хотимb. Попробуем наивный императивный подходc. Уменьшим количество боли. Напишем плагин

4. А что там с тестами5. Немного о том как люди проекты будут собирать6. Резюме7. Q&A

219

Page 220: Дикие микросервисы на JUG Екатеринбург

Кто нам поможет?1. apply plugin: 'java-gradle-plugin'2. 'org.asciidoctor:asciidoctorj:1.5.4'

'org.asciidoctor:asciidoctor-gradle-plugin:1.5.3'

3. org.gradle.api.Plugin

220

Page 221: Дикие микросервисы на JUG Екатеринбург

Payment Service

Blockchain Service

?

221

Page 222: Дикие микросервисы на JUG Екатеринбург

Payment Service

Blockchain Service

Consul

?register

222

Page 223: Дикие микросервисы на JUG Екатеринбург

Payment Service

Blockchain Service

Consul

?

Client Load Balancer poll

223

Page 224: Дикие микросервисы на JUG Екатеринбург

Payment Service

Blockchain Service

Consul

Client Load Balancer

call

224

Page 225: Дикие микросервисы на JUG Екатеринбург

Payment Service

Blockchain Service

Consul

Client Load Balancer

Blockchain Service

register

225

Page 226: Дикие микросервисы на JUG Екатеринбург

Payment Service

Blockchain Service

Consul

Client Load Balancer poll

Blockchain Service

226

Page 227: Дикие микросервисы на JUG Екатеринбург

Payment Service

Blockchain Service

Consul

Client Load Balancer

call

Blockchain Service

227

Page 228: Дикие микросервисы на JUG Екатеринбург

Payment Service

Blockchain Service

Consul

Client Load Balancer

call

Blockchain Service

228

Page 229: Дикие микросервисы на JUG Екатеринбург

Payment Service

Blockchain Service

Consul

Client Load Balancer

call

Blockchain Service

229

Page 230: Дикие микросервисы на JUG Екатеринбург

Payment Service

Blockchain Service

Consul

Client Load Balancer

Blockchain Service

call

230

Page 231: Дикие микросервисы на JUG Екатеринбург

Payment Service

Blockchain Service

Consul

Client Load Balancer

Blockchain Service

231

Page 232: Дикие микросервисы на JUG Екатеринбург

Payment Service

Blockchain Service

Consul

Client Load Balancer

Blockchain Service

deregister

232

Page 233: Дикие микросервисы на JUG Екатеринбург

Payment Service Consul

Client Load Balancer

Blockchain Service

poll

call

233

Page 234: Дикие микросервисы на JUG Екатеринбург

234

Page 235: Дикие микросервисы на JUG Екатеринбург

lazybones

Lz

yoman

Yo

start.spring.io

Ss

python

Py

java

Ja

thrift

Thprotobuf

Pr

spring boot

Sb

gradle

Grasciidoctor

Addocker

Dr

mesos

Ms

marathon

Machronos

Chaurora

Aurestful

Rs

Kubernetes

Kb

eureka

Eu

consul

Cl

etcd

Ed

zookeeper

Zkhystrix

Hx

sleuth

Sl

zipkin

Zn

groovy

Gy

235

Page 236: Дикие микросервисы на JUG Екатеринбург

1. Архитектура функция от множества переменных

2. Всё новое - хорошо забытое старое3. Микросервисы как iPhone4. Микросервисы - новые классы5. Каждой задаче - свой инструмент

Запомните это

236

Page 237: Дикие микросервисы на JUG Екатеринбург

1. SOA принципы живы2. Принцип LSD3. Изоляция данных делает жизнь приятнее4. В сложных ситуациях Event

Sourcing/CQRS/SAGAS5. Парадокс централизации6. Планируй ресурсы динамически

Придерживайтесь принципов

237