189
1 Эволюционный дизайн От любви до ненависти один шаг

Эволюционный дизайн. Joker Students Day 2016

  • Upload
    -

  • View
    342

  • Download
    0

Embed Size (px)

Citation preview

1

Эволюционный дизайнОт любви до ненависти один шаг

@tolkv

2

@lavcraft

3

@aatarasoff

@aatarasoff

DISCLAIMER

No warranty guarantee

4

5

Эволюционный дизайнОт любви до ненависти один шаг

6

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

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

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

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

7

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

Потому что

8

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

Потому что● мы работаем в лучшем банке

9

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

Потому что● мы работаем в лучшем банке● и все остальные банки завидуют нам

10

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

Потому что● мы работаем в лучшем банке● и все остальные банки завидуют нам● …● Стойте, кажется это про другое

11

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

12

“Почему JQuery?”

13

14

15

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

16

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

17

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

18

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

19

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

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

20

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

21

Архитектура

22

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

23

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

24

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

25

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

26

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

27

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

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

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

30

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdConway’s Law

CoSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

An

31

Закон Конвея

Big Ball of Mud

32

Big Ball of Mud

33

34

Проблемы архитектуры

● Сильная связанность между модулями

● Слабое тестовое прикрытие

● Регрессионная спираль смерти○ частично решалась Selenium-тестами

○ но это дорого

SOLID

Counter-Strike Cats

35

GOF

SOLID

TDD

Counter-Strike Cats

36

37

38

39

40

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

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

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

2. Loose coupling

3. Encapsulation

4. Reusability

5. Autonomy

6. Statelessness

7. Discoverability42

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

2. Loose coupling

3. Encapsulation

4. Reusability

5. Autonomy

6. Statelessness

7. Discoverability43

Domain-Driven Design

44

5 January 2009SOA is Dead

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

SOA != SOAP (WS-*)

46

47

DDD

DdSOA

SoConway’s Law

Co

48

Проблема эволюции

● Начинали с одного проекта○ одна команда○ ui + три сервиса

● Более 10-ти однотипных проектов○ несколько команд○ десятки сервисов○ технологически одинаковые

49

50

Java

Python

JS

51

● Spring Boot/Spring Cloud

● Ratpack

● Dropwizard

● Vert.x

● Restlet

● Spark

● KumuluzEE

?

52

● Spring Boot/Spring Cloud

● Ratpack

● Dropwizard

● Vert.x

● Restlet

● Spark

● KumuluzEE

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

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

53

54

Принцип LSD

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

complexity = L * S * D

55

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

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

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

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

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

min (L * S * D) → ?

57

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

58

L = Java 18+S = Spring BootD = ∞

59

L = Java

L += PythonL += JavaScript

60

Мы сами нарушаем правила

java

Ja

spring boot

Sb

61

DDD

DdSOA

SoLSD principle

LsConway’s Law

Co

62

63

t0

git clone <golden_service_repo>

64

65

Код устарел

66

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

67

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

68

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

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

git clone <template_repo>

69

70

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

Время

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

lazybones / start.spring.io / yeoman

71

lazybones create api 1.0.1 service_name

72

~home > lazybones create api 0.0.1 rent-service

73

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

74

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

75

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

srv1 ├──srv2 └──srv3

loggingsleuth

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

76

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

srv1 ├──srv2 └──srv3

loggingsleuth

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

Project created for rent-service!

77

78

lazybones

Lz

yeoman

Yo

start.spring.io

Ssjava

Ja

spring boot

Sbgroovy

Gy

79

LSD principle

LsDDD

DdSOA

SoConway’s Law

Co

DRY off

80

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();

81

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(); 82

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

83

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

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

84

smart libsstarters

launchers

shared libsutils

helpers

85

86

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

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

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

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

"insurance-service");

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

87

@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

88

smart libs/shared libs

89

documentation → smart documentation

90

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...

91

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[]

92

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[]

93

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

One Point of View [UberDoc.zip]

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

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

94

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

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

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

95

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

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

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

96

lazybones

Lz

yoman

Yo

start.spring.io

Ssjava

Ja

thrift

Th

spring boot

Sb

gradle

Grasciidoctor

Ad

groovy

Gy

97

Centralization paradox

CpLSD principle

LsDDD

DdSmart Docs

SdSmart Libs

SlSOA

SoConway’s Law

Co

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

98

99

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

Всё просто

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

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

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

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

101

102

Transport Layer

API API API API API

103

Transport Layer

API API API API API

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

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

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

105

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

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

106

107

Transport Layer

API API API API API

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

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

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

109

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

M + L = N, M << L110

111

Transport Layer

APIAPI API API API

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

M + L = N, M << L112

lazybones

Lz

yoman

Yo

start.spring.io

Ssjava

Ja

thrift

Th

spring boot

Sb

gradle

Grasciidoctor

Ad

groovy

Gy

113

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdConway`s law

CoSmart Docs

SdSmart Libs

SlSOA

So

Доставка

114

war/ear

115

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

executable fatJar

116

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

executable fatJar/npm-пакет

117

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

docker/rkt/packer

118

119

war < fatJar < docker

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

120

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

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

121

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

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

123

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

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

124

125

mesos / kubernetes / ∞

126

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

127

128

t

Bare Metal

129

t

Bare Metal

Virtual Machines

130

t

Bare Metal

Virtual Machines

LightweightContainers

131

t

Bare Metal

Virtual Machines

LightweightContainers

132

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

WEB

WASTED

CACHE

WASTED WASTED

HADOOP

133

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

WEB

WASTED

CACHE

WASTED WASTED

HADOOP

WASTED

WEBCACHE

HADOOP FREE FREE

134

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

135

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdSAGAS

SaSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

Anthrift

ThArtifactory

Ar

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

136

insert into settings_table values (key, endpoint)

137

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

update template → services.locationkill -s HUP nginx

138

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

eureka/consul/etcd/zookeper

139

140

Service ClientRegistry-aware

HTTP Client

Service Registry

Service Instance 1

Service Instance N

Service Instance ...

Load balance request

Client side discovery

141

Service Client

Service Registry

Service Instance 1

Service Instance N

Service Instance ...

Load balance requestRouter/Proxy

Server side discovery

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

142

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdSAGAS

SaSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

An

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

143

144

145

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

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

5мс

146

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

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

300мс

147

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

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

300мс

148

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

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

300мс

149

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

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

300мс

150

Circuit Breaker

151

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

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

300мс

152

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

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

300мсOpen

153

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

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

300мсHalf-Open

154

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

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

5мсHalf-Open

155

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

Rent Service

Payment Service

Security Service Blockchain Service

Insurance Service

5мс

hystrix/apache camel/akka

156

157

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

158

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

An

Conway’s Law

Co

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

159

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

160

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

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

spring-cloud-sleuth/open zipkin

162

163

Rent

Ser

vice

No TraceIdNo SpanId

TraceId = XSpanId = A

164

Rent

Ser

vice

Paym

ent

Serv

ice

No TraceIdNo SpanId

TraceId = XSpanId = A

TraceId = XSpanId = B

TraceId = XSpanId = C

165

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

166

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

167

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

168

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

169

170

171

Rent

Ser

vice

Paym

ent

Serv

ice

172

Rent

Ser

vice

Paym

ent

Serv

ice

SpanId = BClient Send

TraceId = XSpanId = A

173

Rent

Ser

vice

Paym

ent

Serv

ice

SpanId = BClient Send

SpanId = BServer Received

TraceId = XSpanId = A

TraceId = XSpanId = C

174

Rent

Ser

vice

Paym

ent

Serv

ice

SpanId = BClient Send

SpanId = BServer Received

SpanId = BServer Send

TraceId = XSpanId = A

TraceId = XSpanId = C

175

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

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

176

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

An

Conway’s Law

Co

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

177

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

An

Conway’s Law

Co

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

178

Data Isolation

DiCentralization paradox

CpLSD principle

LsDDD

DdSmart Docs

SdDynamic Sharing

DsSmart Libs

SlSOA

So

ansible

An

Conway’s Law

Co

?

Простить, потому что

179

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

Простить, потому что

180

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

2. Архитектура – результат эволюции на протяжении времени

Простить, потому что

181

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

2. Архитектура – результат эволюции на протяжении времени

3. Принципы должны быть “вечны”, а инструменты актуальны и эффективны

Простить, потому что

182

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

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

183

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

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

184

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

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

185

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

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

186

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

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

187

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

188

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

@tolkv

@aatarasoff

189

@lavcraft

@aatarasoff