SlideShare uma empresa Scribd logo
1 de 64
Baixar para ler offline
JEE ON DC/OS
101 AND FUN
Dr. Josef Adersberger ( @adersberger)
DC/OS = #GIFEE Google’s

(and Facebook’s, Twitter’s, Airbnb’s, …)

Infrastructure

For

Everyone

Else
#GIFEE => Cloud Native Applications

(apps like Google’s, Facebook’s, …)
TRAFFIC
DATA
FEATURES
AT NO OPPORTUNITY COSTSHORIZONTAL
The second largest monolith on earth!*
*) only beaten by the guys who are writing PHP code at large scale
JEE
CLOUD

NATIVE
+ =
CLOUD

NATIVE

JEE
instagram.com/toby_littledude
JEE IS NEITHER UGLY NOR FOCUSED ON MONOLITHIC APPS
▸ Java EE by itself is modular und lightweight in the recent versions.

(to be honest: Spring feels more heavyweight than JEE to me from
time to time)
▸ Java EE micro containers allow to modularize applications into
self-contained runnable units.
▸ How to develop enterprise applications based on Java EE is well
understood and knowledge is widespread.
▸ API is mature and standardized. Implementations are battle
proven.
JEE
CLOUD

NATIVE
+ =
CLOUD

NATIVE

JEE
instagram.com/toby_littledude
ARCHITECT’S VIEW
CLOUD NATIVE JEE
JEE IS NOT AN OVERALL MONOLITH. BUT PEOPLE TEND TO RUN
JEE APPS AS MONOLITHS WITHIN HEAVY WEIGHT APP SERVERS.
DESIGN CODE RUN
startup-cluster.sh
JEE Impl.
JEE App Server
JEE MICRO CONTAINER TO THE RESCUE: ENABLING MICROSERVICES ON JEE
DESIGN CODE RUN
main()
JEE impl. parts
A CLOUD OF JEE MICRO CONTAINERS. MISSION ACCOMPLISHED?
image: https://www.dreamstime.com
a cloud is not nothing!
what’s inside our cloud?
THE CLOUD NATIVE STACK
CLOUD NATIVE STACK
JEE MICROSERVICES
CLUSTER VIRTUALIZATION (computing, network, storage, memory)
CLUSTER RESOURCE MANAGER
CLUSTER ORCHESTRATOR
APPLICATIONS
CONTAINER
CLUSTER RESOURCES
MICROSERVICE PLATFORM

API Gateway
Micro Container
Configuration & Coordination
Diagnosability &

Monitoring
Infrastructure-as-a-Service Bare Metal Local Host
Service

Client
Service Discovery
DevOps Interface
‣ deploy
‣ rollback
‣ scale
‣ configure
Diagnose Interface
‣ analyze logs
‣ analyze metrics
‣ analyze traces
Edge Interface
‣ request service
‣ authenticate
CLUSTER VIRTUALIZATION (computing, network, storage, memory)
CLUSTER RESOURCE MANAGER
CLUSTER ORCHESTRATOR
APPLICATIONS
CONTAINER
CLUSTER RESOURCES
MICROSERVICE PLATFORM

API Gateway
Micro Container
Configuration & Coordination
Diagnosability &

Monitoring
Infrastructure-as-a-Service Bare Metal Local Host
Service

Client
Service Discovery
DevOps Interface
‣ deploy
‣ rollback
‣ scale
‣ configure
Diagnose Interface
‣ analyze logs
‣ analyze metrics
‣ analyze traces
Edge Interface
‣ request service
‣ authenticate
how to provide the right
resources for container
execution?
how to decouple from
physical hardware?
how to run (containerized)
applications on a cluster?
how to detect and solve
operational anomalies?
how to call other microservices
resilient and responsive?
how to execute a microservice
and embed it within the platform? how to provide cluster-wide
consensus on config values etc.?
how to expose microservice
endpoints to the internet?
how to manage
microservice endpoints
within the whole
platform?
goo.gl/xrVg3J
CLUSTER VIRTUALIZATION (computing, network, storage, memory)
CLUSTER RESOURCE MANAGER
CLUSTER ORCHESTRATOR
APPLICATIONS
CONTAINER
CLUSTER RESOURCES
MICROSERVICE PLATFORM

API Gateway
Micro Container
Configuration & Coordination
Diagnosability &

Monitoring
Infrastructure-as-a-Service Bare Metal Local Host
Service

Client
Service Discovery
DevOps Interface
Diagnose InterfaceEdge Interface
THE ZWITSCHER JEE SHOWCASE
ZWITSCHER-APP-HISTORY ZWITSCHER-APP-WIKIPEDIAZWITSCHER-APP-CHUCK
ZWITSCHER-APP-BOARD
keyword results + keyword history
random joke

(because every chuck
norris joke matches on
every keyword)
JDBC Open API
ZWITSCHER-APP-CHUCK
fallback
https://github.com/adersberger/cloud-native-zwitscher-jee
DEVELOPER’S VIEW
CLOUD NATIVE JEE 101
MICRO
CONTAINERDEPENDENCY INJECTION
APPLICATION LIFECYCLE
ENDPOINT EXPOSITION
THE JEE MICRO CONTAINER ECOSYSTEM
http://wildfly-swarm.io
https://ee.kumuluz.com
http://microprofile.io (to come)
http://tomee.apache.org
http://www.payara.fish/payara_micro
EMBEDDED
implements (unstable)
JEE MICRO CONTAINER COMPARISON CHART
Payara Micro Wildfly Swarm TomEE+ kumuluzEE
Servlets et al. x x x x
WebSockets x x x
JSF x x x
JAX-RS x x x x
JAX-WS x x
EJB *2 x x x
CDI x x x x
JTA x x x
JCA x x
JMS x x
JPA x x x x
Bean Validation x x x x
JBatch x x
Concurrency x x
JCache x x
JEE version JEE 7 JEE 7 JEE 6, JEE 7 part.*1 JEE 7 part.
Packaging WAR + JAR JAR JAR classes + JARs
Startup time 4s 4s 2s 1s
Size 57MB 83 MB 44 MB 15 MB
*1) http://tomee.apache.org/javaee7-status.html
*2) http://stackoverflow.com/questions/13487987/where-to-use-ejb-3-1-and-cdi
@Path(“/joke") @RequestScoped

public class ChuckJokeResource {

@Inject

private IcndbIntegration icndb;

@GET

@Produces("application/json")

public Response getJoke() {

Map<String, String> json = new HashMap<>();

json.put("message", icndb.getRandomJoke());

return Response.ok(json).build();

}

}
@ApplicationPath("/chuck")

public class ChuckJokeApplication extends ResourceConfig {

public ChuckJokeApplication() {

super();
register(ChuckJokeResource.class);

}

}
JAX-RS WITH CDI
bean-discovery-mode="all"
public class Main {



/**

* Starts the microservice container.

*

* Requires environment variable "PORT" according

* on what port to listen.

*

* @param args no arguments evaluated

*/

public static void main(String[] args) {

com.kumuluz.ee.EeApplication.main(args);

}

}
JEE MICRO CONTAINER STARTUP
TESTING
@RunWith(CdiTestRunner.class)

public class TestChuckJokeResource {



@Inject

private ChuckJokeResource chuckJokeResource;



@Test

public void testChuckJokeResource() {

Response response = chuckJokeResource.getJoke();

assertThat(
response.getStatusInfo().getStatusCode(),
equalTo(200));

}

}
SERVICE CLIENTSERVICE DISCOVERY
LOAD BALANCING
REQUEST MONITORING
CIRCUIT BREAKING
SERVICE CLIENT WITH JERSEY, RXJAVA AND HYSTRIX
‣ Circuit Breaker (Resiliency)
‣ Request Monitoring
‣ JAX-RS 2.0 compliant REST clients‣ Parallel & async execution 

(Responsive)
SERVICE CLIENT WITH JERSEY, RXJAVA AND HYSTRIX
@RequestScoped

public class IcndbIntegration implements IChuckNorrisJokes {



@Override public String getRandomJoke() {

IcndbIntegrationCommand cmd = new IcndbIntegrationCommand();

return cmd.observe().toBlocking().toFuture().get();

}



private class IcndbIntegrationCommand extends HystrixObservableCommand<String> {



IcndbIntegrationCommand() {

super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("zwitscher"))

.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()

.withExecutionTimeoutInMilliseconds(3000)));

}



@Override protected Observable<String> construct() {

return RxObservable.newClient()

.target("http://api.icndb.com").path("jokes/random").request(MediaType.APPLICATION_JSON_TYPE)

.rx().get()

.map(response -> {

Map<String, Map<String, String>> json = response.readEntity(Map.class);

return json.get("value").get("joke");

});

}

}

}
FALLBACK JOKES
@RequestScoped

public class IcndbIntegration implements IChuckNorrisJokes {
@Inject @Named("chucknorrisjoke-chucknorrisio")

private IChuckNorrisJokes fallback;
@Override public Observable<String> getRandomJokeObservable() { 

return new IcndbIntegrationCommand().observe();
}



//…



private class IcndbIntegrationCommand extends HystrixObservableCommand<String> {



//…



@Override

protected Observable<String> resumeWithFallback() {

return fallback.getRandomJokeObservable();

}

}

}
MONITORING &
DIAGNOSABILITYCOLLECT, STORE, ANALYZE METRICS
COLLECT, STORE, ANALYZE LOGS
COLLECT, STORE, ANALYZE TRACES
DASHBOARDING & ALERTING
THE MAGIC DIAGNOSABILITY TRIANGLE
Metrics
Logs Traces
Cluster-wide

Diagnosis
DIAGNOSABILITY BIG PICTURE
DROPWIZARD
METRICS
JERSEY
HYSTRIX
SLF4J
MICRO
SERVICE
PROMETHEUS
SERVLET
METRICS
SERVLET
HYSTRIX
SERVLET
Dashboard / Turbine
Health 

Checks
Service

Lookup
INSTRUMENTING THE MICROSERVICE WITH DROPWIZARD METRICS
@ApplicationPath("/chuck")

public class ChuckJokeApplication extends ResourceConfig {

public ChuckJokeApplication() {

super();

//Instrument application with metrics

MetricRegistry METRIC_REGISTRY = MetricsProvider.getMetricRegistryInstance();

register(new InstrumentedResourceMethodApplicationListener(METRIC_REGISTRY));

HystrixPlugins.getInstance().registerMetricsPublisher(

new HystrixCodaHaleMetricsPublisher(METRIC_REGISTRY));

//Register Prometheus metric exporter

CollectorRegistry.defaultRegistry.register(new DropwizardExports(METRIC_REGISTRY));

}

}
Instrument
inbound REST
calls
Instrument
outbound REST
calls
Export all
metrics to
Prometheus
Obtain the
singleton
Metric Registry
HYSTRIX DASHBOARD
SERVICE DISCOVERYSERVICE REGISTRATION
SERVICE LOOKUP
SERVICE HEALTH CHECKING
& API GATEWAYAPI EXPOSITION & REQUEST ROUTING
AUTHENTICATION & AUTORISATION
LOAD BALANCING & SHEDDING
RATE LIMITING
REQUEST MONITORING & AUDITING
THE BIG PICTURE
MICRO
SERVICE
SERVICE DISCOVERY
register 

web-facing 

services
lookup 

internal 

endpoints
web requests
lookup routes
API GATEWAY
health

checks (metrics servlet)
java.security.Security.setProperty("networkaddress.cache.ttl", "0" );
SERVICE REGISTRATION WITHIN A JEE MICROSERVICE
@ApplicationPath("/chuck")

public class ChuckJokeApplication extends ResourceConfig {



@Inject

public ChuckJokeApplication(

@ConsulFabio IServiceDiscovery serviceDiscovery) {

super();

//Register service

serviceDiscovery.registerService(
"zwitscher-chuck", "/chuck/joke");

}

} Service Name URL Path to Service
SERVICE REGISTRATION: THE HEAVY LIFTING
/**

* Registeres a service

*

* see https://github.com/eBay/fabio/wiki/Service-Configuration

*/

public synchronized void registerService(String serviceName, String servicePath) {



String applicationHost = getOutboundHost();

int applicationPort = getOutboundPort();

HostAndPort consulEndpoint = getConsulHostAndPort();

logger.info("Will register service on host {} and port {} at consul endpoint {}",

applicationHost, applicationPort, consulEndpoint.toString());



//generate unique serviceId

String serviceId = serviceName + "-" + applicationHost + ":" + applicationPort;

String fabioServiceTag = "urlprefix-" + servicePath;



//point healthcheck URL to dropwizard metrics healthcheck servlet

URL serviceUrl = UrlBuilder.empty()

.withScheme("http")

.withHost(applicationHost)

.withPort(applicationPort)

.withPath("/metrics/ping").toUrl();



// Service bei Consul registrieren inklusive einem Health-Check auf die URL des REST-Endpunkts.

logger.info("Registering service with ID {} and NAME {} with healthcheck URL {} and inbound ROUTE {}",

serviceId, serviceName, serviceUrl, fabioServiceTag);



//use consul API to register service

ConsulClient client = new ConsulClient(consulEndpoint.toString());

NewService service = new NewService();

service.setId(serviceId);

service.setName(serviceName);

service.setPort(applicationPort);

service.setAddress(applicationHost);

List<String> tags = new ArrayList<>();

tags.add(fabioServiceTag);

service.setTags(tags);

//register health check

NewService.Check check = new NewService.Check();

check.setHttp(serviceUrl.toString());

check.setInterval(ConsulFabioServiceDiscovery.HEALTHCHECK_INTERVAL + "s");

service.setCheck(check);

client.agentServiceRegister(service);

}



public static String getOutboundHost() {

String hostName = System.getenv(HOSTNAME_ENVVAR);

String host = System.getenv(HOST_ENVVAR);

if (hostName == null && host == null) return DEFAULT_HOST;

else if (host != null) return host;

else {

File etcHosts = new File("/etc/hosts");

List<String> lines;

try {

lines = Files.readLines(etcHosts, Charset.defaultCharset());

} catch (IOException e) {

return DEFAULT_HOST;

}

for (String line: lines){

if (!line.trim().startsWith("#") && !line.trim().isEmpty()) {

String[] etcEntry = line.split("s+");

if (etcEntry[1].equals(hostName)) return etcEntry[0];

}

}

return DEFAULT_HOST;

}

}



public static int getOutboundPort() {

String portEnv = System.getenv(PORT_ENVVAR);

if (portEnv == null) return DEFAULT_PORT;

return Integer.valueOf(portEnv);

}



public static HostAndPort getConsulHostAndPort() {

String consulEnv = System.getenv(CONSUL_ENVVAR);

if (consulEnv == null) return HostAndPort.fromString(CONSUL_DEFAULT_HOSTANDPORT);

else return HostAndPort.fromString(consulEnv);

}
@ConsulFabio

@ApplicationScoped

public class ConsulFabioServiceDiscovery implements IServiceDiscovery {
figure out Consul-visible host name and port
compose health check
add meta data for Fabio
register service at Consul 

(as well as API doc and diagnosability endpoints)
ET VOILA: CONSUL (STARTING 3 INSTANCES)
ET VOILA: FABIO
APPOP’S VIEW
CLOUD NATIVE JEE
SELF-DELIVERING SOFTWARE
RUNNING

TESTED

SOFTWARE

INCREMENT
EVERYTHING AS CODE:
‣ codes application
‣ codes tests
‣ codes infrastructure
‣ codes delivery workflow{ }
FOCUS ON SHORT ROUND TRIPS WITH MULTIPLE RUN MODES
In-Process
Local Cluster
Remote Cluster
‣ longer round trip time
‣ but: more realistic
Group with dependencies:
Single applications:
MARATHON APP DEFINITION
{

"id": "/zwitscher",

"groups": [

{

"id": "/zwitscher/infrastructure",

"apps": [

{

"id": "consul",

"cpus": 1,

"mem": 256,

"disk": 0,

"instances": 1,

"cmd": "/bin/consul agent -server -ui -advertise=$HOST -config-dir=/config -data-dir=/tmp/consul -bootstrap-expect=1 -node=consul-server -client=0.0.0.0",

"container": {

"docker": {

"image": "gliderlabs/consul-server:0.6",

"forcePullImage": true,

"privileged": false,

"network": "HOST",

"portDefinitions": [

{ "port": 8300, "protocol": "tcp", "name": "server-rpc" },

{ "port": 8301, "protocol": "tcp", "name": "serf-lan" },

{ "port": 8302, "protocol": "tcp", "name": "serf-wan" },

{ "port": 8400, "protocol": "tcp", "name": "cli-rpc" },

{ "port": 8500, "protocol": "tcp", "name": "http-api" },

{ "port": 8600, "protocol": "udp", "name": "dns" }

],

"requirePorts" : true

}

},

"env": {

"GOMAXPROCS": "10"

},

"healthChecks": [

{

"protocol": "HTTP",

"port": 8500,

"path": "/v1/status/leader",

"intervalSeconds": 10,

"timeoutSeconds": 10,

"maxConsecutiveFailures": 3

}

]

},

{

"id": "fabio",

"cpus": 1,

"mem": 256,

"disk": 0,

"instances": 1,

"env": {

"registry_consul_addr": "consul.infrastructure.zwitscher.marathon.mesos:8500"

},

"container": {

"docker": {

"image": "magiconair/fabio:latest",

"forcePullImage": true,

"privileged": false,

"network": "HOST",

"portDefinitions": [

{ "port": 9998, "protocol": "tcp", "name": "web-ui" },

{ "port": 9999, "protocol": "tcp", "name": "proxy-port" }

],

"requirePorts" : true

}

},

"acceptedResourceRoles":["slave_public"],

"healthChecks": [

{

"protocol": "HTTP",

"port": 9998,

"path": "/health",

"intervalSeconds": 10,

"timeoutSeconds": 10,

"maxConsecutiveFailures": 3

}

]

}

]

},

{

"id": "/zwitscher/services",

"apps": [

{

"id": "zwitscher-chuck",

"cpus": 1,

"mem": 256,

"disk": 0,

"instances": 1,

"container": {

"docker": {

"image": "adersberger/zwitscher-app-chuck:1.0.0-SNAPSHOT",

"forcePullImage": true,

"privileged": false,

"network": "HOST",

"portDefinitions": [

{ "port": 12340, "protocol": "tcp", "name": "rest-api" }

],

"requirePorts" : true

}

},

"env": {

"PORT": "12340",

"CONSUL": "consul.infrastructure.zwitscher.marathon.mesos:8500",

"CONFIG_ENV" : "zwitscher"

},

"args": [

"-Xmx256m"

],

"healthChecks": [

{

"protocol": "HTTP",

"port": 12340,

"path": "/metrics/ping",

"intervalSeconds": 10,

"timeoutSeconds": 10,

"maxConsecutiveFailures": 3

}

],

"dependencies": [

"/zwitscher/infrastructure/consul"

]

}

]

}

]

}
marathon-appgroup.json
/zwitscher
/infrastructure
/consul
/fabio
/service
/zwitscher-chuck
dependency
"healthChecks": [

{

"protocol": “HTTP", "port": 9998, "path": "/health",

"intervalSeconds": 10, "timeoutSeconds": 10, "maxConsecutiveFailures": 3

}

]
Define health checks for every app:
"network": "HOST",

"ports": [9998, 9999],

"requirePorts" : true
HOST networking (so that Mesos-DNS works) with fixed ports:
"acceptedResourceRoles":["slave_public"]
Run API gateway on public slave (accessible from www):
"env": {

"PORT": "12340",

"CONSUL": "consul.infrastructure.zwitscher.marathon.mesos:8500"

},

"args": ["-Xmx256m"]
Configuration @ startup with env vars and args:
"container": { "docker": {

"image": "adersberger/zwitscher-app-chuck:1.0.0-SNAPSHOT",

"forcePullImage": true
forcePullImage = true to get the latest pushed docker image:
"dependencies": [ "/zwitscher/infrastructure/consul"]
Yes, sometimes you need dependencies (but you should avoid them to get more resilient):
SUMMARY
CLOUD NATIVE JEE
CLOUD NATIVE JEE 101
SUMMARY
▸ Implementing JEE microservices on DC/OS is simple & fun.
▸ The JEE APIs are out of the box not cloud native but can easily be
enhanced with the required functionality. You can use our
JCloudEE util classes to glue JEE together with cloud native tech.









▸ Short round trip times are essential to be productive. You need
full portability and automation from local host up to the cloud.
FUN!
CLOUD NATIVE JEE
https://github.com/qaware/kubepad
‣ First things first: Will be renamed to 

CloudPad soon!
‣ Controlling a DC/OS cluster 

with a DJ pad.
‣ Written in fancy Kotlin.
‣ Turned out to be really helpful for cloud
native newbies to better grasp cluster
orchestration.
‣ Kicky colored lights and well-hidden
snake game easter egg. Set colors with
app label.
MESSAGING
JEE ON DC/OS 201
SNEAK PREVIEW
SECURITY
WEB USER
INTERFACE
STATEFUL
SERVICES
TWITTER.COM/QAWARE - SLIDESHARE.NET/QAWARE
Thank you!
Questions?
josef.adersberger@qaware.de
@adersberger
https://github.com/adersberger/cloud-native-zwitscher-jee
BONUS SLIDES
CONFIGURATION
& COORDINATIONKEY-VALUE STORE
NOTIFICATIONS, EVENTS
LOCKS
LEADER ELECTIONS
READING CONFIGURATION VALUES
@Inject

private ConfigurationProvider config;

//…

String messageTag = config.getProperty("messageTag", String.class);
try to read config value in
Consul
fallback to file if Consul is
not available or no config
value is set in Consul
THE CONSUL AGENT AND CONFIG ENVIRONMENT CAN BE SET
WITH A ENV VAR.
"env": {

"CONFIG_ENV" : "zwitscher"

}
The config environment (e.g. “zwitscher”, “zwitscher-test”, “zwitscher-prod”). Refers to 

a path in Consul or to a local path where the config file is.
MONITORING &
DIAGNOSABILITYCOLLECT, STORE, ANALYZE METRICS
COLLECT, STORE, ANALYZE LOGS
COLLECT, STORE, ANALYZE TRACES
DASHBOARDING & ALERTING
CUSTOM INSTRUMENTATIONS
▸ Logging



▸ Business Metrics







▸ Timers
@Inject

private Logger logger;
@ApplicationScoped

public class Slf4jLoggerProvider {



@Produces

public Logger produceLogger(InjectionPoint injectionPoint) {

return LoggerFactory.getLogger(

injectionPoint.getMember()
.getDeclaringClass()
.getName());

}



}
@Inject

MetricRegistry metrics;



//…



metrics.counter("fun counter").inc();
@GET

@Timed

@Produces("application/json")

public Response getJoke() { //…

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

Introduction to Kubernetes Security (Aqua & Weaveworks)
Introduction to Kubernetes Security (Aqua & Weaveworks)Introduction to Kubernetes Security (Aqua & Weaveworks)
Introduction to Kubernetes Security (Aqua & Weaveworks)
 
Oded Coster - Stack Overflow behind the scenes - how it's made - Codemotion M...
Oded Coster - Stack Overflow behind the scenes - how it's made - Codemotion M...Oded Coster - Stack Overflow behind the scenes - how it's made - Codemotion M...
Oded Coster - Stack Overflow behind the scenes - how it's made - Codemotion M...
 
GIDS_what does_cloud-native_mean_anyway?
GIDS_what does_cloud-native_mean_anyway?GIDS_what does_cloud-native_mean_anyway?
GIDS_what does_cloud-native_mean_anyway?
 
CI / CD / CS - Continuous Security in Kubernetes
CI / CD / CS - Continuous Security in KubernetesCI / CD / CS - Continuous Security in Kubernetes
CI / CD / CS - Continuous Security in Kubernetes
 
Clean Infrastructure as Code
Clean Infrastructure as CodeClean Infrastructure as Code
Clean Infrastructure as Code
 
Deploying Cloud Native Red Team Infrastructure with Kubernetes, Istio and Envoy
Deploying Cloud Native Red Team Infrastructure with Kubernetes, Istio and Envoy Deploying Cloud Native Red Team Infrastructure with Kubernetes, Istio and Envoy
Deploying Cloud Native Red Team Infrastructure with Kubernetes, Istio and Envoy
 
Improving security with Istio | DevNation Tech Talk
Improving security with Istio | DevNation Tech TalkImproving security with Istio | DevNation Tech Talk
Improving security with Istio | DevNation Tech Talk
 
Everything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPLEverything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPL
 
Efficient DevOps Tooling with Java and GraalVM
Efficient DevOps Tooling with Java and GraalVMEfficient DevOps Tooling with Java and GraalVM
Efficient DevOps Tooling with Java and GraalVM
 
Cloud Compliance with Open Policy Agent
Cloud Compliance with Open Policy AgentCloud Compliance with Open Policy Agent
Cloud Compliance with Open Policy Agent
 
Zombies in Kubernetes
Zombies in KubernetesZombies in Kubernetes
Zombies in Kubernetes
 
What’s New in Spring Batch?
What’s New in Spring Batch?What’s New in Spring Batch?
What’s New in Spring Batch?
 
Lessons learned from writing over 300,000 lines of infrastructure code
Lessons learned from writing over 300,000 lines of infrastructure codeLessons learned from writing over 300,000 lines of infrastructure code
Lessons learned from writing over 300,000 lines of infrastructure code
 
Kubernetes security
Kubernetes securityKubernetes security
Kubernetes security
 
Running Kubernetes in Kubernetes
Running Kubernetes in KubernetesRunning Kubernetes in Kubernetes
Running Kubernetes in Kubernetes
 
Kubernetes - Security Journey
Kubernetes - Security JourneyKubernetes - Security Journey
Kubernetes - Security Journey
 
Kubernetes Security
Kubernetes SecurityKubernetes Security
Kubernetes Security
 
Bandit and Gosec - Security Linters
Bandit and Gosec - Security LintersBandit and Gosec - Security Linters
Bandit and Gosec - Security Linters
 
Control Plane: Continuous Kubernetes Security (DevSecOps - London Gathering, ...
Control Plane: Continuous Kubernetes Security (DevSecOps - London Gathering, ...Control Plane: Continuous Kubernetes Security (DevSecOps - London Gathering, ...
Control Plane: Continuous Kubernetes Security (DevSecOps - London Gathering, ...
 
SRE & Kubernetes
SRE & KubernetesSRE & Kubernetes
SRE & Kubernetes
 

Destaque

Secure Architecture and Programming 101
Secure Architecture and Programming 101Secure Architecture and Programming 101
Secure Architecture and Programming 101
QAware GmbH
 

Destaque (20)

Microservices @ Work - A Practice Report of Developing Microservices
Microservices @ Work - A Practice Report of Developing MicroservicesMicroservices @ Work - A Practice Report of Developing Microservices
Microservices @ Work - A Practice Report of Developing Microservices
 
Per Anhalter durch den Cloud Native Stack (extended edition)
Per Anhalter durch den Cloud Native Stack (extended edition)Per Anhalter durch den Cloud Native Stack (extended edition)
Per Anhalter durch den Cloud Native Stack (extended edition)
 
Lightweight developer provisioning with gradle and seu as-code
Lightweight developer provisioning with gradle and seu as-codeLightweight developer provisioning with gradle and seu as-code
Lightweight developer provisioning with gradle and seu as-code
 
Automotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache SolrAutomotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache Solr
 
Leveraging the Power of Solr with Spark
Leveraging the Power of Solr with SparkLeveraging the Power of Solr with Spark
Leveraging the Power of Solr with Spark
 
Secure Architecture and Programming 101
Secure Architecture and Programming 101Secure Architecture and Programming 101
Secure Architecture and Programming 101
 
Der Cloud Native Stack in a Nutshell
Der Cloud Native Stack in a NutshellDer Cloud Native Stack in a Nutshell
Der Cloud Native Stack in a Nutshell
 
Automotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache SolrAutomotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache Solr
 
Vamp - The anti-fragilitiy platform for digital services
Vamp - The anti-fragilitiy platform for digital servicesVamp - The anti-fragilitiy platform for digital services
Vamp - The anti-fragilitiy platform for digital services
 
Azure Functions - Get rid of your servers, use functions!
Azure Functions - Get rid of your servers, use functions!Azure Functions - Get rid of your servers, use functions!
Azure Functions - Get rid of your servers, use functions!
 
A Hitchhiker's Guide to the Cloud Native Stack
A Hitchhiker's Guide to the Cloud Native StackA Hitchhiker's Guide to the Cloud Native Stack
A Hitchhiker's Guide to the Cloud Native Stack
 
Developing Skills for Amazon Echo
Developing Skills for Amazon EchoDeveloping Skills for Amazon Echo
Developing Skills for Amazon Echo
 
Chronix as Long-Term Storage for Prometheus
Chronix as Long-Term Storage for PrometheusChronix as Long-Term Storage for Prometheus
Chronix as Long-Term Storage for Prometheus
 
Everything-as-code. Polyglotte Software-Entwicklung in der Praxis.
Everything-as-code. Polyglotte Software-Entwicklung in der Praxis.Everything-as-code. Polyglotte Software-Entwicklung in der Praxis.
Everything-as-code. Polyglotte Software-Entwicklung in der Praxis.
 
Hands-on K8s: Deployments, Pods and Fun
Hands-on K8s: Deployments, Pods and FunHands-on K8s: Deployments, Pods and Fun
Hands-on K8s: Deployments, Pods and Fun
 
Kubernetes 101 and Fun
Kubernetes 101 and FunKubernetes 101 and Fun
Kubernetes 101 and Fun
 
Cloud Native Unleashed
Cloud Native UnleashedCloud Native Unleashed
Cloud Native Unleashed
 
Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017
Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017
Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017
 
Die Leichtigkeit des Seins: Bindings für Eclipse SmartHome entwickeln
Die Leichtigkeit des Seins: Bindings für Eclipse SmartHome entwickelnDie Leichtigkeit des Seins: Bindings für Eclipse SmartHome entwickeln
Die Leichtigkeit des Seins: Bindings für Eclipse SmartHome entwickeln
 
Clickstream Analysis with Spark - Understanding Visitors in Real Time
Clickstream Analysis with Spark - Understanding Visitors in Real TimeClickstream Analysis with Spark - Understanding Visitors in Real Time
Clickstream Analysis with Spark - Understanding Visitors in Real Time
 

Semelhante a JEE on DC/OS - MesosCon Europe

Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Engine
catherinewall
 

Semelhante a JEE on DC/OS - MesosCon Europe (20)

Arquitecturas de microservicios - Medianet Software
Arquitecturas de microservicios   -  Medianet SoftwareArquitecturas de microservicios   -  Medianet Software
Arquitecturas de microservicios - Medianet Software
 
Clean Architecture @ Taxibeat
Clean Architecture @ TaxibeatClean Architecture @ Taxibeat
Clean Architecture @ Taxibeat
 
Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Engine
 
Hybrid Applications
Hybrid ApplicationsHybrid Applications
Hybrid Applications
 
Real World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS ApplicationReal World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS Application
 
Debugging Microservices - QCON 2017
Debugging Microservices - QCON 2017Debugging Microservices - QCON 2017
Debugging Microservices - QCON 2017
 
Dropwizard Introduction
Dropwizard IntroductionDropwizard Introduction
Dropwizard Introduction
 
Кирилл Толкачев. Микросервисы: огонь, вода и девопс
Кирилл Толкачев. Микросервисы: огонь, вода и девопсКирилл Толкачев. Микросервисы: огонь, вода и девопс
Кирилл Толкачев. Микросервисы: огонь, вода и девопс
 
Docker & ECS: Secure Nearline Execution
Docker & ECS: Secure Nearline ExecutionDocker & ECS: Secure Nearline Execution
Docker & ECS: Secure Nearline Execution
 
8 - OpenShift - A look at a container platform: what's in the box
8 - OpenShift - A look at a container platform: what's in the box8 - OpenShift - A look at a container platform: what's in the box
8 - OpenShift - A look at a container platform: what's in the box
 
Cloud nativemicroservices jax-london2020
Cloud nativemicroservices   jax-london2020Cloud nativemicroservices   jax-london2020
Cloud nativemicroservices jax-london2020
 
Cloud nativemicroservices jax-london2020
Cloud nativemicroservices   jax-london2020Cloud nativemicroservices   jax-london2020
Cloud nativemicroservices jax-london2020
 
Bringing order to the chaos! - Paulo Lopes - Codemotion Amsterdam 2018
Bringing order to the chaos! - Paulo Lopes - Codemotion Amsterdam 2018Bringing order to the chaos! - Paulo Lopes - Codemotion Amsterdam 2018
Bringing order to the chaos! - Paulo Lopes - Codemotion Amsterdam 2018
 
GeeCON 2017 - TestContainers. Integration testing without the hassle
GeeCON 2017 - TestContainers. Integration testing without the hassleGeeCON 2017 - TestContainers. Integration testing without the hassle
GeeCON 2017 - TestContainers. Integration testing without the hassle
 
Real World Lessons on the Pain Points of Node.js Applications
Real World Lessons on the Pain Points of Node.js ApplicationsReal World Lessons on the Pain Points of Node.js Applications
Real World Lessons on the Pain Points of Node.js Applications
 
Easing offline web application development with GWT
Easing offline web application development with GWTEasing offline web application development with GWT
Easing offline web application development with GWT
 
"JavaME + Android in action" CCT-CEJUG Dezembro 2008
"JavaME + Android in action" CCT-CEJUG Dezembro 2008"JavaME + Android in action" CCT-CEJUG Dezembro 2008
"JavaME + Android in action" CCT-CEJUG Dezembro 2008
 
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexusMicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
 
July 2015 Android Taipei - Anti-Decompiler by SUKI
July 2015 Android Taipei - Anti-Decompiler by SUKIJuly 2015 Android Taipei - Anti-Decompiler by SUKI
July 2015 Android Taipei - Anti-Decompiler by SUKI
 
JavaFX Enterprise (JavaOne 2014)
JavaFX Enterprise (JavaOne 2014)JavaFX Enterprise (JavaOne 2014)
JavaFX Enterprise (JavaOne 2014)
 

Mais de QAware GmbH

"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
QAware GmbH
 
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
 Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See... Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
QAware GmbH
 

Mais de QAware GmbH (20)

50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf
 
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
 
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN MainzFully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
 
Down the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile ArchitectureDown the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile Architecture
 
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
 
Make Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform EngineeringMake Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform Engineering
 
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit PlaywrightDer Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
 
Was kommt nach den SPAs
Was kommt nach den SPAsWas kommt nach den SPAs
Was kommt nach den SPAs
 
Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo
 
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
 Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See... Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
 
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
 
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
 
Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
 
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAPKontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
 
Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
 
Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.
 
Per Anhalter zu Cloud Nativen API Gateways
Per Anhalter zu Cloud Nativen API GatewaysPer Anhalter zu Cloud Nativen API Gateways
Per Anhalter zu Cloud Nativen API Gateways
 
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
 

Último

Abortion pills in Doha Qatar (+966572737505 ! Get Cytotec
Abortion pills in Doha Qatar (+966572737505 ! Get CytotecAbortion pills in Doha Qatar (+966572737505 ! Get Cytotec
Abortion pills in Doha Qatar (+966572737505 ! Get Cytotec
Abortion pills in Riyadh +966572737505 get cytotec
 
CHEAP Call Girls in Rabindra Nagar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Rabindra Nagar  (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Rabindra Nagar  (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Rabindra Nagar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
Junnasandra Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
Junnasandra Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...Junnasandra Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
Junnasandra Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
amitlee9823
 
➥🔝 7737669865 🔝▻ Dindigul Call-girls in Women Seeking Men 🔝Dindigul🔝 Escor...
➥🔝 7737669865 🔝▻ Dindigul Call-girls in Women Seeking Men  🔝Dindigul🔝   Escor...➥🔝 7737669865 🔝▻ Dindigul Call-girls in Women Seeking Men  🔝Dindigul🔝   Escor...
➥🔝 7737669865 🔝▻ Dindigul Call-girls in Women Seeking Men 🔝Dindigul🔝 Escor...
amitlee9823
 
Call Girls In Shalimar Bagh ( Delhi) 9953330565 Escorts Service
Call Girls In Shalimar Bagh ( Delhi) 9953330565 Escorts ServiceCall Girls In Shalimar Bagh ( Delhi) 9953330565 Escorts Service
Call Girls In Shalimar Bagh ( Delhi) 9953330565 Escorts Service
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
Just Call Vip call girls Mysore Escorts ☎️9352988975 Two shot with one girl (...
Just Call Vip call girls Mysore Escorts ☎️9352988975 Two shot with one girl (...Just Call Vip call girls Mysore Escorts ☎️9352988975 Two shot with one girl (...
Just Call Vip call girls Mysore Escorts ☎️9352988975 Two shot with one girl (...
gajnagarg
 
Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...
Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...
Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...
amitlee9823
 
Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...
amitlee9823
 
➥🔝 7737669865 🔝▻ malwa Call-girls in Women Seeking Men 🔝malwa🔝 Escorts Ser...
➥🔝 7737669865 🔝▻ malwa Call-girls in Women Seeking Men  🔝malwa🔝   Escorts Ser...➥🔝 7737669865 🔝▻ malwa Call-girls in Women Seeking Men  🔝malwa🔝   Escorts Ser...
➥🔝 7737669865 🔝▻ malwa Call-girls in Women Seeking Men 🔝malwa🔝 Escorts Ser...
amitlee9823
 
Just Call Vip call girls Bellary Escorts ☎️9352988975 Two shot with one girl ...
Just Call Vip call girls Bellary Escorts ☎️9352988975 Two shot with one girl ...Just Call Vip call girls Bellary Escorts ☎️9352988975 Two shot with one girl ...
Just Call Vip call girls Bellary Escorts ☎️9352988975 Two shot with one girl ...
gajnagarg
 
👉 Amritsar Call Girl 👉📞 6367187148 👉📞 Just📲 Call Ruhi Call Girl Phone No Amri...
👉 Amritsar Call Girl 👉📞 6367187148 👉📞 Just📲 Call Ruhi Call Girl Phone No Amri...👉 Amritsar Call Girl 👉📞 6367187148 👉📞 Just📲 Call Ruhi Call Girl Phone No Amri...
👉 Amritsar Call Girl 👉📞 6367187148 👉📞 Just📲 Call Ruhi Call Girl Phone No Amri...
karishmasinghjnh
 
Just Call Vip call girls roorkee Escorts ☎️9352988975 Two shot with one girl ...
Just Call Vip call girls roorkee Escorts ☎️9352988975 Two shot with one girl ...Just Call Vip call girls roorkee Escorts ☎️9352988975 Two shot with one girl ...
Just Call Vip call girls roorkee Escorts ☎️9352988975 Two shot with one girl ...
gajnagarg
 
Call Girls In Nandini Layout ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Nandini Layout ☎ 7737669865 🥵 Book Your One night StandCall Girls In Nandini Layout ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Nandini Layout ☎ 7737669865 🥵 Book Your One night Stand
amitlee9823
 
Call Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service BangaloreCall Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
amitlee9823
 
Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...
amitlee9823
 

Último (20)

Abortion pills in Doha Qatar (+966572737505 ! Get Cytotec
Abortion pills in Doha Qatar (+966572737505 ! Get CytotecAbortion pills in Doha Qatar (+966572737505 ! Get Cytotec
Abortion pills in Doha Qatar (+966572737505 ! Get Cytotec
 
CHEAP Call Girls in Rabindra Nagar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Rabindra Nagar  (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Rabindra Nagar  (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Rabindra Nagar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Junnasandra Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
Junnasandra Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...Junnasandra Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
Junnasandra Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
 
Detecting Credit Card Fraud: A Machine Learning Approach
Detecting Credit Card Fraud: A Machine Learning ApproachDetecting Credit Card Fraud: A Machine Learning Approach
Detecting Credit Card Fraud: A Machine Learning Approach
 
5CL-ADBA,5cladba, Chinese supplier, safety is guaranteed
5CL-ADBA,5cladba, Chinese supplier, safety is guaranteed5CL-ADBA,5cladba, Chinese supplier, safety is guaranteed
5CL-ADBA,5cladba, Chinese supplier, safety is guaranteed
 
➥🔝 7737669865 🔝▻ Dindigul Call-girls in Women Seeking Men 🔝Dindigul🔝 Escor...
➥🔝 7737669865 🔝▻ Dindigul Call-girls in Women Seeking Men  🔝Dindigul🔝   Escor...➥🔝 7737669865 🔝▻ Dindigul Call-girls in Women Seeking Men  🔝Dindigul🔝   Escor...
➥🔝 7737669865 🔝▻ Dindigul Call-girls in Women Seeking Men 🔝Dindigul🔝 Escor...
 
Call Girls In Shalimar Bagh ( Delhi) 9953330565 Escorts Service
Call Girls In Shalimar Bagh ( Delhi) 9953330565 Escorts ServiceCall Girls In Shalimar Bagh ( Delhi) 9953330565 Escorts Service
Call Girls In Shalimar Bagh ( Delhi) 9953330565 Escorts Service
 
Just Call Vip call girls Mysore Escorts ☎️9352988975 Two shot with one girl (...
Just Call Vip call girls Mysore Escorts ☎️9352988975 Two shot with one girl (...Just Call Vip call girls Mysore Escorts ☎️9352988975 Two shot with one girl (...
Just Call Vip call girls Mysore Escorts ☎️9352988975 Two shot with one girl (...
 
Digital Advertising Lecture for Advanced Digital & Social Media Strategy at U...
Digital Advertising Lecture for Advanced Digital & Social Media Strategy at U...Digital Advertising Lecture for Advanced Digital & Social Media Strategy at U...
Digital Advertising Lecture for Advanced Digital & Social Media Strategy at U...
 
Thane Call Girls 7091864438 Call Girls in Thane Escort service book now -
Thane Call Girls 7091864438 Call Girls in Thane Escort service book now -Thane Call Girls 7091864438 Call Girls in Thane Escort service book now -
Thane Call Girls 7091864438 Call Girls in Thane Escort service book now -
 
Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...
Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...
Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...
 
Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...
 
➥🔝 7737669865 🔝▻ malwa Call-girls in Women Seeking Men 🔝malwa🔝 Escorts Ser...
➥🔝 7737669865 🔝▻ malwa Call-girls in Women Seeking Men  🔝malwa🔝   Escorts Ser...➥🔝 7737669865 🔝▻ malwa Call-girls in Women Seeking Men  🔝malwa🔝   Escorts Ser...
➥🔝 7737669865 🔝▻ malwa Call-girls in Women Seeking Men 🔝malwa🔝 Escorts Ser...
 
Just Call Vip call girls Bellary Escorts ☎️9352988975 Two shot with one girl ...
Just Call Vip call girls Bellary Escorts ☎️9352988975 Two shot with one girl ...Just Call Vip call girls Bellary Escorts ☎️9352988975 Two shot with one girl ...
Just Call Vip call girls Bellary Escorts ☎️9352988975 Two shot with one girl ...
 
(NEHA) Call Girls Katra Call Now 8617697112 Katra Escorts 24x7
(NEHA) Call Girls Katra Call Now 8617697112 Katra Escorts 24x7(NEHA) Call Girls Katra Call Now 8617697112 Katra Escorts 24x7
(NEHA) Call Girls Katra Call Now 8617697112 Katra Escorts 24x7
 
👉 Amritsar Call Girl 👉📞 6367187148 👉📞 Just📲 Call Ruhi Call Girl Phone No Amri...
👉 Amritsar Call Girl 👉📞 6367187148 👉📞 Just📲 Call Ruhi Call Girl Phone No Amri...👉 Amritsar Call Girl 👉📞 6367187148 👉📞 Just📲 Call Ruhi Call Girl Phone No Amri...
👉 Amritsar Call Girl 👉📞 6367187148 👉📞 Just📲 Call Ruhi Call Girl Phone No Amri...
 
Just Call Vip call girls roorkee Escorts ☎️9352988975 Two shot with one girl ...
Just Call Vip call girls roorkee Escorts ☎️9352988975 Two shot with one girl ...Just Call Vip call girls roorkee Escorts ☎️9352988975 Two shot with one girl ...
Just Call Vip call girls roorkee Escorts ☎️9352988975 Two shot with one girl ...
 
Call Girls In Nandini Layout ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Nandini Layout ☎ 7737669865 🥵 Book Your One night StandCall Girls In Nandini Layout ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Nandini Layout ☎ 7737669865 🥵 Book Your One night Stand
 
Call Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service BangaloreCall Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
 
Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...
 

JEE on DC/OS - MesosCon Europe

  • 1. JEE ON DC/OS 101 AND FUN Dr. Josef Adersberger ( @adersberger)
  • 2. DC/OS = #GIFEE Google’s
 (and Facebook’s, Twitter’s, Airbnb’s, …)
 Infrastructure
 For
 Everyone
 Else
  • 3. #GIFEE => Cloud Native Applications
 (apps like Google’s, Facebook’s, …)
  • 4.
  • 5.
  • 7.
  • 8. The second largest monolith on earth!* *) only beaten by the guys who are writing PHP code at large scale
  • 10. JEE IS NEITHER UGLY NOR FOCUSED ON MONOLITHIC APPS ▸ Java EE by itself is modular und lightweight in the recent versions.
 (to be honest: Spring feels more heavyweight than JEE to me from time to time) ▸ Java EE micro containers allow to modularize applications into self-contained runnable units. ▸ How to develop enterprise applications based on Java EE is well understood and knowledge is widespread. ▸ API is mature and standardized. Implementations are battle proven.
  • 12.
  • 14. JEE IS NOT AN OVERALL MONOLITH. BUT PEOPLE TEND TO RUN JEE APPS AS MONOLITHS WITHIN HEAVY WEIGHT APP SERVERS. DESIGN CODE RUN startup-cluster.sh JEE Impl. JEE App Server
  • 15. JEE MICRO CONTAINER TO THE RESCUE: ENABLING MICROSERVICES ON JEE DESIGN CODE RUN main() JEE impl. parts
  • 16. A CLOUD OF JEE MICRO CONTAINERS. MISSION ACCOMPLISHED? image: https://www.dreamstime.com
  • 17. a cloud is not nothing! what’s inside our cloud?
  • 18. THE CLOUD NATIVE STACK CLOUD NATIVE STACK JEE MICROSERVICES
  • 19. CLUSTER VIRTUALIZATION (computing, network, storage, memory) CLUSTER RESOURCE MANAGER CLUSTER ORCHESTRATOR APPLICATIONS CONTAINER CLUSTER RESOURCES MICROSERVICE PLATFORM
 API Gateway Micro Container Configuration & Coordination Diagnosability &
 Monitoring Infrastructure-as-a-Service Bare Metal Local Host Service
 Client Service Discovery DevOps Interface ‣ deploy ‣ rollback ‣ scale ‣ configure Diagnose Interface ‣ analyze logs ‣ analyze metrics ‣ analyze traces Edge Interface ‣ request service ‣ authenticate
  • 20. CLUSTER VIRTUALIZATION (computing, network, storage, memory) CLUSTER RESOURCE MANAGER CLUSTER ORCHESTRATOR APPLICATIONS CONTAINER CLUSTER RESOURCES MICROSERVICE PLATFORM
 API Gateway Micro Container Configuration & Coordination Diagnosability &
 Monitoring Infrastructure-as-a-Service Bare Metal Local Host Service
 Client Service Discovery DevOps Interface ‣ deploy ‣ rollback ‣ scale ‣ configure Diagnose Interface ‣ analyze logs ‣ analyze metrics ‣ analyze traces Edge Interface ‣ request service ‣ authenticate how to provide the right resources for container execution? how to decouple from physical hardware? how to run (containerized) applications on a cluster? how to detect and solve operational anomalies? how to call other microservices resilient and responsive? how to execute a microservice and embed it within the platform? how to provide cluster-wide consensus on config values etc.? how to expose microservice endpoints to the internet? how to manage microservice endpoints within the whole platform?
  • 22. CLUSTER VIRTUALIZATION (computing, network, storage, memory) CLUSTER RESOURCE MANAGER CLUSTER ORCHESTRATOR APPLICATIONS CONTAINER CLUSTER RESOURCES MICROSERVICE PLATFORM
 API Gateway Micro Container Configuration & Coordination Diagnosability &
 Monitoring Infrastructure-as-a-Service Bare Metal Local Host Service
 Client Service Discovery DevOps Interface Diagnose InterfaceEdge Interface
  • 23. THE ZWITSCHER JEE SHOWCASE ZWITSCHER-APP-HISTORY ZWITSCHER-APP-WIKIPEDIAZWITSCHER-APP-CHUCK ZWITSCHER-APP-BOARD keyword results + keyword history random joke
 (because every chuck norris joke matches on every keyword) JDBC Open API ZWITSCHER-APP-CHUCK fallback https://github.com/adersberger/cloud-native-zwitscher-jee
  • 26. THE JEE MICRO CONTAINER ECOSYSTEM http://wildfly-swarm.io https://ee.kumuluz.com http://microprofile.io (to come) http://tomee.apache.org http://www.payara.fish/payara_micro EMBEDDED implements (unstable)
  • 27. JEE MICRO CONTAINER COMPARISON CHART Payara Micro Wildfly Swarm TomEE+ kumuluzEE Servlets et al. x x x x WebSockets x x x JSF x x x JAX-RS x x x x JAX-WS x x EJB *2 x x x CDI x x x x JTA x x x JCA x x JMS x x JPA x x x x Bean Validation x x x x JBatch x x Concurrency x x JCache x x JEE version JEE 7 JEE 7 JEE 6, JEE 7 part.*1 JEE 7 part. Packaging WAR + JAR JAR JAR classes + JARs Startup time 4s 4s 2s 1s Size 57MB 83 MB 44 MB 15 MB *1) http://tomee.apache.org/javaee7-status.html *2) http://stackoverflow.com/questions/13487987/where-to-use-ejb-3-1-and-cdi
  • 28. @Path(“/joke") @RequestScoped
 public class ChuckJokeResource {
 @Inject
 private IcndbIntegration icndb;
 @GET
 @Produces("application/json")
 public Response getJoke() {
 Map<String, String> json = new HashMap<>();
 json.put("message", icndb.getRandomJoke());
 return Response.ok(json).build();
 }
 } @ApplicationPath("/chuck")
 public class ChuckJokeApplication extends ResourceConfig {
 public ChuckJokeApplication() {
 super(); register(ChuckJokeResource.class);
 }
 } JAX-RS WITH CDI bean-discovery-mode="all"
  • 29. public class Main {
 
 /**
 * Starts the microservice container.
 *
 * Requires environment variable "PORT" according
 * on what port to listen.
 *
 * @param args no arguments evaluated
 */
 public static void main(String[] args) {
 com.kumuluz.ee.EeApplication.main(args);
 }
 } JEE MICRO CONTAINER STARTUP
  • 30. TESTING @RunWith(CdiTestRunner.class)
 public class TestChuckJokeResource {
 
 @Inject
 private ChuckJokeResource chuckJokeResource;
 
 @Test
 public void testChuckJokeResource() {
 Response response = chuckJokeResource.getJoke();
 assertThat( response.getStatusInfo().getStatusCode(), equalTo(200));
 }
 }
  • 31. SERVICE CLIENTSERVICE DISCOVERY LOAD BALANCING REQUEST MONITORING CIRCUIT BREAKING
  • 32. SERVICE CLIENT WITH JERSEY, RXJAVA AND HYSTRIX ‣ Circuit Breaker (Resiliency) ‣ Request Monitoring ‣ JAX-RS 2.0 compliant REST clients‣ Parallel & async execution 
 (Responsive)
  • 33. SERVICE CLIENT WITH JERSEY, RXJAVA AND HYSTRIX @RequestScoped
 public class IcndbIntegration implements IChuckNorrisJokes {
 
 @Override public String getRandomJoke() {
 IcndbIntegrationCommand cmd = new IcndbIntegrationCommand();
 return cmd.observe().toBlocking().toFuture().get();
 }
 
 private class IcndbIntegrationCommand extends HystrixObservableCommand<String> {
 
 IcndbIntegrationCommand() {
 super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("zwitscher"))
 .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
 .withExecutionTimeoutInMilliseconds(3000)));
 }
 
 @Override protected Observable<String> construct() {
 return RxObservable.newClient()
 .target("http://api.icndb.com").path("jokes/random").request(MediaType.APPLICATION_JSON_TYPE)
 .rx().get()
 .map(response -> {
 Map<String, Map<String, String>> json = response.readEntity(Map.class);
 return json.get("value").get("joke");
 });
 }
 }
 }
  • 34. FALLBACK JOKES @RequestScoped
 public class IcndbIntegration implements IChuckNorrisJokes { @Inject @Named("chucknorrisjoke-chucknorrisio")
 private IChuckNorrisJokes fallback; @Override public Observable<String> getRandomJokeObservable() { 
 return new IcndbIntegrationCommand().observe(); }
 
 //…
 
 private class IcndbIntegrationCommand extends HystrixObservableCommand<String> {
 
 //…
 
 @Override
 protected Observable<String> resumeWithFallback() {
 return fallback.getRandomJokeObservable();
 }
 }
 }
  • 35. MONITORING & DIAGNOSABILITYCOLLECT, STORE, ANALYZE METRICS COLLECT, STORE, ANALYZE LOGS COLLECT, STORE, ANALYZE TRACES DASHBOARDING & ALERTING
  • 36. THE MAGIC DIAGNOSABILITY TRIANGLE Metrics Logs Traces Cluster-wide
 Diagnosis
  • 38. INSTRUMENTING THE MICROSERVICE WITH DROPWIZARD METRICS @ApplicationPath("/chuck")
 public class ChuckJokeApplication extends ResourceConfig {
 public ChuckJokeApplication() {
 super();
 //Instrument application with metrics
 MetricRegistry METRIC_REGISTRY = MetricsProvider.getMetricRegistryInstance();
 register(new InstrumentedResourceMethodApplicationListener(METRIC_REGISTRY));
 HystrixPlugins.getInstance().registerMetricsPublisher(
 new HystrixCodaHaleMetricsPublisher(METRIC_REGISTRY));
 //Register Prometheus metric exporter
 CollectorRegistry.defaultRegistry.register(new DropwizardExports(METRIC_REGISTRY));
 }
 } Instrument inbound REST calls Instrument outbound REST calls Export all metrics to Prometheus Obtain the singleton Metric Registry
  • 39.
  • 41. SERVICE DISCOVERYSERVICE REGISTRATION SERVICE LOOKUP SERVICE HEALTH CHECKING & API GATEWAYAPI EXPOSITION & REQUEST ROUTING AUTHENTICATION & AUTORISATION LOAD BALANCING & SHEDDING RATE LIMITING REQUEST MONITORING & AUDITING
  • 42. THE BIG PICTURE MICRO SERVICE SERVICE DISCOVERY register 
 web-facing 
 services lookup 
 internal 
 endpoints web requests lookup routes API GATEWAY health
 checks (metrics servlet) java.security.Security.setProperty("networkaddress.cache.ttl", "0" );
  • 43. SERVICE REGISTRATION WITHIN A JEE MICROSERVICE @ApplicationPath("/chuck")
 public class ChuckJokeApplication extends ResourceConfig {
 
 @Inject
 public ChuckJokeApplication(
 @ConsulFabio IServiceDiscovery serviceDiscovery) {
 super();
 //Register service
 serviceDiscovery.registerService( "zwitscher-chuck", "/chuck/joke");
 }
 } Service Name URL Path to Service
  • 44. SERVICE REGISTRATION: THE HEAVY LIFTING /**
 * Registeres a service
 *
 * see https://github.com/eBay/fabio/wiki/Service-Configuration
 */
 public synchronized void registerService(String serviceName, String servicePath) {
 
 String applicationHost = getOutboundHost();
 int applicationPort = getOutboundPort();
 HostAndPort consulEndpoint = getConsulHostAndPort();
 logger.info("Will register service on host {} and port {} at consul endpoint {}",
 applicationHost, applicationPort, consulEndpoint.toString());
 
 //generate unique serviceId
 String serviceId = serviceName + "-" + applicationHost + ":" + applicationPort;
 String fabioServiceTag = "urlprefix-" + servicePath;
 
 //point healthcheck URL to dropwizard metrics healthcheck servlet
 URL serviceUrl = UrlBuilder.empty()
 .withScheme("http")
 .withHost(applicationHost)
 .withPort(applicationPort)
 .withPath("/metrics/ping").toUrl();
 
 // Service bei Consul registrieren inklusive einem Health-Check auf die URL des REST-Endpunkts.
 logger.info("Registering service with ID {} and NAME {} with healthcheck URL {} and inbound ROUTE {}",
 serviceId, serviceName, serviceUrl, fabioServiceTag);
 
 //use consul API to register service
 ConsulClient client = new ConsulClient(consulEndpoint.toString());
 NewService service = new NewService();
 service.setId(serviceId);
 service.setName(serviceName);
 service.setPort(applicationPort);
 service.setAddress(applicationHost);
 List<String> tags = new ArrayList<>();
 tags.add(fabioServiceTag);
 service.setTags(tags);
 //register health check
 NewService.Check check = new NewService.Check();
 check.setHttp(serviceUrl.toString());
 check.setInterval(ConsulFabioServiceDiscovery.HEALTHCHECK_INTERVAL + "s");
 service.setCheck(check);
 client.agentServiceRegister(service);
 }
 
 public static String getOutboundHost() {
 String hostName = System.getenv(HOSTNAME_ENVVAR);
 String host = System.getenv(HOST_ENVVAR);
 if (hostName == null && host == null) return DEFAULT_HOST;
 else if (host != null) return host;
 else {
 File etcHosts = new File("/etc/hosts");
 List<String> lines;
 try {
 lines = Files.readLines(etcHosts, Charset.defaultCharset());
 } catch (IOException e) {
 return DEFAULT_HOST;
 }
 for (String line: lines){
 if (!line.trim().startsWith("#") && !line.trim().isEmpty()) {
 String[] etcEntry = line.split("s+");
 if (etcEntry[1].equals(hostName)) return etcEntry[0];
 }
 }
 return DEFAULT_HOST;
 }
 }
 
 public static int getOutboundPort() {
 String portEnv = System.getenv(PORT_ENVVAR);
 if (portEnv == null) return DEFAULT_PORT;
 return Integer.valueOf(portEnv);
 }
 
 public static HostAndPort getConsulHostAndPort() {
 String consulEnv = System.getenv(CONSUL_ENVVAR);
 if (consulEnv == null) return HostAndPort.fromString(CONSUL_DEFAULT_HOSTANDPORT);
 else return HostAndPort.fromString(consulEnv);
 } @ConsulFabio
 @ApplicationScoped
 public class ConsulFabioServiceDiscovery implements IServiceDiscovery { figure out Consul-visible host name and port compose health check add meta data for Fabio register service at Consul 
 (as well as API doc and diagnosability endpoints)
  • 45. ET VOILA: CONSUL (STARTING 3 INSTANCES)
  • 48. SELF-DELIVERING SOFTWARE RUNNING
 TESTED
 SOFTWARE
 INCREMENT EVERYTHING AS CODE: ‣ codes application ‣ codes tests ‣ codes infrastructure ‣ codes delivery workflow{ }
  • 49. FOCUS ON SHORT ROUND TRIPS WITH MULTIPLE RUN MODES In-Process Local Cluster Remote Cluster ‣ longer round trip time ‣ but: more realistic Group with dependencies: Single applications:
  • 50. MARATHON APP DEFINITION {
 "id": "/zwitscher",
 "groups": [
 {
 "id": "/zwitscher/infrastructure",
 "apps": [
 {
 "id": "consul",
 "cpus": 1,
 "mem": 256,
 "disk": 0,
 "instances": 1,
 "cmd": "/bin/consul agent -server -ui -advertise=$HOST -config-dir=/config -data-dir=/tmp/consul -bootstrap-expect=1 -node=consul-server -client=0.0.0.0",
 "container": {
 "docker": {
 "image": "gliderlabs/consul-server:0.6",
 "forcePullImage": true,
 "privileged": false,
 "network": "HOST",
 "portDefinitions": [
 { "port": 8300, "protocol": "tcp", "name": "server-rpc" },
 { "port": 8301, "protocol": "tcp", "name": "serf-lan" },
 { "port": 8302, "protocol": "tcp", "name": "serf-wan" },
 { "port": 8400, "protocol": "tcp", "name": "cli-rpc" },
 { "port": 8500, "protocol": "tcp", "name": "http-api" },
 { "port": 8600, "protocol": "udp", "name": "dns" }
 ],
 "requirePorts" : true
 }
 },
 "env": {
 "GOMAXPROCS": "10"
 },
 "healthChecks": [
 {
 "protocol": "HTTP",
 "port": 8500,
 "path": "/v1/status/leader",
 "intervalSeconds": 10,
 "timeoutSeconds": 10,
 "maxConsecutiveFailures": 3
 }
 ]
 },
 {
 "id": "fabio",
 "cpus": 1,
 "mem": 256,
 "disk": 0,
 "instances": 1,
 "env": {
 "registry_consul_addr": "consul.infrastructure.zwitscher.marathon.mesos:8500"
 },
 "container": {
 "docker": {
 "image": "magiconair/fabio:latest",
 "forcePullImage": true,
 "privileged": false,
 "network": "HOST",
 "portDefinitions": [
 { "port": 9998, "protocol": "tcp", "name": "web-ui" },
 { "port": 9999, "protocol": "tcp", "name": "proxy-port" }
 ],
 "requirePorts" : true
 }
 },
 "acceptedResourceRoles":["slave_public"],
 "healthChecks": [
 {
 "protocol": "HTTP",
 "port": 9998,
 "path": "/health",
 "intervalSeconds": 10,
 "timeoutSeconds": 10,
 "maxConsecutiveFailures": 3
 }
 ]
 }
 ]
 },
 {
 "id": "/zwitscher/services",
 "apps": [
 {
 "id": "zwitscher-chuck",
 "cpus": 1,
 "mem": 256,
 "disk": 0,
 "instances": 1,
 "container": {
 "docker": {
 "image": "adersberger/zwitscher-app-chuck:1.0.0-SNAPSHOT",
 "forcePullImage": true,
 "privileged": false,
 "network": "HOST",
 "portDefinitions": [
 { "port": 12340, "protocol": "tcp", "name": "rest-api" }
 ],
 "requirePorts" : true
 }
 },
 "env": {
 "PORT": "12340",
 "CONSUL": "consul.infrastructure.zwitscher.marathon.mesos:8500",
 "CONFIG_ENV" : "zwitscher"
 },
 "args": [
 "-Xmx256m"
 ],
 "healthChecks": [
 {
 "protocol": "HTTP",
 "port": 12340,
 "path": "/metrics/ping",
 "intervalSeconds": 10,
 "timeoutSeconds": 10,
 "maxConsecutiveFailures": 3
 }
 ],
 "dependencies": [
 "/zwitscher/infrastructure/consul"
 ]
 }
 ]
 }
 ]
 } marathon-appgroup.json /zwitscher /infrastructure /consul /fabio /service /zwitscher-chuck dependency "healthChecks": [
 {
 "protocol": “HTTP", "port": 9998, "path": "/health",
 "intervalSeconds": 10, "timeoutSeconds": 10, "maxConsecutiveFailures": 3
 }
 ] Define health checks for every app: "network": "HOST",
 "ports": [9998, 9999],
 "requirePorts" : true HOST networking (so that Mesos-DNS works) with fixed ports: "acceptedResourceRoles":["slave_public"] Run API gateway on public slave (accessible from www): "env": {
 "PORT": "12340",
 "CONSUL": "consul.infrastructure.zwitscher.marathon.mesos:8500"
 },
 "args": ["-Xmx256m"] Configuration @ startup with env vars and args: "container": { "docker": {
 "image": "adersberger/zwitscher-app-chuck:1.0.0-SNAPSHOT",
 "forcePullImage": true forcePullImage = true to get the latest pushed docker image: "dependencies": [ "/zwitscher/infrastructure/consul"] Yes, sometimes you need dependencies (but you should avoid them to get more resilient):
  • 52.
  • 53. CLOUD NATIVE JEE 101 SUMMARY ▸ Implementing JEE microservices on DC/OS is simple & fun. ▸ The JEE APIs are out of the box not cloud native but can easily be enhanced with the required functionality. You can use our JCloudEE util classes to glue JEE together with cloud native tech.
 
 
 
 
 ▸ Short round trip times are essential to be productive. You need full portability and automation from local host up to the cloud.
  • 55. https://github.com/qaware/kubepad ‣ First things first: Will be renamed to 
 CloudPad soon! ‣ Controlling a DC/OS cluster 
 with a DJ pad. ‣ Written in fancy Kotlin. ‣ Turned out to be really helpful for cloud native newbies to better grasp cluster orchestration. ‣ Kicky colored lights and well-hidden snake game easter egg. Set colors with app label.
  • 56.
  • 57. MESSAGING JEE ON DC/OS 201 SNEAK PREVIEW SECURITY WEB USER INTERFACE STATEFUL SERVICES
  • 58. TWITTER.COM/QAWARE - SLIDESHARE.NET/QAWARE Thank you! Questions? josef.adersberger@qaware.de @adersberger https://github.com/adersberger/cloud-native-zwitscher-jee
  • 61. READING CONFIGURATION VALUES @Inject
 private ConfigurationProvider config;
 //…
 String messageTag = config.getProperty("messageTag", String.class); try to read config value in Consul fallback to file if Consul is not available or no config value is set in Consul
  • 62. THE CONSUL AGENT AND CONFIG ENVIRONMENT CAN BE SET WITH A ENV VAR. "env": {
 "CONFIG_ENV" : "zwitscher"
 } The config environment (e.g. “zwitscher”, “zwitscher-test”, “zwitscher-prod”). Refers to 
 a path in Consul or to a local path where the config file is.
  • 63. MONITORING & DIAGNOSABILITYCOLLECT, STORE, ANALYZE METRICS COLLECT, STORE, ANALYZE LOGS COLLECT, STORE, ANALYZE TRACES DASHBOARDING & ALERTING
  • 64. CUSTOM INSTRUMENTATIONS ▸ Logging
 
 ▸ Business Metrics
 
 
 
 ▸ Timers @Inject
 private Logger logger; @ApplicationScoped
 public class Slf4jLoggerProvider {
 
 @Produces
 public Logger produceLogger(InjectionPoint injectionPoint) {
 return LoggerFactory.getLogger(
 injectionPoint.getMember() .getDeclaringClass() .getName());
 }
 
 } @Inject
 MetricRegistry metrics;
 
 //…
 
 metrics.counter("fun counter").inc(); @GET
 @Timed
 @Produces("application/json")
 public Response getJoke() { //…