SlideShare a Scribd company logo
1 of 240
Service Discovery
Больше, чем кажется
2
3
Что будет?
1. Новая реальность – новые
проблемы
2. Что такое Service Discovery и с
чем его едят
3. Как это сделано в Spring Cloud
4
А в чём именно проблема?
5
Database
JavaEE Cluster
Client
6
Так было когда-то
Big App
Static resource
Database
Remote EJB
7
Ресурсы и их типы в прошлом
Как было?
• Количество ресурсов мало
• Хост и порт, как правило,
статичны
• Конфигурация менялась редко
8
insert into resources_table values (key, endpoint)
9
Классическое решение проблемы
10
Ещё одно решение
<providers>
<provider id="provider1"
url="socket://10.0.1.1:8080/?weight="42"/>
<provider id="provider2"
url="socket://10.0.1.2:8080/?weight="100"/>
</providers>
API
API instance
API instance
API instance
11
Путь к микросервисам
Some API
Another API
Instance 1
Another API
Instance 2
Another API
Instance 3
?
12
Кого же вызвать?
Статическая конфигурация
13
<providers>
<provider
id="provider{{ p.number }}"
url="socket://10.0.1.{{ p.number }}:8080/?weight="100"/>
</providers>
После набега
хипстеров
• Контейнеры, docker, облака
14
{
"id": "/hippo/rent-api",
"cpus": 1,
"mem": 1024,
"instances": 42,
"container": {
"docker": {
"image": "docker/hippo-rent-api:1.17.0",
"portMappings": [
{
"containerPort": 8080,
"servicePort": 0
}
]
}
}
}
Динамическая конфигурация (PAAS)
15
{
"id": "/hippo/rent-api",
"cpus": 1,
"mem": 1024,
"instances": 42,
"container": {
"docker": {
"image": "docker/hippo-rent-api:1.17.0",
"portMappings": [
{
"containerPort": 8080,
"servicePort": 0
}
]
}
}
}
Динамическая конфигурация (PAAS)
16
После набега
хипстеров
• Хост и порт, как правило,
заранее неизвестны
• Конфигурация меняется
постоянно, потому что
continuous delivery и прочий
DevOps
17
Service Discovery • Какой инстанс мы можем
вызвать?
18
19
Сервис Фото
Простая задача
Сервис Группы
Связи Группа-
Пользователей
Сервис Пользователи
Сервис Альбомы Группы Обложка для фотоальбома
5 parallel service calls
20
Простая задача
Client
call
S1 S2 S3 S4 S5
21
Client
call
S1 S2 S3 S4 S5
22
p = 0.99*
23
Простая статистика
* 0.99 не имеет отношения к реальности и взята для упрощения
P = p5 = (0.99)5 ≈ 0.95
p – вероятность успеха вызова одного сервиса
24
Получается не очень
Service Discovery
• Какой инстанс мы можем
вызвать?
• Какой инстанс ЛУЧШЕ
подходит для вызова?
25
P = p5 = (0.999)5 ≈ 0.995
p – вероятность успеха вызова одного сервиса
26
Хотим как-то так
Service Discovery
• Какой инстанс мы можем
вызвать?
• Какой инстанс ЛУЧШЕ
подходит для вызова?
• Как мы можем увеличить
вероятность успеха одиночного
вызова?
27
Client
call#1
S1 S2 S3 S4 S5
28
call#2
Speculative retry
Client
call#1
S1 S2 S3 S4 S5
29
call#2
Speculative retry
30
Client
S1 S2 S3 S4 S5
Speculative retry
P = p2 = 1 - (1 - 0.99)2 ≈ 0.9999
Speculative Retry
• Надёжен в эксплуатации
• Все операции должны быть
идемпотентными
• Количество вызовов x2
31
S1 S2 S3 S4 S5
32
STATE
S1 S2 S3 S4 S5
S1 S2 S3 S4 S5
33
STATE
FILTER
S1 S2 S4
S1 S2 S3 S4 S5
S1 S2 S3 S4 S5
34
STATE
FILTER
S2 S4Other DC
S1 S2 S3 S4 S5
S1 S2 S3 S4 S5
35
S1
STATE
FILTER
S2 S4
S1 S2 S3 S4 S5
S1 S2 S3 S4 S5
?
36
S1
Service Service Service Service Service
STATE
FILTER
S2 S4
RULE
S1 S2 S3 S4 S5
S1 S2 S3 S4 S5
37
S1
S4
Service Service Service Service Service
STATE
FILTER
S2 S4
RULE
Client
S1 S2 S3 S4 S5
call
S1 S2 S3 S4 S5
38
S4
Service Service Service Service Service
STATE
FILTER
S2 S4
RULE
Client
S1 S2 S3 S4 S5
call
S1 S2 S3 S4 S5
39
S4
P
S1 S2 S3 S4 S5
?
40
Service Registry
• Database
• Properties File
• Environment variables
41
Service Registry
• Database
• Properties File
• Environment variables
42
Service Registry
• Netflix Eureka
• Consul
• etcd
• Zookeeper
• …
43
Service A
Service Registry
Service B Service C
register
44
Service A Service B Service C
health check
45
Service Registry
Service A Service B Service C
heartbeat
46
Service Registry
Service A Service B Service C
health check
47
Service Registry
Service A Service B Service C
health check
48
Service Registry
Service A Service B Service C
deregister
49
Service Registry
Service A Service B Service C
deregister
graceful shutdown
50
Service Registry
Leader
Master Master
Leader-Election
Quorum (n + 1)/2
Distributed Locks
51
Client/Slave
Leader
Master Master
Client/Slave Client/Slave
horizontal scaling
52
Service Registry
• Netflix Eureka, Consul, etcd,
Zookeeper
• ???
53
{
"id": "/hippo/rent-api",
"cpus": 1,
"mem": 1024,
"instances": 42,
"container": {
"docker": {
"image": "docker/hippo-rent-api:1.17.0",
"portMappings": [
{
"containerPort": 8080,
"servicePort": 0
}
]
}
}
}
Динамическая конфигурация (PAAS)
54
55
Marathon
Marathon
Marathon
Mesos
Master
Mesos
Master
Mesos
Master
Mesos Slave
Mesos Slave
56
Marathon
Marathon
Marathon
Mesos
Master
Mesos
Master
Mesos
Master
Mesos Slave
Mesos Slave
57
curl http://marathon.master/v2/apps/{appId}
58
Получаем данные
59
"tasks": [
{
"appId": "/test-marathon-app",
"host": "mesos-slave.dc2",
"id": "test-marathon-app.43ed8a70-…-0242ac110006",
"ipAddresses": [ {
"ipAddress": "172.17.0.10",
"protocol": "IPv4"
}],
"ports": [11786],
"state": "TASK_RUNNING",
"healthCheckResults": [{"alive": true}]
},
{
...
}
]
60
"tasks": [
{
"appId": "/test-marathon-app",
"host": "mesos-slave.dc2",
"id": "test-marathon-app.43ed8a70-…-0242ac110006",
"ipAddresses": [ {
"ipAddress": "172.17.0.10",
"protocol": "IPv4"
}],
"ports": [11786],
"state": "TASK_RUNNING",
"healthCheckResults": [{"alive": true}]
},
{
...
}
]
61
"tasks": [
{
"appId": "/test-marathon-app",
"host": "mesos-slave.dc2",
"id": "test-marathon-app.43ed8a70-…-0242ac110006",
"ipAddresses": [ {
"ipAddress": "172.17.0.10",
"protocol": "IPv4"
}],
"ports": [11786],
"state": "TASK_RUNNING",
"healthCheckResults": [{"alive": true}]
},
{
...
}
]
62
"tasks": [
{
"appId": "/test-marathon-app",
"host": "mesos-slave.dc2",
"id": "test-marathon-app.43ed8a70-…-0242ac110006",
"ipAddresses": [ {
"ipAddress": "172.17.0.10",
"protocol": "IPv4"
}],
"ports": [11786],
"state": "TASK_RUNNING",
"healthCheckResults": [{"alive": true}]
},
{
...
}
]
“Service Registry”
• Netflix Eureka, Consul, etcd,
Zookeeper
• Kubernetes
• Mesos+Marathon
• DCOS
• Own solution
63
Spring Cloud
• Фреймворк для разработки
распределённых систем
• Реализует основные паттерны
• Имеет коннекторы к
различным третьим решениям
64
Client-Side Service Discovery
65
...
@EnableDiscoveryClient
...
public class Application {
@Autowired
private DiscoveryClient discoveryClient;
public List<String> services() {
return discoveryClient.getServices();
}
}
66
Одна аннотация спасет мир
...
@EnableDiscoveryClient
...
public class Application {
@Autowired
private DiscoveryClient discoveryClient;
public List<String> services() {
return discoveryClient.getServices();
}
}
67
Одна аннотация спасет мир
public interface DiscoveryClient {
String description();
ServiceInstance getLocalServiceInstance();
List<ServiceInstance> getInstances(String serviceId);
List<String> getServices();
}
68
Рекомендуемый интерфейс
69
Рекомендуемый интерфейс
https://www.safaribooksonline.com/library/view/cloud-native-java/9781449374631/ch16.html
Spring Cloud provides the DiscoveryClient abstraction
to make it easy for clients to work with different types
of service registries.
Spring Cloud plugs the DiscoveryClient abstraction
into various parts of the stack, making its use almost
transparent.
The abstraction is simple enough that you
could adapt Spring Cloud to work with another service
registry if you’d like to. Conceptually,
the DiscoveryClient is read-only.
public interface DiscoveryClient {
String description();
@Deprecated
ServiceInstance getLocalServiceInstance();
List<ServiceInstance> getInstances(String serviceId);
List<String> getServices();
}
70
Рекомендуемый интерфейс
public interface DiscoveryClient {
String description();
ServiceInstance getLocalServiceInstance();
List<ServiceInstance> getInstances(String serviceId);
List<String> getServices();
}
71
Рекомендуемый интерфейс
public interface DiscoveryClient {
String description();
ServiceInstance getLocalServiceInstance();
List<ServiceInstance> getInstances(String serviceId);
List<String> getServices();
}
72
Рекомендуемый интерфейс
...
@EnableDiscoveryClient
...
public class Application {
@Autowired
private DiscoveryClient discoveryClient;
public List<String> services() {
return discoveryClient.getServices();
}
}
73
Одна аннотация спасет мир
Spring Cloud Core
Eureka Consul Marathon
74
Боль реализации
• Разные конфигурации
подключения к реестрам
сервисов
• Специфические фичи,
зависящие от выбора реестра
сервисов
75
spring:
cloud:
marathon:
listOfServers: m1:8080,m2:8080,m3:8080
username: marathon
password: mesos
76
Marathon
spring:
cloud:
consul:
host: localhost
port: 8500
77
Но вот в Consul-е иначе
На каждом хосту есть consul-агент
spring:
cloud:
marathon:
listOfServers: m1:8080,m2:8080,m3:8080
username: marathon
password: mesos
78
Marathon. Авторизация#1
spring:
cloud:
marathon:
listOfServers: m1:8080,m2:8080,m3:8080
token: <api_token>
79
Marathon. Авторизация#2
Marathon AppId: /group/path/app
Spring Cloud serviceId: group.path.app
80
Marathon. Маппинг
Marathon AppId: /group/path/app
Spring Cloud serviceId: group.path.app
81
Marathon. Маппинг
Marathon AppId: /group/path/app
Spring Cloud serviceId: group.path.app
82
Невалидный hostname
@Override
public List<ServiceInstance> getInstances(String serviceId) {
return client.getAppTasks(ServiceIdConverter.convertToMarathonId(serviceId))
.getTasks()
.parallelStream()
.filter(task -> null == task.getHealthCheckResults() ||
task.getHealthCheckResults()
.stream()
.allMatch(HealthCheckResult::isAlive)
)
.map(task -> new DefaultServiceInstance(
ServiceIdConverter.convertToServiceId(task.getAppId()),
task.getHost(),
task.getPorts().stream().findFirst().orElse(0),
false
))
.collect(Collectors.toList());
}
83
Marathon. Имплементация
@Override
public List<ServiceInstance> getInstances(String serviceId) {
return client.getAppTasks(ServiceIdConverter.convertToMarathonId(serviceId))
.getTasks()
.parallelStream()
.filter(task -> null == task.getHealthCheckResults() ||
task.getHealthCheckResults()
.stream()
.allMatch(HealthCheckResult::isAlive)
)
.map(task -> new DefaultServiceInstance(
ServiceIdConverter.convertToServiceId(task.getAppId()),
task.getHost(),
task.getPorts().stream().findFirst().orElse(0),
false
))
.collect(Collectors.toList());
}
84
Marathon. Имплементация
@Override
public List<ServiceInstance> getInstances(String serviceId) {
return client.getAppTasks(ServiceIdConverter.convertToMarathonId(serviceId))
.getTasks()
.parallelStream()
.filter(task -> null == task.getHealthCheckResults() ||
task.getHealthCheckResults()
.stream()
.allMatch(HealthCheckResult::isAlive)
)
.map(task -> new DefaultServiceInstance(
ServiceIdConverter.convertToServiceId(task.getAppId()),
task.getHost(),
task.getPorts().stream().findFirst().orElse(0),
false
))
.collect(Collectors.toList());
}
85
Marathon. Имплементация
@Override
public List<ServiceInstance> getInstances(String serviceId) {
return client.getAppTasks(ServiceIdConverter.convertToMarathonId(serviceId))
.getTasks()
.parallelStream()
.filter(task -> null == task.getHealthCheckResults() ||
task.getHealthCheckResults()
.stream()
.allMatch(HealthCheckResult::isAlive)
)
.map(task -> new DefaultServiceInstance(
ServiceIdConverter.convertToServiceId(task.getAppId()),
task.getHost(),
task.getPorts().stream().findFirst().orElse(0),
false
))
.collect(Collectors.toList());
}
86
Marathon. Имплементация
@Override
public List<ServiceInstance> getInstances(String serviceId) {
return client.getAppTasks(ServiceIdConverter.convertToMarathonId(serviceId))
.getTasks()
.parallelStream()
.filter(task -> null == task.getHealthCheckResults() ||
task.getHealthCheckResults()
.stream()
.allMatch(HealthCheckResult::isAlive)
)
.map(task -> new DefaultServiceInstance(
ServiceIdConverter.convertToServiceId(task.getAppId()),
task.getHost(),
task.getPorts().stream().findFirst().orElse(0),
false
))
.collect(Collectors.toList());
}
87
Marathon. Имплементация
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/instances")
public List<ServiceInstance> instances() {
return discoveryClient.getInstances("someservice");
}
88
Marathon. Использование
Вся правда о
DiscoveryClient
• Не используется для
клиентской балансировки
• Участвует в формировании
гиперссылок, в health-check
эндпоинтах и в получении
списка сервисов в реализации
edge-сервера
89
LoadBalancer
• Основан на Netflix Ribbon
• В принципе может быть
использован вне стека Spring
Cloud
• В общем случае не нуждается в
Service Registry
90
Service Service Service Service Service
STATE
FILTER
S2 S4
RULE
S1 S2 S3 S4 S5
S1 S2 S3 S4 S5
91
Client
call S4
Service Service Service Service Service
S2 S4
S1 S2 S3 S4 S5
S1 S2 S3 S4 S5
ServerList
92
Client
call S4
Ribbon ServerList
• Static
• Configuration-based
• Discovery-based
93
test-service: #service name
ribbon: #namespace
listOfServers: host:8080,anotherHost:8081
ConfigurationBasedServerList
94
@Autowired
private LoadBalancerClient loadBalancer;
@RequestMapping("/url")
public String realUrl() throws IOException {
return loadBalancer.reconstructURI(
instance,
new URI("http://"+ serviceId +"/me")
).toString();
}
Будет заменено реальным хостом и портом
95
@Autowired
private LoadBalancerClient loadBalancer;
@RequestMapping("/url")
public String realUrl() throws IOException {
return loadBalancer.reconstructURI(
instance,
new URI("http://"+ serviceId +"/me")
).toString();
}
> curl service:8080/url
http://{host,anotherHost}:8080/me
96
DiscoveryBasedServerList
97
List<MarathonServer> extractServiceInstances(App app) {
return app.getTasks()
.stream()
.map(task -> {
Collection<HealthCheckResult> healthChecks =
null != task.getHealthCheckResults()
? task.getHealthCheckResults()
: new ArrayList<>();
return new MarathonServer(
task.getHost(),
task.getPorts().stream().findFirst().orElse(0),
healthChecks
).withZone(extractZoneFromHostname(task.getHost()));
})
.collect(Collectors.toList());
}
DiscoveryBasedServerList
98
List<MarathonServer> extractServiceInstances(App app) {
return app.getTasks()
.stream()
.map(task -> {
Collection<HealthCheckResult> healthChecks =
null != task.getHealthCheckResults()
? task.getHealthCheckResults()
: new ArrayList<>();
return new MarathonServer(
task.getHost(),
task.getPorts().stream().findFirst().orElse(0),
healthChecks
).withZone(extractZoneFromHostname(task.getHost()));
})
.collect(Collectors.toList());
}
DiscoveryBasedServerList
99
List<MarathonServer> extractServiceInstances(App app) {
return app.getTasks()
.stream()
.map(task -> {
Collection<HealthCheckResult> healthChecks =
null != task.getHealthCheckResults()
? task.getHealthCheckResults()
: new ArrayList<>();
return new MarathonServer(
task.getHost(),
task.getPorts().stream().findFirst().orElse(0),
healthChecks
).withZone(extractZoneFromHostname(task.getHost()));
})
.collect(Collectors.toList());
}
DiscoveryBasedServerList
100
List<MarathonServer> extractServiceInstances(App app) {
return app.getTasks()
.stream()
.map(task -> {
Collection<HealthCheckResult> healthChecks =
null != task.getHealthCheckResults()
? task.getHealthCheckResults()
: new ArrayList<>();
return new MarathonServer(
task.getHost(),
task.getPorts().stream().findFirst().orElse(0),
healthChecks
).withZone(extractZoneFromHostname(task.getHost()));
})
.collect(Collectors.toList());
}
Ribbon Server vs Service Instance
101
Service InstanсeRibbon Server
Разное представление одного и того же
Marathon. Ribbon-фишки
102
customer-service:
ribbon:
<your settings here>
MetaDataFilter:
API_VERSION: '!=V3' # not equal to V3
ENVIRONMENT: '==DEV' # equal to DEV;
CUSTOMER_ENTITY: V1 # equal to V1; default is equals
А жив ли мой
сервис?
• Что значит ”жив”?
• Как проверить живучесть?
103
S1 S2 S3 S4 S5
S2 S4
S1 S2 S3 S4 S5?
104
Server List
Load Balancer Client
S4
t t + 1
S1
S2
S3
105
t t + 1
S1
S2
S3
ServerList
S1
S2
S3
106
t t + 1
S1
S2
S3
ServerList
S1S1
S2
S3
107
t t + 1
S1
S2
S3
ServerList
S1 S1S1
S2
S3
108
t t + 1
S1
S2
S3
ServerList
S1 S1
t + 2
S1
S2
S3
109
S1 S2 S3 S4 S5
S2 S4
S1 S2 S3 S4 S5Ping ->
110
Server List
Load Balancer Client
S4
Pinger
(background thread)
LoadBalancer
background task
force if setServerList() is called
111
Pinger
(background thread)
LoadBalancer
background task
force if setServerList() is called
IPingStrategy
pingServers
112
Pinger
(background thread)
LoadBalancer
background task
force if setServerList() is called
IPingStrategy
pingServers
isAlive(server)
IPing
113
IPingStrategy SerialPingStrategy
int numCandidates = servers.length;
boolean[] results = new boolean[numCandidates];
for (int i = 0; i < numCandidates; i++) {
results[i] = false; /* Default answer is DEAD. */
if (ping != null) {
results[i] = ping.isAlive(servers[i]);
}
}
return results;
114
IPingStrategy SerialPingStrategy
int numCandidates = servers.length;
boolean[] results = new boolean[numCandidates];
for (int i = 0; i < numCandidates; i++) {
results[i] = false; /* Default answer is DEAD. */
if (ping != null) {
results[i] = ping.isAlive(servers[i]);
}
}
return results;
115
IPingStrategy SerialPingStrategy
int numCandidates = servers.length;
boolean[] results = new boolean[numCandidates];
for (int i = 0; i < numCandidates; i++) {
results[i] = false; /* Default answer is DEAD. */
if (ping != null) {
results[i] = ping.isAlive(servers[i]);
}
}
return results;
116
IPingStrategy SerialPingStrategy
int numCandidates = servers.length;
boolean[] results = new boolean[numCandidates];
for (int i = 0; i < numCandidates; i++) {
results[i] = false; /* Default answer is DEAD. */
if (ping != null) {
results[i] = ping.isAlive(servers[i]);
}
}
return results;
117
И что делать, если пинг слишком долгий?
NIWSDiscoveryPing
(Eureka)
IPing
instance.status.equals(
InstanceStatus.UP
)
ConsulPing
(Consul)
MarathonPing
(Marathon)
server.isPassingChecks()
server.isPassingChecks()
Кругом один обман J
118
IPingStrategy ?
Есть честная имплементация, но нет готовых её использований
IPing PingUrl
public boolean isAlive(Server server) {
URL url = constructUrl(server);
HttpResponse response = httpClient.execute(createReq(url));
return response.getStatusLine().getStatusCode() == 200;
}
119
А жив ли мой
сервис?
• Проверять на уровне
приложения дорого
• Доверяем тому, что приходит
из реестра сервисов
120
Отсеять плохое • Фильтры и их применение
121
S1 S2 S3 S4 S5
S2 S4
S1 S2 S3 S4 S5
Server List
Filter Chain ->
122
Load Balancer Client
S4
Cluster (Zone 1)
S1
S2
S3
Cluster (Zone 2)
S4
S5
S6
Client
(Zone 1)
123
Cluster (Zone 1)
S1
S2
S3
Cluster (Zone 2)
S4
S5
S6
Client
(Zone 1)
cheap call
124
Cluster (Zone 1)
S1
S2
S3
Cluster (Zone 2)
S4
S5
S6
Client
(Zone 1)
expensive call
125
Cluster (Zone 1)
S2
S3
Cluster (Zone 2)
S4
S5
S6
Client
(Zone 1)
unpredictable
S1
126
Cluster (Zone 1)
S1
S2
S3
Cluster (Zone 2)
S4
S5
S6
Client
(Zone 1)
more guaranteed result
127
ZoneAffinityFilter
getFilteredServers(servers)
LoadBalancerStats
getZoneSnaphot(servers)
128
DynamicServerListLoadBalancer
S1 S2 S3 S4 S5
S2 S4
S1 S2 S3 S4 S5LB Stats ->
Server List
Filter Chain
129
Load Balancer Client
S4
Server Stats
S1
S2
S3
Zone Snapshot
Server Stats
130
S1
S2
S3
Zone Snapshot
activeConnections
activeServers
circuitBreakerTrippedCount
131
ZoneAffinityFilter
LoadBalancerStats
enableZoneAffinity?
zoneAffinity:
maxLoadPerServer: 0.6
maxBlackOutServersPercentage: 0.8
minAvailableServers: 2
132
ZoneAffinityFilter
ZoneAffinityPredicate
исключаем инстансы
из других зон
133
zoneAffinity:
maxLoadPerServer: 0.6
maxBlackOutServersPercentage: 0.8
minAvailableServers: 2
Cluster (Zone 1)
S1
S2
S3
Cluster (Zone 2)
S4
S5
S6
Client
(Zone 1)
cheap call
134
ZoneAffinityFilter
ZoneAffinityPredicate
не фильтруем
135
zoneAffinity:
maxLoadPerServer: 0.6
maxBlackOutServersPercentage: 0.8
minAvailableServers: 2
Cluster (Zone 1)
S1
Cluster (Zone 2)
S4
S5
S6
Client
(Zone 1)
136
S2
S3
ZonePreferenceFilter
List servers = super.getFilteredServers();
List local = servers.filter(server ->
server.zone == zoneFromConfig
);
if (!local.isEmpty()) {
return local;
}
return servers;
super.getFilteredServers()
DynamicServerListLoadBalancer
137
default (local) zone
ZoneAffinityFilter
ZonePreferenceFilter
List servers = super.getFilteredServers();
List local = servers.filter(server ->
server.zone == zoneFromConfig
);
if (!local.isEmpty()) {
return local;
}
return servers;
super.getFilteredServers()
DynamicServerListLoadBalancer
138
ZoneAffinityFilter
Цепочка
фильтров
• Помогает увеличить шансы на
корректное исполнение
запроса
• Отсеивает «плохие» и «дорогие»
инстансы
139
Правило выбора • Последняя миля
140
S1 S2 S3 S4 S5
S2 S4
S1 S2 S3 S4 S5
?
141
Server List
Filter Chain
Rule
Load Balancer Client
S4
IRule
RoundRobin
ZoneAvoidance
default
Weighted Random
BestAvailability AvailabilityFilter
142
IRule
RoundRobin
ZoneAvoidance
Weighted Random
BestAvailability AvailabilityFiltering
143
upstream test-marathon-app {
server host1 weight=3;
server host2 weight=1;
server host3 weight=1;
}
Как правило вес предопределен
144
Типичный конфиг с весами
Weight Task
(background thread)
Weighted Rule
background task
LoadBalancerStats
calculate
serverWeight = summ(avgServerResponseTime)- avgServerResponseTime
145
Weight Task
(background thread)
Weighted Rule
background task
LoadBalancerStats
calculate
serverWeight = summ(avgServerResponseTime)- avgServerResponseTime
146
Больше время ответа – меньше вес
147
Slow Instance Fast Instance
100 ms 10 ms
148
Slow Instance Fast Instance
100 ms 10 ms5 000 requests
149
Slow Instance Fast Instance
100 ms 10 ms5 000 requests
Round Robin Rule
Slow: 2500 and Fast: 2500
Average time: 70
150
Slow Instance Fast Instance
100 ms 10 ms5 000 requests
Round Robin Rule
Slow: 2500 and Fast: 2500
Average time: 70
151
Slow Instance Fast Instance
100 ms 10 ms5 000 requests
Round Robin Rule
Slow: 2500 and Fast: 2500
Average time: 70
Weighted Rule
Slow: 634 and Fast: 4366
Average time: 27
152
Slow Instance Fast Instance
100 ms 10 ms1 000 requests
Round Robin Rule
Slow: 500 and Fast: 500
Average time: 70
Weighted Rule
?
?
153
Slow Instance Fast Instance
100 ms 10 ms1 000 requests
Round Robin Rule
Slow: 500 and Fast: 500
Average time: 70
Weighted Rule
Slow: 500 and Fast: 500
Average time: 72
154
Slow Instance Fast Instance
100 ms 10 ms1 000 requests
Round Robin Rule
Slow: 500 and Fast: 500
Average time: 70
Weighted Rule
Slow: 500 and Fast: 500
Average time: 72
test-service: #service name
ribbon: #namespace
ServerWeightTaskTimerInterval: 30000 #ms
Давайте разбираться
155
test-service: #service name
ribbon: #namespace
ServerWeightTaskTimerInterval: 30000 #ms
Weights [0.0, 0.0]
Давайте разбираться
156
test-service: #service name
ribbon: #namespace
ServerWeightTaskTimerInterval: 1000 #ms
Давайте разбираться
157
test-service: #service name
ribbon: #namespace
ServerWeightTaskTimerInterval: 1000 #ms
Weights [12.285123016785462, 120.30885719400065]
Давайте разбираться
158
IRule
RoundRobin
ZoneAvoidance
Weighted Random
BestAvailability AvailabilityFiltering
159
Best Available Rule LoadBalancerStats
calculate
chosen -> activeConnections == min(activeConnections)
160
Best Available Rule LoadBalancerStats
calculate
chosen -> activeConnections == min(activeConnections)
161
Меньше активных соединений -> больше шансов на успех
162
Slow Instance Fast Instance
100 ms 10 ms1 000 requests
Round Robin Rule
Slow: 500 and Fast: 500
Average time: 70
Weighted Rule
Slow: 500 and Fast: 500
Average time: 72
Best Available Rule
Slow: 152 and Fast: 847
Average time: 38
IRule
RoundRobin
ZoneAvoidance
Weighted Random
BestAvailability AvailabilityFiltering
163
Availability Filtering
Rule
LoadBalancerStats
calculate
filtered -> activeConnections < maxActiveConnections
filtered -> !isCircuitBreakerTripped
Availability Predicate
filter
164
Почти как round-robin
IRule
RoundRobin
ZoneAvoidance
Weighted Random
BestAvailability AvailabilityFiltering
165
Zone Avoidance Rule Composite Predicate
filter
Zone Predicate Availability Predicate
166
Zone Avoidance Rule Composite Predicate
filter
Zone Predicate Availability Predicate
CompositePredicateBuilder
int minimalFilteredServers = 1
float minimalFilteredPercentage = 0
predicate.filter(servers)
167
Zone Avoidance Rule Composite Predicate
filter
Zone Predicate Availability Predicate
CompositePredicateBuilder
int minimalFilteredServers = 1
float minimalFilteredPercentage = 0
int count = predicate.filter(servers).size() //2
168
Zone Avoidance Rule Composite Predicate
filter
Zone Predicate Availability Predicate
CompositePredicateBuilder
int minimalFilteredServers = 1
float minimalFilteredPercentage = 0
int count = predicate.filter(servers).size() //2
count >= minimalFilteredServers
count >= minimalFilteredPercentage * count
169
Zone Avoidance Rule Composite Predicate
filter
Zone Predicate Availability Predicate
CompositePredicateBuilder
int minimalFilteredServers = 1
float minimalFilteredPercentage = 0
int count = predicate.filter(servers).size() //0
count >= minimalFilteredServers
count >= minimalFilteredPercentage * count
170
Zone Avoidance Rule Composite Predicate
filter
Zone Predicate Availability Predicate
next
171
triggeringLoadPerServerThreshold: 0.2
avoidZoneWithBlackoutPercetage: 0.99999d
worstZone -> loadPerServer == max(loadPerServer) &&
loadPerServer > triggeringLoadPerServerThreshold
zones.remove(worstZone)
Zone Avoidance Rule Composite Predicate
filter
Zone Predicate Availability Predicate
172
triggeringLoadPerServerThreshold: 0.2
avoidZoneWithBlackoutPercetage: 0.99999d
zoneToAvoid -> circuitBreakerTrippedCount / instanceCount >=
avoidZoneWithBlackoutPercetage
zones.remove(zoneToAvoid)
Zone Avoidance Rule Composite Predicate
filter
Zone Predicate Availability Predicate
173
Правила
• Ещё больше увеличивают
шансы найти «хороший»
инстанс
• По-умолчанию «хитрые»
правила не используются
174
Default Rule • Почему не BestAvailability?
175
Best Availability
• Не всегда предсказуем
• Использовать с осторожностью
176
Service Service Service Service Service
S2 S4
S2
LoadBalancerClient
S1 S2 S3 S4 S5
S1 S2 S3 S4 S5
New Service
register/deregister
177
Шаблоны
регистрации
• 3d-party
• Self-registration
178
Docker Engine
179
3d-party registration pattern
Docker Engine
Service
register/deregister
180
3d-party registration pattern
Docker Engine
Service
register/deregister
181
Registrator
emit event
3d-party registration pattern
Docker Engine
Service
register/deregister
182
Registrator
emit event
Service Registry
native event
3d-party registration pattern
Service Definition
183
deploy manifest
PaaS
Нативная регистрация (PaaS)
Service Definition
184
deploy manifest
PaaS
Нативная регистрация (PaaS)
S1 S2 S3 S4 S5
run services
Self-Registration
• Реализация (как всегда)
зависит от выбранного реестра
сервисов
• Не нужна для PaaS-решений
185
AutoServiceRegistration
LifecycleProcessor
autoStartup on refresh
startBeans on start
Service Registry
register
186
LifecycleProcessor
on RefreshScope event
stopBeans on stop
Service Registry
deregister
187
AutoServiceRegistration
Контейнеры • Docker etc.
188
Docker container
Internal IP External IP
189
?
> ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280stf0: flags=0<> mtu 1280
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
en1: flags=963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX> mtu 1500
en2: flags=963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX> mtu 1500
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304
awdl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1484
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
190
> ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280stf0: flags=0<> mtu 1280
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
en1: flags=963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX> mtu 1500
en2: flags=963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX> mtu 1500
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304
awdl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1484
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
Low index
191
spring:
cloud:
discovery:
lifecycle:
enabled: false
192
External Registrator
spring:
cloud:
inetutils:
ignored-interfaces:
- vbox*
- bridge*
- lo*
193
spring:
cloud:
inetutils:
ignored-interfaces:
- vbox*
- bridge*
- lo*
194
spring:
cloud:
inetutils:
preferred-interfaces:
- eth0
195
spring:
cloud:
discovery:
preferIpAddress: true (false)
196
Шаблоны
регистрации
• Выбирайте внешнюю
регистрацию сервисов, если
она идёт из коробки
• Саморегистрация имеет
подводные камни, на которые
можно натолкнуться
197
Выводы#1
• Облака, контейнеры,
динамическая привязка
ресурсов приводят к
необходимости решения
задачи обнаружения сервисов
• Но основная цель – это
предсказуемая и стабильная
работа всей системы в целом
198
Выводы#2
• В Spring Cloud-е много готовых
решений, но их использование
будет отличаться в
зависимости от выбранного
реестра сервисов
199
Выводы#3
• От нас многое прячут в недрах
конфигурации, и если
покопаться, то можно найти
интересные возможности
• Изучение базовых решений
(Netflix Ribbon. и т.д.) даст
возможность эффективнее
решать задачи
200
Выводы#4
• Выбирайте внешнюю
регистрацию сервисов, если
она идёт из коробки
• Саморегистрация имеет
подводные камни, на которые
можно натолкнуться
201
Ссылки
202
Spring Cloud (Service Registry)
https://github.com/spring-cloud/spring-cloud-netflix
https://github.com/spring-cloud/spring-cloud-consul
Spring Cloud (Paas)
https://github.com/aatarasoff/spring-cloud-marathon
https://github.com/fabric8io/spring-cloud-kubernetes
Почитать
203
Spring Cloud Marathon
http://developerblog.info/2017/04/19/marathon-spring-cloud-part1/
http://developerblog.info/2017/04/24/marathon-spring-cloud-part2/
204
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems
Service Discovery. More that it seems

More Related Content

What's hot

Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Oleksii Okhrymenko
 
Continuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons LearnedContinuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons LearnedAleksandr Tarasov
 
Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»DevDay
 
Трудовые будни инженера производительности
Трудовые будни инженера производительностиТрудовые будни инженера производительности
Трудовые будни инженера производительностиVladimir Sitnikov
 
Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)
Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)
Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)Ontico
 
«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​FDConf
 
SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)
SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)
SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)Ontico
 
Проблемы производительности open source библиотек
Проблемы производительности open source библиотекПроблемы производительности open source библиотек
Проблемы производительности open source библиотекVladimir Sitnikov
 
Использование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияИспользование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияSQALab
 
Методы защиты Java-приложений и их обход
Методы защиты Java-приложений и их обходМетоды защиты Java-приложений и их обход
Методы защиты Java-приложений и их обходPositive Hack Days
 
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Ontico
 
Киллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitКиллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitByndyusoft
 
Реактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияРеактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияMatvey Malkov
 
Подводные камни в нагрузочном тестировании
Подводные камни в нагрузочном тестированииПодводные камни в нагрузочном тестировании
Подводные камни в нагрузочном тестированииVladimir Sitnikov
 
Практика использования Dependency Injection
Практика использования Dependency InjectionПрактика использования Dependency Injection
Практика использования Dependency InjectionPlatonov Sergey
 
Implement your own profiler with blackjack and fun
Implement your own profiler with blackjack and funImplement your own profiler with blackjack and fun
Implement your own profiler with blackjack and funVladimir Sitnikov
 
Docker Containers orchestrators: Kubernetes vs. Swarm
Docker Containers orchestrators: Kubernetes vs. SwarmDocker Containers orchestrators: Kubernetes vs. Swarm
Docker Containers orchestrators: Kubernetes vs. SwarmDmitry Lazarenko
 
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...Ontico
 

What's hot (20)

Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Continuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons LearnedContinuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons Learned
 
Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»
 
Трудовые будни инженера производительности
Трудовые будни инженера производительностиТрудовые будни инженера производительности
Трудовые будни инженера производительности
 
Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)
Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)
Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)
 
«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​
 
SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)
SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)
SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)
 
Проблемы производительности open source библиотек
Проблемы производительности open source библиотекПроблемы производительности open source библиотек
Проблемы производительности open source библиотек
 
Spring Boot Ripper
Spring Boot RipperSpring Boot Ripper
Spring Boot Ripper
 
Использование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияИспользование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестирования
 
Методы защиты Java-приложений и их обход
Методы защиты Java-приложений и их обходМетоды защиты Java-приложений и их обход
Методы защиты Java-приложений и их обход
 
Release management with Gradle #JokerConf2016
Release management with Gradle #JokerConf2016Release management with Gradle #JokerConf2016
Release management with Gradle #JokerConf2016
 
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
 
Киллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitКиллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/await
 
Реактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияРеактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложения
 
Подводные камни в нагрузочном тестировании
Подводные камни в нагрузочном тестированииПодводные камни в нагрузочном тестировании
Подводные камни в нагрузочном тестировании
 
Практика использования Dependency Injection
Практика использования Dependency InjectionПрактика использования Dependency Injection
Практика использования Dependency Injection
 
Implement your own profiler with blackjack and fun
Implement your own profiler with blackjack and funImplement your own profiler with blackjack and fun
Implement your own profiler with blackjack and fun
 
Docker Containers orchestrators: Kubernetes vs. Swarm
Docker Containers orchestrators: Kubernetes vs. SwarmDocker Containers orchestrators: Kubernetes vs. Swarm
Docker Containers orchestrators: Kubernetes vs. Swarm
 
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
 

Similar to Service Discovery. More that it seems

Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)Ontico
 
Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?Vadim Madison
 
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow Vadim Nesterov
 
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014InterSystems
 
Программируемость и автоматизация решений Ciscо - практическое применение
Программируемость и автоматизация решений Ciscо - практическое применениеПрограммируемость и автоматизация решений Ciscо - практическое применение
Программируемость и автоматизация решений Ciscо - практическое применениеCisco Russia
 
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)Ontico
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...Ontico
 
Программные интерфейсы управления (API) архитектурой, ориентированной на прил...
Программные интерфейсы управления (API) архитектурой, ориентированной на прил...Программные интерфейсы управления (API) архитектурой, ориентированной на прил...
Программные интерфейсы управления (API) архитектурой, ориентированной на прил...Cisco Russia
 
Денис Иванов
Денис ИвановДенис Иванов
Денис ИвановCodeFest
 
GRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network InitiativeGRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network InitiativeARCCN
 
Building deployment pipeline - DevOps way
Building deployment pipeline - DevOps wayBuilding deployment pipeline - DevOps way
Building deployment pipeline - DevOps wayAndrey Rebrov
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»e-Legion
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011CodeCamp
 
Как превратить приложение в платформу
Как превратить приложение в платформуКак превратить приложение в платформу
Как превратить приложение в платформуVadim Kruchkov
 
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетикеАлександр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетикеKaspersky
 
Мы делили апельсин
Мы делили апельсинМы делили апельсин
Мы делили апельсинOlga Lavrentieva
 
A popular DNS security overview
A popular DNS security overviewA popular DNS security overview
A popular DNS security overviewPhilipp Kulin
 
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...it-people
 
RAD на Java: как устроена CUBA Platform?
RAD на Java: как устроена  CUBA Platform?RAD на Java: как устроена  CUBA Platform?
RAD на Java: как устроена CUBA Platform?Aleksey Stukalov
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETDev2Dev
 

Similar to Service Discovery. More that it seems (20)

Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
 
Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?
 
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
 
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
 
Программируемость и автоматизация решений Ciscо - практическое применение
Программируемость и автоматизация решений Ciscо - практическое применениеПрограммируемость и автоматизация решений Ciscо - практическое применение
Программируемость и автоматизация решений Ciscо - практическое применение
 
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
 
Программные интерфейсы управления (API) архитектурой, ориентированной на прил...
Программные интерфейсы управления (API) архитектурой, ориентированной на прил...Программные интерфейсы управления (API) архитектурой, ориентированной на прил...
Программные интерфейсы управления (API) архитектурой, ориентированной на прил...
 
Денис Иванов
Денис ИвановДенис Иванов
Денис Иванов
 
GRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network InitiativeGRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network Initiative
 
Building deployment pipeline - DevOps way
Building deployment pipeline - DevOps wayBuilding deployment pipeline - DevOps way
Building deployment pipeline - DevOps way
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011
 
Как превратить приложение в платформу
Как превратить приложение в платформуКак превратить приложение в платформу
Как превратить приложение в платформу
 
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетикеАлександр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
 
Мы делили апельсин
Мы делили апельсинМы делили апельсин
Мы делили апельсин
 
A popular DNS security overview
A popular DNS security overviewA popular DNS security overview
A popular DNS security overview
 
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
 
RAD на Java: как устроена CUBA Platform?
RAD на Java: как устроена  CUBA Platform?RAD на Java: как устроена  CUBA Platform?
RAD на Java: как устроена CUBA Platform?
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
 

More from Aleksandr Tarasov

Cocktail of Environments. How to Mix Test and Development Environments and St...
Cocktail of Environments. How to Mix Test and Development Environments and St...Cocktail of Environments. How to Mix Test and Development Environments and St...
Cocktail of Environments. How to Mix Test and Development Environments and St...Aleksandr Tarasov
 
Service Discovery. Spring Cloud Internals
Service Discovery. Spring Cloud InternalsService Discovery. Spring Cloud Internals
Service Discovery. Spring Cloud InternalsAleksandr Tarasov
 
WILD microSERVICES v2 (JEEConf Edition)
WILD microSERVICES v2 (JEEConf Edition)WILD microSERVICES v2 (JEEConf Edition)
WILD microSERVICES v2 (JEEConf Edition)Aleksandr Tarasov
 
Расширь границы возможного вместе с Gradle
Расширь границы возможного вместе с GradleРасширь границы возможного вместе с Gradle
Расширь границы возможного вместе с GradleAleksandr Tarasov
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterAleksandr Tarasov
 
Хипстеры в энтерпрайзе
Хипстеры в энтерпрайзеХипстеры в энтерпрайзе
Хипстеры в энтерпрайзеAleksandr Tarasov
 
микроСЕРВИСЫ: огонь, вода и медные трубы
микроСЕРВИСЫ: огонь, вода и медные трубымикроСЕРВИСЫ: огонь, вода и медные трубы
микроСЕРВИСЫ: огонь, вода и медные трубыAleksandr Tarasov
 
Joker 2015. WILD microSERVICES
Joker 2015. WILD microSERVICESJoker 2015. WILD microSERVICES
Joker 2015. WILD microSERVICESAleksandr Tarasov
 

More from Aleksandr Tarasov (12)

Cocktail of Environments. How to Mix Test and Development Environments and St...
Cocktail of Environments. How to Mix Test and Development Environments and St...Cocktail of Environments. How to Mix Test and Development Environments and St...
Cocktail of Environments. How to Mix Test and Development Environments and St...
 
Everything as a code
Everything as a codeEverything as a code
Everything as a code
 
Service Discovery. Spring Cloud Internals
Service Discovery. Spring Cloud InternalsService Discovery. Spring Cloud Internals
Service Discovery. Spring Cloud Internals
 
WILD microSERVICES v2 (JEEConf Edition)
WILD microSERVICES v2 (JEEConf Edition)WILD microSERVICES v2 (JEEConf Edition)
WILD microSERVICES v2 (JEEConf Edition)
 
WILD microSERVICES v2
WILD microSERVICES v2WILD microSERVICES v2
WILD microSERVICES v2
 
Расширь границы возможного вместе с Gradle
Расширь границы возможного вместе с GradleРасширь границы возможного вместе с Gradle
Расширь границы возможного вместе с Gradle
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot Starter
 
Хипстеры в энтерпрайзе
Хипстеры в энтерпрайзеХипстеры в энтерпрайзе
Хипстеры в энтерпрайзе
 
микроСЕРВИСЫ: огонь, вода и медные трубы
микроСЕРВИСЫ: огонь, вода и медные трубымикроСЕРВИСЫ: огонь, вода и медные трубы
микроСЕРВИСЫ: огонь, вода и медные трубы
 
Joker 2015. WILD microSERVICES
Joker 2015. WILD microSERVICESJoker 2015. WILD microSERVICES
Joker 2015. WILD microSERVICES
 
Docker In the Bank
Docker In the BankDocker In the Bank
Docker In the Bank
 
Docker In Bank Unrated
Docker In Bank UnratedDocker In Bank Unrated
Docker In Bank Unrated
 

Service Discovery. More that it seems

Editor's Notes

  1. We fully changed technology stack for building this pilot small applications and discovered that they are not homogeneous. It contains UI-part, API, Database. We split our JSF frontend applications to NodeJS for client side and templating and Spring Boot for API. So, now we have several APIs that have small boundaries and business contexts that let the APIs do a small number of things, but do them well for your business tasks. For example, API for customer profile.