Service Discovery. Spring Cloud Internals

Aleksandr Tarasov
Aleksandr TarasovEngineer. Speaker. Blogger. DevOps fan and expert. Husband and father.
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
1 of 199

Recommended

Everything as a code by
Everything as a codeEverything as a code
Everything as a codeAleksandr Tarasov
1.2K views197 slides
Docker In Bank Unrated by
Docker In Bank UnratedDocker In Bank Unrated
Docker In Bank UnratedAleksandr Tarasov
2.2K views142 slides
Docker In the Bank by
Docker In the BankDocker In the Bank
Docker In the BankAleksandr Tarasov
1.1K views82 slides
Js tacktalk team dev js testing performance by
Js tacktalk team dev js testing performanceJs tacktalk team dev js testing performance
Js tacktalk team dev js testing performanceАртем Захарченко
626 views49 slides
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso... by
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...ZeroTurnaround
90K views15 slides
DAST в CI/CD, Ольга Свиридова by
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваMail.ru Group
344 views42 slides

More Related Content

What's hot

Gradle Introduction by
Gradle IntroductionGradle Introduction
Gradle IntroductionDmitry Buzdin
7.8K views39 slides
Spring Boot Revisited with KoFu and JaFu by
Spring Boot Revisited with KoFu and JaFuSpring Boot Revisited with KoFu and JaFu
Spring Boot Revisited with KoFu and JaFuVMware Tanzu
394 views59 slides
Dropwizard by
DropwizardDropwizard
DropwizardAbdulhadi ÇELENLİOĞLU
1.1K views14 slides
Gradle in 45min by
Gradle in 45minGradle in 45min
Gradle in 45minSchalk Cronjé
1.6K views49 slides
Integration tests: use the containers, Luke! by
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Roberto Franchini
1.9K views75 slides
Jenkins Evolutions - JEEConf 2012 by
Jenkins Evolutions - JEEConf 2012Jenkins Evolutions - JEEConf 2012
Jenkins Evolutions - JEEConf 2012Anton Arhipov
12.4K views83 slides

What's hot(20)

Spring Boot Revisited with KoFu and JaFu by VMware Tanzu
Spring Boot Revisited with KoFu and JaFuSpring Boot Revisited with KoFu and JaFu
Spring Boot Revisited with KoFu and JaFu
VMware Tanzu394 views
Integration tests: use the containers, Luke! by Roberto Franchini
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!
Roberto Franchini1.9K views
Jenkins Evolutions - JEEConf 2012 by Anton Arhipov
Jenkins Evolutions - JEEConf 2012Jenkins Evolutions - JEEConf 2012
Jenkins Evolutions - JEEConf 2012
Anton Arhipov12.4K views
Spring & Hibernate by Jiayun Zhou
Spring & HibernateSpring & Hibernate
Spring & Hibernate
Jiayun Zhou245 views
Bytecode manipulation with Javassist for fun and profit by Jérôme Kehrli
Bytecode manipulation with Javassist for fun and profitBytecode manipulation with Javassist for fun and profit
Bytecode manipulation with Javassist for fun and profit
Jérôme Kehrli3.9K views
Taking Jenkins Pipeline to the Extreme by yinonavraham
Taking Jenkins Pipeline to the ExtremeTaking Jenkins Pipeline to the Extreme
Taking Jenkins Pipeline to the Extreme
yinonavraham498 views
Scala and Play with Gradle by Wei Chen
Scala and Play with GradleScala and Play with Gradle
Scala and Play with Gradle
Wei Chen2.1K views
10thMeetup-20190420-REST API Design Principles 되새기기 by DongHee Lee
10thMeetup-20190420-REST API Design Principles 되새기기10thMeetup-20190420-REST API Design Principles 되새기기
10thMeetup-20190420-REST API Design Principles 되새기기
DongHee Lee565 views
PVS-Studio in the Clouds: CircleCI by Andrey Karpov
PVS-Studio in the Clouds: CircleCIPVS-Studio in the Clouds: CircleCI
PVS-Studio in the Clouds: CircleCI
Andrey Karpov61 views
Import golang; struct microservice by Giulio De Donato
Import golang; struct microserviceImport golang; struct microservice
Import golang; struct microservice
Giulio De Donato4.2K views
Inria Tech Talk : Comment améliorer la qualité de vos logiciels avec STAMP by Stéphanie Roger
Inria Tech Talk : Comment améliorer la qualité de vos logiciels avec STAMPInria Tech Talk : Comment améliorer la qualité de vos logiciels avec STAMP
Inria Tech Talk : Comment améliorer la qualité de vos logiciels avec STAMP
Stéphanie Roger266 views
OrientDB - The 2nd generation of (multi-model) NoSQL by Roberto Franchini
OrientDB - The 2nd generation of  (multi-model) NoSQLOrientDB - The 2nd generation of  (multi-model) NoSQL
OrientDB - The 2nd generation of (multi-model) NoSQL
Roberto Franchini791 views
Евгений Жарков "React Native: Hurdle Race" by Fwdays
Евгений Жарков "React Native: Hurdle Race"Евгений Жарков "React Native: Hurdle Race"
Евгений Жарков "React Native: Hurdle Race"
Fwdays322 views
An introduction to maven gradle and sbt by Fabio Fumarola
An introduction to maven gradle and sbtAn introduction to maven gradle and sbt
An introduction to maven gradle and sbt
Fabio Fumarola8.2K views
Faster Java EE Builds with Gradle by Ryan Cuprak
Faster Java EE Builds with GradleFaster Java EE Builds with Gradle
Faster Java EE Builds with Gradle
Ryan Cuprak492 views

Viewers also liked

Continuous Delivery with Jenkins: Lessons Learned by
Continuous Delivery with Jenkins: Lessons LearnedContinuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons LearnedAleksandr Tarasov
3.4K views50 slides
WILD microSERVICES v2 (JEEConf Edition) by
WILD microSERVICES v2 (JEEConf Edition)WILD microSERVICES v2 (JEEConf Edition)
WILD microSERVICES v2 (JEEConf Edition)Aleksandr Tarasov
1K views73 slides
Joker 2015. WILD microSERVICES by
Joker 2015. WILD microSERVICESJoker 2015. WILD microSERVICES
Joker 2015. WILD microSERVICESAleksandr Tarasov
1.2K views42 slides
Дикие микросервисы на JUG Екатеринбург by
Дикие микросервисы на JUG ЕкатеринбургДикие микросервисы на JUG Екатеринбург
Дикие микросервисы на JUG ЕкатеринбургКирилл Толкачёв
871 views237 slides
микроСЕРВИСЫ: огонь, вода и медные трубы by
микроСЕРВИСЫ: огонь, вода и медные трубымикроСЕРВИСЫ: огонь, вода и медные трубы
микроСЕРВИСЫ: огонь, вода и медные трубыAleksandr Tarasov
6.2K views139 slides
Java Day Minsk 2016 Keynote about Microservices in real world by
Java Day Minsk 2016 Keynote about Microservices in real worldJava Day Minsk 2016 Keynote about Microservices in real world
Java Day Minsk 2016 Keynote about Microservices in real worldКирилл Толкачёв
949 views142 slides

Viewers also liked(20)

Continuous Delivery with Jenkins: Lessons Learned by Aleksandr Tarasov
Continuous Delivery with Jenkins: Lessons LearnedContinuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons Learned
Aleksandr Tarasov3.4K views
микроСЕРВИСЫ: огонь, вода и медные трубы by Aleksandr Tarasov
микроСЕРВИСЫ: огонь, вода и медные трубымикроСЕРВИСЫ: огонь, вода и медные трубы
микроСЕРВИСЫ: огонь, вода и медные трубы
Aleksandr Tarasov6.2K views
Declarative Services - Dependency Injection OSGi Style by Felix Meschberger
Declarative Services - Dependency Injection OSGi StyleDeclarative Services - Dependency Injection OSGi Style
Declarative Services - Dependency Injection OSGi Style
Felix Meschberger2.1K views
Server-side OSGi with Apache Sling (OSGiDevCon 2011) by Felix Meschberger
Server-side OSGi with Apache Sling (OSGiDevCon 2011)Server-side OSGi with Apache Sling (OSGiDevCon 2011)
Server-side OSGi with Apache Sling (OSGiDevCon 2011)
Felix Meschberger1.7K views
Social Media For Busy Entrepreneurs and Small Businesses by Fikriyyah George
Social Media For Busy Entrepreneurs and Small Businesses Social Media For Busy Entrepreneurs and Small Businesses
Social Media For Busy Entrepreneurs and Small Businesses
Fikriyyah George304 views
Linux as a gaming platform - Errata by Leszek Godlewski
Linux as a gaming platform - ErrataLinux as a gaming platform - Errata
Linux as a gaming platform - Errata
Leszek Godlewski16.5K views
CriminalEFS-PowerPoint by Jenn Amabile
CriminalEFS-PowerPointCriminalEFS-PowerPoint
CriminalEFS-PowerPoint
Jenn Amabile221 views
Linux as a gaming platform, ideology aside by Leszek Godlewski
Linux as a gaming platform, ideology asideLinux as a gaming platform, ideology aside
Linux as a gaming platform, ideology aside
Leszek Godlewski24.4K views
El presidencialismo mexicano antes y después by espejodeoesed
El presidencialismo mexicano antes y después El presidencialismo mexicano antes y después
El presidencialismo mexicano antes y después
espejodeoesed156 views

Similar to Service Discovery. Spring Cloud Internals

[Rakuten TechConf2014] [C-5] Ichiba Architecture on ExaLogic by
[Rakuten TechConf2014] [C-5] Ichiba Architecture on ExaLogic[Rakuten TechConf2014] [C-5] Ichiba Architecture on ExaLogic
[Rakuten TechConf2014] [C-5] Ichiba Architecture on ExaLogicRakuten Group, Inc.
4.7K views88 slides
IVS CTO Night And Day 2018 Winter - [re:Cap] Serverless & Mobile by
IVS CTO Night And Day 2018 Winter - [re:Cap] Serverless & MobileIVS CTO Night And Day 2018 Winter - [re:Cap] Serverless & Mobile
IVS CTO Night And Day 2018 Winter - [re:Cap] Serverless & MobileAmazon Web Services Japan
467 views53 slides
AMIS Oracle OpenWorld 2013 Review Part 3 - Fusion Middleware by
AMIS Oracle OpenWorld 2013 Review Part 3 - Fusion MiddlewareAMIS Oracle OpenWorld 2013 Review Part 3 - Fusion Middleware
AMIS Oracle OpenWorld 2013 Review Part 3 - Fusion MiddlewareGetting value from IoT, Integration and Data Analytics
3.6K views181 slides
Oracle Drivers configuration for High Availability by
Oracle Drivers configuration for High AvailabilityOracle Drivers configuration for High Availability
Oracle Drivers configuration for High AvailabilityLudovico Caldara
590 views73 slides
Introduction to Laravel Framework (5.2) by
Introduction to Laravel Framework (5.2)Introduction to Laravel Framework (5.2)
Introduction to Laravel Framework (5.2)Viral Solani
2.5K views52 slides
Laravel for Web Artisans by
Laravel for Web ArtisansLaravel for Web Artisans
Laravel for Web ArtisansRaf Kewl
6.8K views72 slides

Similar to Service Discovery. Spring Cloud Internals(20)

[Rakuten TechConf2014] [C-5] Ichiba Architecture on ExaLogic by Rakuten Group, Inc.
[Rakuten TechConf2014] [C-5] Ichiba Architecture on ExaLogic[Rakuten TechConf2014] [C-5] Ichiba Architecture on ExaLogic
[Rakuten TechConf2014] [C-5] Ichiba Architecture on ExaLogic
Rakuten Group, Inc.4.7K views
Oracle Drivers configuration for High Availability by Ludovico Caldara
Oracle Drivers configuration for High AvailabilityOracle Drivers configuration for High Availability
Oracle Drivers configuration for High Availability
Ludovico Caldara590 views
Introduction to Laravel Framework (5.2) by Viral Solani
Introduction to Laravel Framework (5.2)Introduction to Laravel Framework (5.2)
Introduction to Laravel Framework (5.2)
Viral Solani2.5K views
Laravel for Web Artisans by Raf Kewl
Laravel for Web ArtisansLaravel for Web Artisans
Laravel for Web Artisans
Raf Kewl6.8K views
Admin Tech Ed Presentation Hardening Sql Server by rsnarayanan
Admin Tech Ed Presentation   Hardening Sql ServerAdmin Tech Ed Presentation   Hardening Sql Server
Admin Tech Ed Presentation Hardening Sql Server
rsnarayanan550 views
Infrastructure-as-code: bridging the gap between Devs and Ops by Mykyta Protsenko
Infrastructure-as-code: bridging the gap between Devs and OpsInfrastructure-as-code: bridging the gap between Devs and Ops
Infrastructure-as-code: bridging the gap between Devs and Ops
Mykyta Protsenko182 views
DevOps Enabling Your Team by GR8Conf
DevOps Enabling Your TeamDevOps Enabling Your Team
DevOps Enabling Your Team
GR8Conf395 views
Grow and Shrink - Dynamically Extending the Ruby VM Stack by KeitaSugiyama1
Grow and Shrink - Dynamically Extending the Ruby VM StackGrow and Shrink - Dynamically Extending the Ruby VM Stack
Grow and Shrink - Dynamically Extending the Ruby VM Stack
KeitaSugiyama1658 views
UVM TUTORIAL; by Azad Mishra
UVM TUTORIAL;UVM TUTORIAL;
UVM TUTORIAL;
Azad Mishra7.9K views
Debugging Microservices - QCON 2017 by Idit Levine
Debugging Microservices - QCON 2017Debugging Microservices - QCON 2017
Debugging Microservices - QCON 2017
Idit Levine1.6K views
The Very Very Latest in Database Development - Oracle Open World 2012 by Lucas Jellema
The Very Very Latest in Database Development - Oracle Open World 2012The Very Very Latest in Database Development - Oracle Open World 2012
The Very Very Latest in Database Development - Oracle Open World 2012
Lucas Jellema2.5K views
Breaking a monolith: In-place refactoring with service-oriented architecture ... by Ryan M Harrison
Breaking a monolith: In-place refactoring with service-oriented architecture ...Breaking a monolith: In-place refactoring with service-oriented architecture ...
Breaking a monolith: In-place refactoring with service-oriented architecture ...
Ryan M Harrison539 views
LF_APIStrat17_Breaking a Monolith: In-Place Refactoring with Service-Oriented... by LF_APIStrat
LF_APIStrat17_Breaking a Monolith: In-Place Refactoring with Service-Oriented...LF_APIStrat17_Breaking a Monolith: In-Place Refactoring with Service-Oriented...
LF_APIStrat17_Breaking a Monolith: In-Place Refactoring with Service-Oriented...
LF_APIStrat26 views
Puppet Camp Melbourne 2014: Node Collaboration with PuppetDB by Puppet
Puppet Camp Melbourne 2014: Node Collaboration with PuppetDB Puppet Camp Melbourne 2014: Node Collaboration with PuppetDB
Puppet Camp Melbourne 2014: Node Collaboration with PuppetDB
Puppet963 views
Ansible benelux meetup - Amsterdam 27-5-2015 by Pavel Chunyayev
Ansible benelux meetup - Amsterdam 27-5-2015Ansible benelux meetup - Amsterdam 27-5-2015
Ansible benelux meetup - Amsterdam 27-5-2015
Pavel Chunyayev875 views
Puppetcamp Melbourne - puppetdb by m_richardson
Puppetcamp Melbourne - puppetdbPuppetcamp Melbourne - puppetdb
Puppetcamp Melbourne - puppetdb
m_richardson1.1K views

Recently uploaded

Roadmap y Novedades de producto by
Roadmap y Novedades de productoRoadmap y Novedades de producto
Roadmap y Novedades de productoNeo4j
43 views33 slides
DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM... by
DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM...DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM...
DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM...Deltares
7 views40 slides
El Arte de lo Possible by
El Arte de lo PossibleEl Arte de lo Possible
El Arte de lo PossibleNeo4j
34 views35 slides
Copilot Prompting Toolkit_All Resources.pdf by
Copilot Prompting Toolkit_All Resources.pdfCopilot Prompting Toolkit_All Resources.pdf
Copilot Prompting Toolkit_All Resources.pdfRiccardo Zamana
6 views4 slides
Advanced API Mocking Techniques by
Advanced API Mocking TechniquesAdvanced API Mocking Techniques
Advanced API Mocking TechniquesDimpy Adhikary
18 views11 slides
Neo4j y GenAI by
Neo4j y GenAI Neo4j y GenAI
Neo4j y GenAI Neo4j
35 views41 slides

Recently uploaded(20)

Roadmap y Novedades de producto by Neo4j
Roadmap y Novedades de productoRoadmap y Novedades de producto
Roadmap y Novedades de producto
Neo4j43 views
DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM... by Deltares
DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM...DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM...
DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM...
Deltares7 views
El Arte de lo Possible by Neo4j
El Arte de lo PossibleEl Arte de lo Possible
El Arte de lo Possible
Neo4j34 views
Copilot Prompting Toolkit_All Resources.pdf by Riccardo Zamana
Copilot Prompting Toolkit_All Resources.pdfCopilot Prompting Toolkit_All Resources.pdf
Copilot Prompting Toolkit_All Resources.pdf
Riccardo Zamana6 views
Advanced API Mocking Techniques by Dimpy Adhikary
Advanced API Mocking TechniquesAdvanced API Mocking Techniques
Advanced API Mocking Techniques
Dimpy Adhikary18 views
Neo4j y GenAI by Neo4j
Neo4j y GenAI Neo4j y GenAI
Neo4j y GenAI
Neo4j35 views
DSD-INT 2023 Simulating a falling apron in Delft3D 4 - Engineering Practice -... by Deltares
DSD-INT 2023 Simulating a falling apron in Delft3D 4 - Engineering Practice -...DSD-INT 2023 Simulating a falling apron in Delft3D 4 - Engineering Practice -...
DSD-INT 2023 Simulating a falling apron in Delft3D 4 - Engineering Practice -...
Deltares6 views
DSD-INT 2023 Modelling litter in the Yarra and Maribyrnong Rivers (Australia)... by Deltares
DSD-INT 2023 Modelling litter in the Yarra and Maribyrnong Rivers (Australia)...DSD-INT 2023 Modelling litter in the Yarra and Maribyrnong Rivers (Australia)...
DSD-INT 2023 Modelling litter in the Yarra and Maribyrnong Rivers (Australia)...
Deltares9 views
DSD-INT 2023 - Delft3D User Days - Welcome - Day 3 - Afternoon by Deltares
DSD-INT 2023 - Delft3D User Days - Welcome - Day 3 - AfternoonDSD-INT 2023 - Delft3D User Days - Welcome - Day 3 - Afternoon
DSD-INT 2023 - Delft3D User Days - Welcome - Day 3 - Afternoon
Deltares11 views
DSD-INT 2023 Baseline studies for Strategic Coastal protection for Long Islan... by Deltares
DSD-INT 2023 Baseline studies for Strategic Coastal protection for Long Islan...DSD-INT 2023 Baseline studies for Strategic Coastal protection for Long Islan...
DSD-INT 2023 Baseline studies for Strategic Coastal protection for Long Islan...
Deltares10 views
Tridens DevOps by Tridens
Tridens DevOpsTridens DevOps
Tridens DevOps
Tridens9 views
What Can Employee Monitoring Software Do?​ by wAnywhere
What Can Employee Monitoring Software Do?​What Can Employee Monitoring Software Do?​
What Can Employee Monitoring Software Do?​
wAnywhere18 views
.NET Developer Conference 2023 - .NET Microservices mit Dapr – zu viel Abstra... by Marc Müller
.NET Developer Conference 2023 - .NET Microservices mit Dapr – zu viel Abstra....NET Developer Conference 2023 - .NET Microservices mit Dapr – zu viel Abstra...
.NET Developer Conference 2023 - .NET Microservices mit Dapr – zu viel Abstra...
Marc Müller35 views
Unmasking the Dark Art of Vectored Exception Handling: Bypassing XDR and EDR ... by Donato Onofri
Unmasking the Dark Art of Vectored Exception Handling: Bypassing XDR and EDR ...Unmasking the Dark Art of Vectored Exception Handling: Bypassing XDR and EDR ...
Unmasking the Dark Art of Vectored Exception Handling: Bypassing XDR and EDR ...
Donato Onofri643 views

Service Discovery. Spring Cloud Internals