Дикие микросервисы на jug Екатеринбург
TRANSCRIPT
WILD microSERVICES
18+
@tolkv
@lavcraft
@aatarasoff
@aatarasoff
WILD microSERVICES
18+
DISCLAIMER
No warranty guarantee
5
Agenda
1. Theory
2. Practice
3. Q&A
6
7
● делается с первого раза
● не меняется годами
● не зависит от людей
● не зависит от процессов
8
У всех нас конечно же так
9
У всех нас конечно же так
10
Закон “Почему”
11
“Почему JQuery?”
12
13
14
Точка зрения: архитектор
15
Работа идеального архитектора
16
Работа идеального архитектора
17
Работа идеального архитектора
18
Точка зрения: разработчик
Немного деталей не помешает
19
Немного деталей не помешает
20
Архитектура
21
АрхитектураЧто это?
22
Что же такое архитектура?
23
Что же такое архитектура?
24
Что же такое архитектура?
25
https://www.youtube.com/watch?v=_Kex5hwGE-w
26
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
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
30
Закон Конвея
Big Ball of Mud
31
SOLID
Counter-Strike Cats
32
GOF
SOLID
TDD
Counter-Strike Cats
33
12 April 1996Первое упоминание SOA
https://www.gartner.com/doc/302868/service-oriented-architectures- 34
Принципы SOA1. Standardized service contract
2. Loose coupling
3. Encapsulation
4. Reusability
5. Autonomy
6. Statelessness
7. Discoverability35
Принципы SOA1. Standardized service contract
2. Loose coupling
3. Encapsulation
4. Reusability
5. Autonomy
6. Statelessness
7. Discoverability36
5 January 2009SOA is Dead
http://apsblog.burtongroup.com/2009/01/soa-is-dead-long-live-services.html 37
SOA != SOAP (WS-*)
38
39
Про тренды
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
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
Размер имеет значение?
● Method/Function = Microservice?
● 10-300 LOC = Microservice?
● 1 week = Microservice?
● 1 developer = Microservice?
42
Размер не имеет значения*
● 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
Domain-Driven Design
44
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
Process segregation
46
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
Независимый деплой
build test
48
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
Language/technology segregation
50
Data segregation
51
Team segregation
52
53
DDD
DdSOA
SoConway’s Law
Co
54
55
Java
Python
JS
56
● Spring Boot/Spring Cloud
● Ratpack
● Dropwizard
● Vert.x
● Restlet
● Spark
● KumuluzEE
?
57
● Spring Boot/Spring Cloud
● Ratpack
● Dropwizard
● Vert.x
● Restlet
● Spark
● KumuluzEE
Выбирайте то, что больше нравится
/ в чем есть экспертиза
58
59
Принцип LSD
- L языков программирования- S среднее число фреймворков на язык- D типов источников данных
complexity = L * S * D
60
Немного LSD для вас
- три языка программирования- два в среднем фреймворка на язык- семь типов источников данных
- legacy WS, mongo db- OLTP, OLAP- elasticsearch, neo4j- Мишкина база %)
complexity = 3 * 2 * 7 = 42 (!)61
Чем нельзя пожертвовать?
min (L * S * D) → ?
62
min (L * S * D) → max (D)
63
L = Java 18+S = Spring BootD = ∞
64
L = Java
L += PythonL += JavaScript
65
Нарушать правила можно
java
Ja
spring boot
Sb
66
DDD
DdSOA
SoLSD principle
LsConway’s Law
Co
67
68
t0
git clone <golden_service_repo>
69
70
Код устарел
71
Код устарелНужно переименовать классы
72
Код устарелНужно переименовать классыНужно удалить неиспользуемое
73
Код устарелНужно переименовать классыНужно удалить неиспользуемоеПрочая магия
Время, ошибки, фрагментация
git clone <template_repo>
74
75
Нужно переименовать классыНужно кастомизировать руками
Время
актуализация
lazybones / start.spring.io / yeoman
76
lazybones create api 1.0.1 service_name
77
~home > lazybones create api 0.0.1 rent-service
78
~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
~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
~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
~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
83
lazybones
Lz
yeoman
Yo
start.spring.io
Ssjava
Ja
spring boot
Sbgroovy
Gy
84
LSD principle
LsDDD
DdSOA
SoConway’s Law
Co
DRY off
85
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
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
@ThriftControllerpublic class InsuranceController implements TInsuranceService.Iface { @Override public void someMethod(TInsurance insurance){ //business value here }}
88
@ThriftClient(serviceId = "insurance-service")TInsuranceService.Client client;
...perform(client); //business value here...
89
smart libsstarters
launchers
shared libsutils
helpers
90
91
Старт приложения
Рабочее приложение
@ThriftClient(serviceId = "insurance-service")TInsuranceService.Client client;
TInsuranceService.Client client = Creator.create(TInsuranceService.Client.class,
"insurance-service");
...perform(client); //business value here...
92
93
Fluent annotations
@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
@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
smart libs/shared libs
96
documentation → smart documentation
97
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
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
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
Payment Service[jar,doc] Insurance Service [jar,doc]
One Point of View [UberDoc.zip]
Rent Service[jar,doc] Other Service [jar,doc]
Агрегация информации
101
Парадокс централизацииЧтобы эффективно разрабатывать распределённые
приложения, нам нужны очень хорошие централизованные библиотеки и инструменты
Например: логирование, health-checking, метрики, обработка типовых ошибок, автодокументирование
102
Парадокс централизацииЧтобы эффективно разрабатывать распределённые
приложения, нам нужны очень хорошие централизованные библиотеки и инструменты
Но: не выносите бизнес-логику или доменные объекты!Не размывайте бизнес-контекст вашего API
103
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
Изоляция данных
105
106
Одно приложение - одна БД
Всё просто
N сервисов → 1 БД
Изоляция на уровне таблиц или схем107
N сервисов → 1 БД
Изоляция через хранимые процедуры
108
109
Transport Layer
API API API API API
110
Transport Layer
API API API API API
N сервисов → 1 БД
Распределённый монолит111
N сервисов → N БД
112
N сервисов → N БД
Распределённые транзакции – это больно
113
114
Transport Layer
API API API API API
Очень много кода
N сервисов → N БД
Ваше legacy тянет вас на дно115
116
M сервисов → 1 БД L сервисов → L БД
M + L = N, M << L117
118
Transport Layer
APIAPI API API API
M сервисов → 1 БД L сервисов → L БД
M + L = N, M << L119
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
Доставка
121
war/ear
122
Зависимость от сервера приложений
executable fatJar
123
Зависимость от системных библиотек
124
not war < make Jar
executable fatJar/npm-пакет
125
Разный менеджмент для разных форматов дистрибуции
docker/rkt/packer
126
127
not jar < make docker
scp fat.jar root@prod101:/home/app/
128
scp fat.jar root@prod101:/home/app/
Что делать с консистентостью?Как быть с доступностью?
129
./gradlew deployToArtifactoryansible -i [stage,dev,test] -t deploy
130
./gradlew deployToArtifactoryansible -i [stage,dev,test] -t deploy
“Прибитая молотком” конфигурация131
132
Как быстро масштабироваться?
Нужна оркестрация
133
134
mesos / kubernetes / ∞
135
Как использовать ресурсы
136
137
t
Bare Metal
138
t
Bare Metal
Virtual Machines
139
t
Bare Metal
Virtual Machines
LightweightContainers
140
t
Bare Metal
Virtual Machines
LightweightContainers
141
Использование группы машин как одной
WEB
WASTED
CACHE
WASTED WASTED
HADOOP
142
Представьте, что кластер это просто одна большая машина
WEB
WASTED
CACHE
WASTED WASTED
HADOOP
WASTED
WEBCACHE
HADOOP FREE FREE
143
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
Найти нужный экземпляр
145
insert into settings_table values (key, endpoint)
146
“Прибитая молотком” конфигурация
update template → services.locationkill -s HUP nginx
147
Остаётся статическая привязка ресурсов
eureka/consul/etcd/zookeper
148
149
Service ClientRegistry-aware
HTTP Client
Service Registry
Service Instance 1
Service Instance N
Service Instance ...
Load balance request
Client side discovery
150
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
151
Data Isolation
DiCentralization paradox
CpLSD principle
LsDDD
DdSAGAS
SaSmart Docs
SdDynamic Sharing
DsSmart Libs
SlSOA
So
ansible
An
Защити себя сам
152
153
154
Хочу бегемота!
Rent Service
Payment Service
Security Service Blockchain Service
Insurance Service
5мс
155
Хочу бегемота!
Rent Service
Payment Service
Security Service Blockchain Service
Insurance Service
300мс
156
Хочу бегемота!
Rent Service
Payment Service
Security Service Blockchain Service
Insurance Service
300мс
157
Хочу бегемота!
Rent Service
Payment Service
Security Service Blockchain Service
Insurance Service
300мс
158
Хочу бегемота!
Rent Service
Payment Service
Security Service Blockchain Service
Insurance Service
300мс
159
Circuit Breaker
160
Хочу бегемота!
Rent Service
Payment Service
Security Service Blockchain Service
Insurance Service
300мс
161
Хочу бегемота!
Rent Service
Payment Service
Security Service Blockchain Service
Insurance Service
300мсOpen
162
Хочу бегемота!
Rent Service
Payment Service
Security Service Blockchain Service
Insurance Service
300мсHalf-Open
163
Хочу бегемота!
Rent Service
Payment Service
Security Service Blockchain Service
Insurance Service
5мсHalf-Open
164
Хочу бегемота!
Rent Service
Payment Service
Security Service Blockchain Service
Insurance Service
5мс
hystrix/apache camel/akka
165
166
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
Следи за своим ПО
168
Нет трассировки - нет проблем? :)
169
X-Request-Id = X-Request-Id ?: new ID
Простой вариант с ServletFilter170
spring-cloud-sleuth/open zipkin
171
172
Rent
Ser
vice
No TraceIdNo SpanId
TraceId = XSpanId = A
173
Rent
Ser
vice
Paym
ent
Serv
ice
No TraceIdNo SpanId
TraceId = XSpanId = A
TraceId = XSpanId = B
TraceId = XSpanId = C
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
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
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
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
178
179
180
Rent
Ser
vice
Paym
ent
Serv
ice
181
Rent
Ser
vice
Paym
ent
Serv
ice
SpanId = BClient Send
TraceId = XSpanId = A
182
Rent
Ser
vice
Paym
ent
Serv
ice
SpanId = BClient Send
SpanId = BServer Received
TraceId = XSpanId = A
TraceId = XSpanId = C
183
Rent
Ser
vice
Paym
ent
Serv
ice
SpanId = BClient Send
SpanId = BServer Received
SpanId = BServer Send
TraceId = XSpanId = A
TraceId = XSpanId = C
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
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
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
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
?
Выводы
188
● Микросервисы - это просто
Выводы
189
● Микросервисы - это просто
● Микросервисы - это сложно
1. SOA принципы живы
Придерживайтесь принципов
190
1. SOA принципы живы2. Принцип LSD
Придерживайтесь принципов
191
1. SOA принципы живы2. Принцип LSD3. Изоляция данных делает жизнь приятнее
Придерживайтесь принципов
192
1. SOA принципы живы2. Принцип LSD3. Изоляция данных делает жизнь приятнее4. Парадокс централизации
Придерживайтесь принципов
193
1. SOA принципы живы2. Принцип LSD3. Изоляция данных делает жизнь приятнее4. Парадокс централизации5. Планируй ресурсы динамически
Придерживайтесь принципов
194
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
Спасибо! Готовы ответить на ваши вопросы
@tolkv
@aatarasoff
196
@lavcraft
@aatarasoff
Типичная микросервисная архитектура
197
198
А что в этих ваших интернетах?
199
Post Scriptum
200
Event Sourcing / CQRS / SAGA
http://gotocon.com/dl/goto-chicago-2015/slides/CaitieMcCaffrey_ApplyingTheSagaPattern.pdf
201
202
203
Saga guarantee
● T1 -> T2 -> T3 -> … -> Tn
● T1 -> T2 -> … Tn -> Cn … -> C2 -> C1
204
205
206
207
208
209
210
211
Слишком сложно
212
Универсальный нож против
набора ножей
vs
213
Документация + Asciidoctor = ❤1. Все любят AsciiDoctor2. Все могут писать документацию с помощью AsciiDoctor3. Позволяет комбинировать документы4. Внешние документы
214
Как это выглядит= Самая главная документация
В этом документе описано как быть самым главным и важным документом в мире разнообразных документов
include::https://raw.github.com/asciidoctor/asciidoctor/master/Gemfile[]
include::../other.adoc[]include::/home/tolkv/git/docs-0/superdoc.adoc[]
215
Волшебные инклуды= Самая главная документация
В этом документе описано как быть самым главным и важным документом в мире разнообразных документов
include::https://raw.github.com/asciidoctor/asciidoctor/master/Gemfile[]
include::../other.adoc[]include::/home/tolkv/git/docs-0/superdoc.adoc[]
216
А как хотим? Ещё более волшебные= Самая главная документация
В этом документе описано как быть самым главным и важным документом в мире разнообразных документов
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
Где мы сейчас?1. Немного о том как люди проекты собирали/собирают2. Несколько жизненных примеров3. Микросервисный подход к сборке проекта детка
a. Дизайн того, что мы хотимb. Попробуем наивный императивный подходc. Уменьшим количество боли. Напишем плагин
4. А что там с тестами5. Немного о том как люди проекты будут собирать6. Резюме7. Q&A
218
Где мы сейчас?1. Немного о том как люди проекты собирали/собирают2. Несколько жизненных примеров3. Микросервисный подход к сборке проекта детка
a. Дизайн того, что мы хотимb. Попробуем наивный императивный подходc. Уменьшим количество боли. Напишем плагин
4. А что там с тестами5. Немного о том как люди проекты будут собирать6. Резюме7. Q&A
219
Кто нам поможет?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
Payment Service
Blockchain Service
?
221
Payment Service
Blockchain Service
Consul
?register
222
Payment Service
Blockchain Service
Consul
?
Client Load Balancer poll
223
Payment Service
Blockchain Service
Consul
Client Load Balancer
call
224
Payment Service
Blockchain Service
Consul
Client Load Balancer
Blockchain Service
register
225
Payment Service
Blockchain Service
Consul
Client Load Balancer poll
Blockchain Service
226
Payment Service
Blockchain Service
Consul
Client Load Balancer
call
Blockchain Service
227
Payment Service
Blockchain Service
Consul
Client Load Balancer
call
Blockchain Service
228
Payment Service
Blockchain Service
Consul
Client Load Balancer
call
Blockchain Service
229
Payment Service
Blockchain Service
Consul
Client Load Balancer
Blockchain Service
call
230
Payment Service
Blockchain Service
Consul
Client Load Balancer
Blockchain Service
231
Payment Service
Blockchain Service
Consul
Client Load Balancer
Blockchain Service
deregister
232
Payment Service Consul
Client Load Balancer
Blockchain Service
poll
call
233
234
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
1. Архитектура функция от множества переменных
2. Всё новое - хорошо забытое старое3. Микросервисы как iPhone4. Микросервисы - новые классы5. Каждой задаче - свой инструмент
Запомните это
236
1. SOA принципы живы2. Принцип LSD3. Изоляция данных делает жизнь приятнее4. В сложных ситуациях Event
Sourcing/CQRS/SAGAS5. Парадокс централизации6. Планируй ресурсы динамически
Придерживайтесь принципов
237