SlideShare a Scribd company logo
Spring Cloud Internals
Service Discovery
About me
Architect @
/aatarasoff
/aatarasoff
habrahabr.ru/aatarasoff
developerblog.info
2
Agenda
Today
1. New reality - new problems
2. What service discovery means?
3. Dive into Spring Cloud service
discovery pattern implementation
4. Tips and tricks during the session
5. Own experience as a conclusion
3
What is the problem?
4
Database
ESB (service layer)
Service Service Service Service
Hardware Load Balancer
Alfa-Click 2.0
(JSF/Weblogic)
5
Big App
Static resource
Database
Remote EJB
6
Simple
Binding
Small number of resources
Static host and port binding
Rare reconfiguration
7
insert into resources_table values (key, endpoint)
8
final Properties props = new Properties();
final Context context = new InitialContext(props);
// lookup
Foo bean = context.lookup("ejb:myejb//Foo!org.myapp.Foo");
bean.call();
9
final Properties props = new Properties();
final Context context = new InitialContext(props);
// lookup
Foo bean = context.lookup("ejb:myejb//Foo!org.myapp.Foo");
//do something
bean.call();
10
Big Frontend App
11
Big Frontend App
Small App
Small App
Small App
12
Small App
UI
API 1
API 2
13
ESB Services
API 1
API 2
API 4
UIMobile
Mongo DB
14
API
API instance
API instance
API instance
15
Some API
Another API
Instance 1
Another API
Instance 2
Another API
Instance 3
?
16
- hosts: dc1-rest-api
roles:
- { role: api, name: transactions-api, service_port: 9081 }
- { role: api, name: cards-api, port: 8081 }
- { role: api, name: customers-api, port: 9091 }
dc1-rest-api
<ip_address_1>
<ip_address_2>
...
Static Configuration
17
{
"id": "/retail-online-bank/middle/transactions-api",
"cpus": 1,
"mem": 1024,
"instances": 5,
"container": {
"docker": {
"image": "docker/retail-online-bank-transactions-api:1.17.0",
"portMappings": [
{
"containerPort": 8080,
"servicePort": 0
}
]
}
}
}
Dynamic Configuration (PAAS)
18
Service
Discovery
What instance we can call?
19
20
Remote API Calls
21
Five parallel service calls
22
S1 S2 S3 S4 S5
23
Client
call
S1 S2 S3 S4 S5
24
Client
call
S1 S2 S3 S4 S5
25
Five parallel service calls
26
p = 0.99
p – the probability of success for one service
27
P = p5 = (0.99)5 ≈ 0.95
p – the probability of success for one service
28
Service
Discovery
What instance we can call?
What instance is better for call?
29
Service
Discovery
What instance we can call?
What instance is better for call?
How we can increase probability of
success for one call?
30
S1 S2 S3 S4 S5
31
STATE
S1 S2 S3 S4 S5
S1 S2 S3 S4 S5
32
STATE
FILTER
S1 S2 S3
S1 S2 S3 S4 S5
S1 S2 S3 S4 S5
33
STATE
FILTER
S2 S4
Other DC
S1 S2 S3 S4 S5
S1 S2 S3 S4 S5
34
STATE
FILTER
S2 S4
Other DC
S1 S2 S3 S4 S5
S1 S2 S3 S4 S5
?
35
Service Service Service Service Service
STATE
FILTER
S2 S4
RULE
S2
S1 S2 S3 S4 S5
S1 S2 S3 S4 S5
36
Service Service Service Service Service
STATE
FILTER
S2 S4
RULE
S2
Client
S1 S2 S3 S4 S5
call
S1 S2 S3 S4 S5
37
Client-Side Service Discovery
38
Server-Side Service Discovery
39
Server-Side Client-Side
VS
Dummy client
Language/Library tolerance
Single Responsibility Principle
More complex and smart
decision implementation
Avoid point of failure
Flexibility
Hard to implement something
complex and smart
One more point of failure
Very good implementation is
required
Lock on libraries
Hard to make changes
40
Spring
Cloud
Tools for building common patterns
in distributed systems
Part of Spring Boot
Implements Client-Side Service
Discovery Pattern
41
Rollback
42
S1 S2 S3 S4 S5
?
How we get them all?
43
Service
Registry?
Database
Properties File
Environment Variables
44
Service
Registry?
Database
Properties File
Environment Variables
45
Service
Registry
Netflix Eureka
Consul
etcd
Zookeeper
…
46
Leader
Master Master
Leader-Election
Quorum (n + 1)/2
Distributed Locks
47
Peer
Peer Peer
Eureka is not the same
48
Client/Slave
Leader
Master Master
Client/Slave Client/Slave
horizontal scaling
49
Service A
Leader
Master Master
Service B Service C
register
50
Service A
Leader
Master Master
Service B Service C
health check
51
Service A
Leader
Master Master
Service B Service C
heartbeat
52
Service A
Leader
Master Master
Service B Service C
health check
53
Service A
Leader
Master Master
Service B Service C
health check
54
Service A
Leader
Master Master
Service B Service C
deregister
55
Service A
Leader
Master Master
Service B Service C
deregister
graceful shutdown
56
Spring Cloud Core
Eureka Consul Marathon
57
Spring Cloud Core
Eureka Consul Marathon
Reference/Native implementation
Most complex load balancing
58
Spring Cloud Core
Eureka Consul Marathon
Out of the box PaaS
59
60
61
{
"host": "server1",
"ports": [
20688
],
"ipAddresses": [
{
"ipAddress": "172.17.0.21",
"protocol": "IPv4"
}
],
"appId": "/retail-online-bank/middle/a2a-transactions-api",
"healthCheckResults": [
{
"alive": true
}
]
}
Spring Cloud Core
Eureka Consul Marathon
Out of the box PaaS
One tool for deployment and
configuration storage
Own library
62
Deep
Dive
1. Discovery
63
...
@EnableDiscoveryClient
...
public class Application {
@Autowired
private DiscoveryClient discoveryClient;
public List<String> services() {
return discoveryClient.getServices();
}
}
64
...
@EnableDiscoveryClient
...
public class Application {
@Autowired
private DiscoveryClient discoveryClient;
public List<String> services() {
return discoveryClient.getServices();
}
}
65
public interface DiscoveryClient {
public ServiceInstance getLocalServiceInstance();
public List<ServiceInstance> getInstances(String serviceId);
public List<String> getServices();
}
66
public interface DiscoveryClient {
public ServiceInstance getLocalServiceInstance();
public List<ServiceInstance> getInstances(String serviceId);
public List<String> getServices();
}
67
public interface DiscoveryClient {
public ServiceInstance getLocalServiceInstance();
public List<ServiceInstance> getInstances(String serviceId);
public List<String> getServices();
}
68
Eureka
Implementation
69
Eureka Cluster (Zone 1)
appname: app1
virtualHostName: app
eureka:
client:
serviceUrl:
defaultZone: ${ZONE1_EUREKA_URL}
Eureka Cluster (Zone 2)
appname: app2
virtualHostName: app
serviceId -> virtualHostName
70
Eureka Cluster (Zone 1)
appname: app1
virtualHostName: app
eureka:
client:
serviceUrl:
defaultZone: ${ZONE1_EUREKA_URL}
zone2: ${ZONE2_EUREKA_URL}
availabilityZones: zone1,zone2
Eureka Cluster (Zone 2)
appname: app2
virtualHostName: app
71
EurekaClientEurekaDiscoveryClient
serviceId
72
virtualHostName
Applications
EurekaClientEurekaDiscoveryClient
serviceId
73
Eureka Cluster (Zone 1)
appname: app1
virtualHostName: app
virtualHostName
Applications
EurekaClient
fetch
EurekaDiscoveryClient
serviceId
eureka:
client:
registryFetchIntervalSeconds: 5 (30)
74
Eureka Cluster (Zone 1)
appname: app1
virtualHostName: app
virtualHostName
Applications
EurekaClient
fetch and filter
EurekaDiscoveryClient
serviceId
eureka:
client:
registryFetchIntervalSeconds: 5 (30)
filterOnlyUpInstances: true (true)
75
Marathon
Implementation
76
Mesos Cluster (DC 1)
taskId: {random}
appId: app1
spring:
cloud:
marathon:
host: ${MARATHON_HOST}
port: ${MARATHON_PORT}
Mesos Cluster (DC 2)
taskId: {random}
appId: app1
serviceId -> appId
77
Mesos Cluster (DC 1)
taskId: {random}
appId: app1
spring:
cloud:
marathon:
host: ${MARATHON_HOST}
port: ${MARATHON_PORT}
Mesos Cluster (DC 2)
taskId: {random}
appId: app1
serviceId -> appId
<- - - - there is no failover to another dc
78
Mesos Cluster (DC 1)
taskId: {random}
appId: app1
task = instance
MarathonClient
fetch tasks for apps
MarathonDiscoveryClient
serviceId
spring:
cloud:
marathon:
<no app cache>
<no property> only healthy tasks
79
Is it success?
80
@Autowired
private LoadBalancerClient loadBalancer;
@RequestMapping("/instance")
public ServiceInstance instance() {
return loadBalancer.choose(serviceId);
}
81
@Autowired
private LoadBalancerClient loadBalancer;
@RequestMapping("/instance")
public ServiceInstance instance() {
return loadBalancer.choose(serviceId);
}
?
82
@Autowired
private LoadBalancerClient loadBalancer;
@RequestMapping("/instance")
public ServiceInstance instance() {
return loadBalancer.choose(serviceId);
}
83
1. ServiceInstance 2. null 3. Error
@Autowired
private LoadBalancerClient loadBalancer;
@RequestMapping("/instance")
public ServiceInstance instance() {
return loadBalancer.choose(serviceId);
}
84
1. ServiceInstance 2. null 3. Error
Where it is
used?
Hypermedia Links
Dynamic Routes for Edge Server
DiscoveryClient health check in
actuator is based on it
Less than you expect, right?
85
Deep
Dive
1. Discovery
2. Balance it
86
Load Balancer
Client
Based on Netflix Ribbon
Ribbon may be used with or without
service registry
87
Service Service Service Service Service
STATE
FILTER
S2 S4
RULE
S2
Client
S1 S2 S3 S4 S5
call
S1 S2 S3 S4 S5
88
Service Service Service Service Service
FILTER
S2 S4
RULE
S2
Client
S1 S2 S3 S4 S5
call
S1 S2 S3 S4 S5
Server List
89
Service Service Service Service Service
S2 S4
RULE
S2
Client
S1 S2 S3 S4 S5
call
S1 S2 S3 S4 S5
Server List
Filter Chain
90
Service Service Service Service Service
S2 S4
S2
LoadBalancerClient
S1 S2 S3 S4 S5
call
S1 S2 S3 S4 S5
Server List
Filter Chain
Rule
91
Ribbon
Server List
Static
Configuration Based
Discovery Based
92
Spring Cloud
Ribbon Configure
Bean Lifecycle
Spring native configuration
93
test-service: #service name
ribbon: #namespace
listOfServers: host:8080,anotherHost:8081
ConfigurationBasedServerList
94
test-service: #service name
ribbon: #namespace
listOfServers: host:8080,anotherHost:8081
public List<Server> getListOfServers() {
return derive(
clientConfig.get(CommonClientConfigKey.ListOfServers)
);
}
ConfigurationBasedServerList
95
@Autowired
private LoadBalancerClient loadBalancer;
@RequestMapping("/url")
public String realUrl() throws IOException {
return loadBalancer.reconstructURI(
instance,
new URI("http://"+ serviceId +"/me")
).toString();
}
it will be replaced with real host and port
96
@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:8080/me
97
@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://anotherHost:8080/me
98
Copy-past
Implementation
99
Same as DiscoveryClient
Is our instance
alive?
100
S1 S2 S3 S4 S5
S2 S4
S2
LoadBalancerClient
call
S1 S2 S3 S4 S5?
101
Server List
Filter Chain
Rule
t t + 1
S1
S2
S3
102
t t + 1
S1
S2
S3
ServerList
S1
S2
S3
103
t t + 1
S1
S2
S3
ServerList
S1S1
S2
S3
104
t t + 1
S1
S2
S3
ServerList
S1 S1S1
S2
S3
105
t t + 1
S1
S2
S3
ServerList
S1 S1
t + 2
S1
S2
S3
106
S1 S2 S3 S4 S5
S2 S4
S2
LoadBalancerClient
call
S1 S2 S3 S4 S5Ping ->
107
Server List
Filter Chain
Rule
Pinger
(background thread)
LoadBalancer
background task
force if setServerList() is called
108
Pinger
(background thread)
LoadBalancer
background task
force if setServerList() is called
IPingStrategy
pingServers
109
Pinger
(background thread)
LoadBalancer
background task
force if setServerList() is called
IPingStrategy
pingServers
isAlive(server)
IPing
110
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;
And what if ping will take a long time?
111
NIWSDiscoveryPing
(Eureka)
IPing
instance.status.equals(
InstanceStatus.UP
)
ConsulPing
(Consul)
MarathonPing
(Marathon)
server.isPassingChecks()
server.isPassingChecks()
All are fake pings
112
public class MarathonPing implements IPing {
@Override
public boolean isAlive(Server server) {
return server.isHealthChecksPassing();
}
}
113
public class MarathonPing implements IPing {
@Override
public boolean isAlive(Server server) {
return server.isHealthChecksPassing();
}
}
public class MarathonServer extends Server {
public boolean isHealthChecksPassing() {
return healthChecks.parallelStream()
.allMatch(HealthCheckResult::isAlive);
}
}
114
IPingStrategy ?
You may implement your own strategy at your own risk
IPing PingUrl
public boolean isAlive(Server server) {
URL url = constructUrl(server);
HttpResponse response = httpClient.execute(createReq(url));
return response.getStatusLine().getStatusCode() == 200;
}
115
Reduce fetch interval
116
S1 S2 S3 S4 S5
S2 S4
S2
LoadBalancerClient
call
S1 S2 S3 S4 S5
Server List
Filter Chain ->
Rule
117
Eureka Cluster (Zone 1)
S1
S2
S3
Eureka Cluster (Zone 2)
S4
S5
S6
Client
(Zone 1)
118
Eureka Cluster (Zone 1)
S1
S2
S3
Eureka Cluster (Zone 2)
S4
S5
S6
Client
(Zone 1)
cheap call
119
Eureka Cluster (Zone 1)
S1
S2
S3
Eureka Cluster (Zone 2)
S4
S5
S6
Client
(Zone 1)
expensive call
120
Eureka Cluster (Zone 1)
S2
S3
Eureka Cluster (Zone 2)
S4
S5
S6
Client
(Zone 1)
unpredictable
S1
121
Eureka Cluster (Zone 1)
S1
S2
S3
Eureka Cluster (Zone 2)
S4
S5
S6
Client
(Zone 1)
more guaranteed result
122
FilterZonePreferenceFilter
List servers = super.getFilteredServers();
List local = servers.filter(server ->
server.zone == zoneFromConfig
);
if (!local.isEmpty()) {
return local;
}
return servers;
super.getFilteredServers()
DynamicServerListLoadBalancer
default (local) zone
123
ZoneAffinityFilterZonePreferenceFilter
super.getFilteredServers(servers)
LoadBalancerStats
getZoneSnaphot(servers)
124
S1 S2 S3 S4 S5
S2 S4
S2
LoadBalancerClient
call
S1 S2 S3 S4 S5LB Stats ->
Server List
Filter Chain
Rule
125
S1 S2 S3 S4 S5
S2 S4
S2
LoadBalancerClient
call
S1 S2 S3 S4 S5LB Stats ->
Server Stats
Server List
Filter Chain
Rule
126
S1
S2
S3
Zone Snapshot
Server Stats
127
S1
S2
S3
Zone Snapshot
activeConnections
activeServers
circuitBreakerTrippedCount
128
ZoneAffinityFilterZonePreferenceFilter
super.getFilteredServers(servers)
LoadBalancerStats
enableZoneAffinity?
zoneAffinity:
maxLoadPerServer: 0.6
maxBlackOutServersPercentage: 0.8
minAvailableServers: 2
129
ZoneAffinityFilterZonePreferenceFilter
super.getFilteredServers(servers)
ZoneAffinityPredicate
filter out instances
from other zones
130
zoneAffinity:
maxLoadPerServer: 0.6
maxBlackOutServersPercentage: 0.8
minAvailableServers: 2
Eureka Cluster (Zone 1)
S1
S2
S3
Eureka Cluster (Zone 2)
S4
S5
S6
Client
(Zone 1)
cheap call
131
ZoneAffinityFilterZonePreferenceFilter
super.getFilteredServers(servers)
ZoneAffinityPredicate
no filter
132
zoneAffinity:
maxLoadPerServer: 0.6
maxBlackOutServersPercentage: 0.8
minAvailableServers: 2
Eureka Cluster (Zone 1)
S1
Eureka Cluster (Zone 2)
S4
S5
S6
Client
(Zone 1)
133
S2
S3
Use Eureka. Use zones
134
Define your
rules
135
S1 S2 S3 S4 S5
S2 S4
S2
LoadBalancerClient
call
S1 S2 S3 S4 S5
?
136
Server List
Filter Chain
Rule
IRule
RoundRobin
ZoneAvoidance
default
Weighted Random
BestAvailability AvailabilityFilter
137
IRule
RoundRobin
ZoneAvoidance
Weighted Random
BestAvailability AvailabilityFiltering
138
upstream test-marathon-app {
server host1 weight=3;
server host2 weight=1;
server host3 weight=1;
}
Weighted typically is predefined
139
Weight Task
(background thread)
Weighted Rule
background task
LoadBalancerStats
calculate
serverWeight = summ(avgServerResponseTime)- avgServerResponseTime
140
Weight Task
(background thread)
Weighted Rule
background task
LoadBalancerStats
calculate
serverWeight = summ(avgServerResponseTime)- avgServerResponseTime
141
More response time -> less weight
142
Slow Instance Fast Instance
100 ms 10 ms
143
Slow Instance Fast Instance
100 ms 10 ms5 000 requests
144
Slow Instance Fast Instance
100 ms 10 ms5 000 requests
Round Robin Rule
Slow: 2500 and Fast: 2500
Average time: 70
145
Slow Instance Fast Instance
100 ms 10 ms5 000 requests
Round Robin Rule
Slow: 2500 and Fast: 2500
Average time: 70
146
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
147
Slow Instance Fast Instance
100 ms 10 ms1 000 requests
Round Robin Rule
Slow: 500 and Fast: 500
Average time: 70
Weighted Rule
?
?
148
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
149
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
Let’s explain
150
test-service: #service name
ribbon: #namespace
ServerWeightTaskTimerInterval: 30000 #ms
Weigths [0.0, 0.0]
Let’s explain
151
test-service: #service name
ribbon: #namespace
ServerWeightTaskTimerInterval: 1000 #ms
Let’s explain
152
test-service: #service name
ribbon: #namespace
ServerWeightTaskTimerInterval: 1000 #ms
Weigths [12.285123016785462, 120.30885719400065]
Let’s explain
153
IRule
RoundRobin
ZoneAvoidance
Weighted Random
BestAvailability AvailabilityFiltering
154
Best Available Rule LoadBalancerStats
calculate
chosen -> activeConnections == min(activeConnections)
155
Best Available Rule LoadBalancerStats
calculate
chosen -> activeConnections == min(activeConnections)
156
Less active connections -> more chance to success
157
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
Don’t use round robin rule
158
IRule
RoundRobin
ZoneAvoidance
Weighted Random
BestAvailability AvailabilityFiltering
159
Availability Filtering
Rule
LoadBalancerStats
calculate
filtered -> activeConnections < maxActiveConnections
filtered -> !isCircuitBreakerTripped
Availability Predicate
filter
160
Like a round robin
IRule
RoundRobin
ZoneAvoidance
Weighted Random
BestAvailability AvailabilityFiltering
161
Zone Avoidance Rule Composite Predicate
filter
Zone Predicate Availability Predicate
162
Zone Avoidance Rule Composite Predicate
filter
Zone Predicate Availability Predicate
CompositePredicateBuilder
int minimalFilteredServers = 1
float minimalFilteredPercentage = 0
predicate.filter(servers)
163
Zone Avoidance Rule Composite Predicate
filter
Zone Predicate Availability Predicate
CompositePredicateBuilder
int minimalFilteredServers = 1
float minimalFilteredPercentage = 0
int count = predicate.filter(servers).size() //2
164
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
165
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
166
Zone Avoidance Rule Composite Predicate
filter
Zone Predicate Availability Predicate
next
167
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
168
triggeringLoadPerServerThreshold: 0.2
avoidZoneWithBlackoutPercetage: 0.99999d
zoneToAvoid -> circuitBreakerTrippedCount / instanceCount >=
avoidZoneWithBlackoutPercetage
zones.remove(zoneToAvoid)
Zone Avoidance Rule Composite Predicate
filter
Zone Predicate Availability Predicate
169
IRule
RoundRobin
ZoneAvoidance
Weighted Random
BestAvailability AvailabilityFiltering
170
If you don’t use zones
then don’t use default rule
171
Deep
Dive
1. Discovery
2. Balance it
3. Lifecycle
172
Service Service Service Service Service
S2 S4
S2
LoadBalancerClient
S1 S2 S3 S4 S5
S1 S2 S3 S4 S5
New Service
register/deregister
173
How to
do it?
3rd party registration pattern
- dynamic
- static
Self-registration pattern (Lifecycle)
174
Docker Engine
175
Docker Engine
Service
register/deregister
176
Docker Engine
Service
register/deregister
177
Registrator
emit event
Docker Engine
Service
register/deregister
178
Registrator
emit event
Service Registry
native event
What is
lifecycle?
Allow automatically register and
deregister service in service registry
Implements Spring Lifecycle
interface
179
SmartLifecycle
DiscoveryLifecycle EurekaDiscoveryClientConfiguration
ConsulLifecycle
180
DiscoveryLifecycle
LifecycleProcessor
autoStartup on refresh
startBeans on start
Service Registry
register
emit InstanceRegistered
Event
DiscoveryClientHealthIndicator
181
DiscoveryLifecycle
LifecycleProcessor
on RefreshScope event
stopBeans on stop
Service Registry
deregister
close or shutdown
Real service discovery client
182
Something about docker
183
Docker container
Internal IP External IP
184
> 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
185
> 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
?
186
> 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
187
Docker container
Internal IP External IP
188
spring:
cloud:
consul:
discovery:
lifecycle:
enabled: false
189
Registrator
spring:
cloud:
inetutils:
ignored-interfaces:
- vbox*
- bridge*
- lo*
190
spring:
cloud:
inetutils:
ignored-interfaces:
- vbox*
- bridge*
- lo*
191
spring:
cloud:
inetutils:
ignored-interfaces:
- vbox*
- bridge*
- lo*
consul:
discovery:
preferIpAddress: true (false)
192
Instead of a conclusion
193
Own
experience
194
Own
experience
195
We use both patterns: server and
client side
• Consul + Registrator + Nginx
• Marathon + MarathonLB
• Eureka
Own
experience
Use client side pattern for API and
Edge server
Use server side for NodeJS front
apps and non-standard API (Python)
196
Own
experience
Spring Cloud is production-ready and
very customizable
Minimum number of settings are
needed to be changed, but for better
results there are some of them that
should be changed
There are some issues that make
you sad
197
198
Spring Cloud Marathon (Proof of Concept)
https://github.com/aatarasoff/spring-cloud-marathon
Spring Cloud
http://projects.spring.io/spring-cloud
Service Discovery Patterns
http://microservices.io/patterns/server-side-discovery.html
http://microservices.io/patterns/client-side-discovery.html
/aatarasoff
/aatarasoff
habrahabr.ru/aatarasoff
developerblog.info
Questions and Answers
Architect @
199

More Related Content

PDF
Everything as a code
PDF
Docker In Bank Unrated
PDF
Docker In the Bank
PPTX
Js tacktalk team dev js testing performance
PDF
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
PDF
DAST в CI/CD, Ольга Свиридова
PDF
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
PDF
Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy
Everything as a code
Docker In Bank Unrated
Docker In the Bank
Js tacktalk team dev js testing performance
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
DAST в CI/CD, Ольга Свиридова
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

What's hot (20)

PDF
Gradle Introduction
PDF
Spring Boot Revisited with KoFu and JaFu
PDF
Gradle in 45min
PDF
Integration tests: use the containers, Luke!
PPTX
Jenkins Evolutions - JEEConf 2012
PPTX
Spring & Hibernate
PPTX
Bytecode manipulation with Javassist for fun and profit
PPTX
Taking Jenkins Pipeline to the Extreme
PDF
Scala and Play with Gradle
PPTX
PDF
10thMeetup-20190420-REST API Design Principles 되새기기
PDF
PVS-Studio in the Clouds: CircleCI
PDF
Import golang; struct microservice
PDF
Inria Tech Talk : Comment améliorer la qualité de vos logiciels avec STAMP
PDF
OrientDB - The 2nd generation of (multi-model) NoSQL
PPTX
The world of gradle - an introduction for developers
PDF
Евгений Жарков "React Native: Hurdle Race"
PPT
An introduction to maven gradle and sbt
PPTX
Faster Java EE Builds with Gradle
Gradle Introduction
Spring Boot Revisited with KoFu and JaFu
Gradle in 45min
Integration tests: use the containers, Luke!
Jenkins Evolutions - JEEConf 2012
Spring & Hibernate
Bytecode manipulation with Javassist for fun and profit
Taking Jenkins Pipeline to the Extreme
Scala and Play with Gradle
10thMeetup-20190420-REST API Design Principles 되새기기
PVS-Studio in the Clouds: CircleCI
Import golang; struct microservice
Inria Tech Talk : Comment améliorer la qualité de vos logiciels avec STAMP
OrientDB - The 2nd generation of (multi-model) NoSQL
The world of gradle - an introduction for developers
Евгений Жарков "React Native: Hurdle Race"
An introduction to maven gradle and sbt
Faster Java EE Builds with Gradle
Ad

Viewers also liked (20)

PDF
Continuous Delivery with Jenkins: Lessons Learned
PDF
WILD microSERVICES v2 (JEEConf Edition)
PDF
Joker 2015. WILD microSERVICES
PDF
Дикие микросервисы на JUG Екатеринбург
PDF
микроСЕРВИСЫ: огонь, вода и медные трубы
PDF
Java Day Minsk 2016 Keynote about Microservices in real world
ODP
Declarative Services - Dependency Injection OSGi Style
PDF
Reactive applications
ODP
Server-side OSGi with Apache Sling (OSGiDevCon 2011)
PDF
Social Media For Busy Entrepreneurs and Small Businesses
PDF
Imágenes inmersivas
PPTX
Crisis Subprime en España
PPT
Ecosistemas
PDF
Linux as a gaming platform - Errata
PPSX
CriminalEFS-PowerPoint
PDF
Linux as a gaming platform, ideology aside
PDF
Suir img
PPT
El presidencialismo mexicano antes y después
PDF
Gamedev-grade debugging
PPTX
Green Peace y WWF
Continuous Delivery with Jenkins: Lessons Learned
WILD microSERVICES v2 (JEEConf Edition)
Joker 2015. WILD microSERVICES
Дикие микросервисы на JUG Екатеринбург
микроСЕРВИСЫ: огонь, вода и медные трубы
Java Day Minsk 2016 Keynote about Microservices in real world
Declarative Services - Dependency Injection OSGi Style
Reactive applications
Server-side OSGi with Apache Sling (OSGiDevCon 2011)
Social Media For Busy Entrepreneurs and Small Businesses
Imágenes inmersivas
Crisis Subprime en España
Ecosistemas
Linux as a gaming platform - Errata
CriminalEFS-PowerPoint
Linux as a gaming platform, ideology aside
Suir img
El presidencialismo mexicano antes y después
Gamedev-grade debugging
Green Peace y WWF
Ad

Similar to Service Discovery. Spring Cloud Internals (20)

PDF
Gasimov Orkhan "Service Discovery and Coordination by Netflix Eureka and Spri...
PPTX
Microservice creation using spring cloud, zipkin, ribbon, zull, eureka
PDF
Микросервисы со Spring Boot & Spring Cloud
PPTX
Springboot Microservices
PPTX
Operating a High Velocity Large Organization with Spring Cloud Microservices
PPTX
03 spring cloud eureka service discovery
PDF
Service discovery with Eureka and Spring Cloud
PPTX
Microservices Platform with Spring Boot, Spring Cloud Config, Spring Cloud Ne...
PDF
Service Discovery in MicroServices
PDF
Spring Cloud: Why? How? What?
PDF
Spring cloud Service-Discovery
PPTX
Cloud Native Spring - The role of Spring Cloud after Kubernetes became a main...
PDF
Resilient Microservices with Spring Cloud
PPTX
Microservices with Spring
PDF
Cloud-native Patterns (July 4th, 2019)
PDF
Cloud-native Patterns
PPT
JDD 2016 - Jacek Bukowski - "Flying To Clouds" - Can It Be Easy?
PPT
Flying to clouds - can it be easy? Cloud Native Applications
PDF
Microservices - not just with Java
PDF
S1P: Spring Cloud on PKS
Gasimov Orkhan "Service Discovery and Coordination by Netflix Eureka and Spri...
Microservice creation using spring cloud, zipkin, ribbon, zull, eureka
Микросервисы со Spring Boot & Spring Cloud
Springboot Microservices
Operating a High Velocity Large Organization with Spring Cloud Microservices
03 spring cloud eureka service discovery
Service discovery with Eureka and Spring Cloud
Microservices Platform with Spring Boot, Spring Cloud Config, Spring Cloud Ne...
Service Discovery in MicroServices
Spring Cloud: Why? How? What?
Spring cloud Service-Discovery
Cloud Native Spring - The role of Spring Cloud after Kubernetes became a main...
Resilient Microservices with Spring Cloud
Microservices with Spring
Cloud-native Patterns (July 4th, 2019)
Cloud-native Patterns
JDD 2016 - Jacek Bukowski - "Flying To Clouds" - Can It Be Easy?
Flying to clouds - can it be easy? Cloud Native Applications
Microservices - not just with Java
S1P: Spring Cloud on PKS

More from Aleksandr Tarasov (6)

PDF
Cocktail of Environments. How to Mix Test and Development Environments and St...
PPTX
Service Discovery. More that it seems
PDF
WILD microSERVICES v2
PDF
Расширь границы возможного вместе с Gradle
PDF
Jbreak 2016: Твой личный Spring Boot Starter
PDF
Хипстеры в энтерпрайзе
Cocktail of Environments. How to Mix Test and Development Environments and St...
Service Discovery. More that it seems
WILD microSERVICES v2
Расширь границы возможного вместе с Gradle
Jbreak 2016: Твой личный Spring Boot Starter
Хипстеры в энтерпрайзе

Recently uploaded (20)

PPTX
Reimagine Home Health with the Power of Agentic AI​
PPTX
L1 - Introduction to python Backend.pptx
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
Understanding Forklifts - TECH EHS Solution
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PPTX
history of c programming in notes for students .pptx
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
System and Network Administration Chapter 2
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
Nekopoi APK 2025 free lastest update
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PPTX
CHAPTER 2 - PM Management and IT Context
PPTX
Odoo POS Development Services by CandidRoot Solutions
PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Reimagine Home Health with the Power of Agentic AI​
L1 - Introduction to python Backend.pptx
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Understanding Forklifts - TECH EHS Solution
How to Choose the Right IT Partner for Your Business in Malaysia
Odoo Companies in India – Driving Business Transformation.pdf
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
history of c programming in notes for students .pptx
2025 Textile ERP Trends: SAP, Odoo & Oracle
System and Network Administration Chapter 2
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
Nekopoi APK 2025 free lastest update
wealthsignaloriginal-com-DS-text-... (1).pdf
CHAPTER 2 - PM Management and IT Context
Odoo POS Development Services by CandidRoot Solutions
PTS Company Brochure 2025 (1).pdf.......
Which alternative to Crystal Reports is best for small or large businesses.pdf
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free

Service Discovery. Spring Cloud Internals