Part I : Spring Cloud / Eureka & Zuul
Products not Projects
Smart endpoints, dumb pipes
Decentralized Data Management
Design for Failure
SOA done right
35% of US bandwidth
(youtube uses 15%)
1 Billion req/d
Peak: 20k req/s
Front
Server
Echo Service
Echo Service
Echo Service
Echo Service
Heartbeat
package com.mgaudin.sandbox.ht.front;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@EnableEurekaServer
@EnableDiscoveryClient
@SpringBootApplication
public class FrontApplication {
public static void main(String[] args) {
SpringApplication.run(FrontApplication.class, args);
}
}
server.port=8081
spring.application.name=Front
eureka.instance.hostname=localhost
eureka.instance.lease-renewal-interval-in-seconds=5
eureka.client.serviceUrl.defaultZone= http://${eureka.instance.hostname}:${server.port}/eureka/
eureka.client.registry-fetch-interval-seconds=5
eureka.dashboard.path=/dashboard
echo.ribbon.ServerWeightTaskTimerInterval=3000
@RestController
@RequestMapping("/")
public class EchoController {
@RequestMapping(method = RequestMethod.POST)
public String echo(@RequestBody(required = false) String input) throws UnknownHostException {
return String.format("%s (from %s)", input == null ? "" : input, InetAddress.getLocalHost().getHostAddress());
}
@RequestMapping(method = RequestMethod.GET, produces = "application/json")
public String getIP() throws UnknownHostException {
return String.format("{ \"ip\": \"%s\" }", InetAddress.getLocalHost().getHostAddress());
}
}
spring.application.name=echo
eureka.client.serviceUrl.defaultZone=http://localhost:8081/eureka/
eureka.client.registry-fetch-interval-seconds=5
eureka.instance.lease-renewal-interval-in-seconds=5
eureka.instance.metadata-map.instanceId=${spring.application.name}:${spring.application.instance_id:${random.value}}
latency.artificial.wait=0
Front
Server
Echo Service
Echo Service
Echo Service
Echo Service
Heartbeat
Maven
Docker
Images
Docker Compose
Docker-Compose
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.2.6</version>
<configuration>
<imageName>humantalks/${project.artifactId}</imageName>
<dockerDirectory>${project.build.sourceDirectory}/../docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
front:
image: humantalks/front
ports:
- 8081:8081
echo:
image: humantalks/echo
links:
- front
expose:
- 8080
echoSlow:
image: humantalks/echo
links:
- front
environment:
- latency.artificial.wait=800
expose:
- 8080
FROM java:8
MAINTAINER Maxime Gaudin <gaudin.maxime@gmail.com>
ADD echo-1.0-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
COPY conf/application.properties application.properties
ENTRYPOINT ["java", "-jar", "/app.jar", "--spring.config.location=file:/application.properties"]