Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
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
Lz
java
Ja
spring boot
Sb
gradle
Gr
asciidoctor
Ad
thrift
Th
docker
Dr
mesos
Ms
marathon
Ma
chronos
Ch
aurora
Au
Artifactory
Ar
Kubernetes
Kb
eureka
Eu
consul
Cl
etcd
Ed
zookeeper
Zk
hystrix
Hx
sleuth
Sl
zipkin
Zn
groovy
Gy
28
Data Isolation
Di
Centralization
paradox
Cp
LSD principle
Ls
DDD
Dd
Conway’s Law
Co
Smart Docs
Sd
Dynamic Sharing
Ds
Smart Libs
Sl
SOA
So
ansible
An
yoman
Yo
start.spring.io
Ss
python
Py
lazybones
Lz
java
Ja
spring boot
Sb
gradle
Gr
asciidoctor
Ad
thrift
Th
docker
Dr
mesos
Ms
marathon
Ma
chronos
Ch
aurora
Au
Artifactory
Ar
Kubernetes
Kb
eureka
Eu
consul
Cl
etcd
Ed
zookeeper
Zk
hystrix
Hx
sleuth
Sl
zipkin
Zn
groovy
Gy
29
Data Isolation
Di
Centralization
paradox
Cp
LSD principle
Ls
DDD
Dd
Conway’s Law
Co
Smart Docs
Sd
Dynamic Sharing
Ds
Smart Libs
Sl
SOA
So
ansible
An
yoman
Yo
start.spring.io
Ss
python
Py
lazybones
Lz
java
Ja
spring boot
Sb
gradle
Gr
asciidoctor
Ad
thrift
Th
docker
Dr
mesos
Ms
marathon
Ma
chronos
Ch
aurora
Au
Artifactory
Ar
Kubernetes
Kb
eureka
Eu
consul
Cl
etcd
Ed
zookeeper
Zk
hystrix
Hx
sleuth
Sl
zipkin
Zn
groovy
Gy
30
Data Isolation
Di
Centralization
paradox
Cp
LSD principle
Ls
DDD
Dd
Conway’s Law
Co
Smart Docs
Sd
Dynamic Sharing
Ds
Smart Libs
Sl
SOA
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
Принципы SOA
1. Standardized service contract
2. Loose coupling
3. Encapsulation
4. Reusability
5. Autonomy
6. Statelessness
7. Discoverability
42
Принципы SOA
1. Standardized service contract
2. Loose coupling
3. Encapsulation
4. Reusability
5. Autonomy
6. Statelessness
7. Discoverability
43
Domain-Driven Design
44
5 January 2009
SOA is Dead
http://apsblog.burtongroup.com/2009/01/soa-is-dead-long-live-services.html
45
SOA != SOAP (WS-*)
46
47
DDD
Dd
SOA
So
Conway’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 Boot
D = ∞
59
L = Java
L += Python
L += JavaScript
60
Мы сами нарушаем правила
java
Ja
spring boot
Sb
61
DDD
Dd
SOA
So
LSD principle
Ls
Conway’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-service
Creating 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-service
Creating 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-service
Creating 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
logging
sleuth
Define value for 'dependencies' [logging,sleuth]:
76
~home > lazybones create api 0.0.1 rent-service
Creating 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
logging
sleuth
Define value for 'dependencies' [logging,sleuth]:
Project created for rent-service!
77
78
lazybones
Lz
yeoman
Yo
start.spring.io
Ss
java
Ja
spring boot
Sb
groovy
Gy
79
LSD principle
Ls
DDD
Dd
SOA
So
Conway’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
@ThriftController
public 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 libs
starters
launchers
shared libs
utils
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
Ss
java
Ja
thrift
Th
spring boot
Sb
gradle
Gr
asciidoctor
Ad
groovy
Gy
97
Centralization
paradox
Cp
LSD principle
Ls
DDD
Dd
Smart Docs
Sd
Smart Libs
Sl
SOA
So
Conway’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 << L
110
111
Transport Layer
APIAPI API API API
M сервисов → 1 БД
L сервисов → L БД
M + L = N, M << L
112
lazybones
Lz
yoman
Yo
start.spring.io
Ss
java
Ja
thrift
Th
spring boot
Sb
gradle
Gr
asciidoctor
Ad
groovy
Gy
113
Data Isolation
Di
Centralization
paradox
Cp
LSD principle
Ls
DDD
Dd
Conway`s law
Co
Smart Docs
Sd
Smart Libs
Sl
SOA
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 deployToArtifactory
ansible -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
Lightweight
Containers
131
t
Bare
Metal
Virtual
Machines
Lightweight
Containers
132
Использование группы машин как
одной
WEB
WASTED
CACHE
WASTED WASTED
HADOOP
133
Представьте, что кластер это
просто одна большая машина
WEB
WASTED
CACHE
WASTED WASTED
HADOOP
WASTED
WEB
CACHE
HADOOP FREE FREE
134
lazybones
Lz
yoman
Yo
start.spring.io
Ss
python
Py
java
Ja
spring boot
Sb
gradle
Gr
asciidoctor
Ad
docker
Dr
mesos
Ms
marathon
Ma
chronos
Ch
aurora
Au
Kubernetes
Kb
groovy
Gy
135
Data Isolation
Di
Centralization
paradox
Cp
LSD principle
Ls
DDD
Dd
SAGAS
Sa
Smart Docs
Sd
Dynamic Sharing
Ds
Smart Libs
Sl
SOA
So
ansible
An
thrift
Th
Artifactory
Ar
Найти нужный экземпляр
136
insert into settings_table values (key, endpoint)
137
“Прибитая молотком” конфигурация
update template → services.location
kill -s HUP nginx
138
Остаётся статическая привязка
ресурсов
eureka/consul/etcd/zookeper
139
140
Service Client
Registry-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 request
Router/Proxy
Server side discovery
yoman
Yo
start.spring.io
Ss
python
Py
lazybones
Lz
java
Ja
spring boot
Sb
gradle
Gr
asciidoctor
Ad
thrift
Th
docker
Dr
mesos
Ms
marathon
Ma
chronos
Ch
aurora
Au
Artifactory
Ar
Kubernetes
Kb
eureka
Eu
consul
Cl
etcd
Ed
zookeeper
Zk
groovy
Gy
142
Data Isolation
Di
Centralization
paradox
Cp
LSD principle
Ls
DDD
Dd
SAGAS
Sa
Smart Docs
Sd
Dynamic Sharing
Ds
Smart Libs
Sl
SOA
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
Lz
java
Ja
spring boot
Sb
gradle
Gr
asciidoctor
Ad
thrift
Th
docker
Dr
mesos
Ms
marathon
Ma
chronos
Ch
aurora
Au
Artifactory
Ar
Kubernetes
Kb
eureka
Eu
consul
Cl
etcd
Ed
zookeeper
Zk
hystrix
Hx
groovy
Gy
158
Data Isolation
Di
Centralization
paradox
Cp
LSD principle
Ls
DDD
Dd
Smart Docs
Sd
Dynamic Sharing
Ds
Smart Libs
Sl
SOA
So
ansible
An
Conway’s Law
Co
Следи за своим ПО
159
Нет трассировки - нет проблем? :)
160
X-Request-Id = X-Request-Id ?: new ID
Простой вариант с ServletFilter
161
spring-cloud-sleuth/open zipkin
162
163
RentService
No TraceId
No SpanId
TraceId = X
SpanId = A
164
RentService
PaymentService
No TraceId
No SpanId
TraceId = X
SpanId = A
TraceId = X
SpanId = B
TraceId = X
SpanId = C
165
RentService
PaymentService
BlockchainService
No TraceId
No SpanId
TraceId = X
SpanId = A
TraceId = X
SpanId = B
TraceId = X
SpanId = C
TraceId = X
SpanId = D
TraceId = X
SpanId = D
TraceId = X
SpanId = F
166
RentService
PaymentService
SecurityServiceBlockchainService
No TraceId
No SpanId
TraceId = X
SpanId = A
TraceId = X
SpanId = B
TraceId = X
SpanId = C
TraceId = X
SpanId = D
TraceId = X
SpanId = D
TraceId = X
SpanId = E
TraceId = X
SpanId = E
TraceId = X
SpanId = F
TraceId = X
SpanId = G
167
RentService
PaymentService
SecurityServiceBlockchainService
No TraceId
No SpanId
TraceId = X
SpanId = A
TraceId = X
SpanId = B
TraceId = X
SpanId = B
TraceId = X
SpanId = C
TraceId = X
SpanId = C
TraceId = X
SpanId = D
TraceId = X
SpanId = D
TraceId = X
SpanId = E
TraceId = X
SpanId = E
TraceId = X
SpanId = F
TraceId = X
SpanId = G
168
RentService
PaymentService
SecurityServiceBlockchainService
TraceId = X
SpanId = A
No TraceId
No SpanId
TraceId = X
SpanId = A
TraceId = X
SpanId = A
TraceId = X
SpanId = B
TraceId = X
SpanId = B
TraceId = X
SpanId = C
TraceId = X
SpanId = C
TraceId = X
SpanId = D
TraceId = X
SpanId = D
TraceId = X
SpanId = E
TraceId = X
SpanId = E
TraceId = X
SpanId = F
TraceId = X
SpanId = G
169
170
171
RentService
PaymentService
172
RentService
PaymentService
SpanId = B
Client Send
TraceId = X
SpanId = A
173
RentService
PaymentService
SpanId = B
Client Send
SpanId = B
Server Received
TraceId = X
SpanId = A
TraceId = X
SpanId = C
174
RentService
PaymentService
SpanId = B
Client Send
SpanId = B
Server Received
SpanId = B
Server Send
TraceId = X
SpanId = A
TraceId = X
SpanId = C
175
RentService
PaymentService
SpanId = B
Client Send
SpanId = B
Server Received
SpanId = B
Client Received
SpanId = B
Server Send
TraceId = X
SpanId = A
TraceId = X
SpanId = C
yoman
Yo
start.spring.io
Ss
python
Py
lazybones
Lz
java
Ja
spring boot
Sb
gradle
Gr
asciidoctor
Ad
thrift
Th
docker
Dr
mesos
Ms
marathon
Ma
chronos
Ch
aurora
Au
Artifactory
Ar
Kubernetes
Kb
eureka
Eu
consul
Cl
etcd
Ed
zookeeper
Zk
hystrix
Hx
sleuth
Sl
zipkin
Zn
groovy
Gy
176
Data Isolation
Di
Centralization
paradox
Cp
LSD principle
Ls
DDD
Dd
Smart Docs
Sd
Dynamic Sharing
Ds
Smart Libs
Sl
SOA
So
ansible
An
Conway’s Law
Co
yoman
Yo
start.spring.io
Ss
python
Py
lazybones
Lz
java
Ja
spring boot
Sb
gradle
Gr
asciidoctor
Ad
thrift
Th
docker
Dr
mesos
Ms
marathon
Ma
chronos
Ch
aurora
Au
Artifactory
Ar
Kubernetes
Kb
eureka
Eu
consul
Cl
etcd
Ed
zookeeper
Zk
hystrix
Hx
sleuth
Sl
zipkin
Zn
groovy
Gy
177
Data Isolation
Di
Centralization
paradox
Cp
LSD principle
Ls
DDD
Dd
Smart Docs
Sd
Dynamic Sharing
Ds
Smart Libs
Sl
SOA
So
ansible
An
Conway’s Law
Co
yoman
Yo
start.spring.io
Ss
python
Py
lazybones
Lz
java
Ja
spring boot
Sb
gradle
Gr
asciidoctor
Ad
thrift
Th
docker
Dr
mesos
Ms
marathon
Ma
chronos
Ch
aurora
Au
Artifactory
Ar
Kubernetes
Kb
eureka
Eu
consul
Cl
etcd
Ed
zookeeper
Zk
hystrix
Hx
sleuth
Sl
zipkin
Zn
groovy
Gy
178
Data Isolation
Di
Centralization
paradox
Cp
LSD principle
Ls
DDD
Dd
Smart Docs
Sd
Dynamic Sharing
Ds
Smart Libs
Sl
SOA
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. Принцип LSD
3. Изоляция данных делает жизнь приятнее
Придерживайтесь принципов
185
1. SOA принципы живы
2. Принцип LSD
3. Изоляция данных делает жизнь приятнее
4. Парадокс централизации
Придерживайтесь принципов
186
1. SOA принципы живы
2. Принцип LSD
3. Изоляция данных делает жизнь приятнее
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

More Related Content

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