Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer’s own laptop, bare metal data centres, and managed platforms such as Pivotal Cloudfoundry.

Features

Spring Cloud focuses on providing good out of box experience for typical use cases and extensibility mechanism to cover others.

  • Distributed/versioned configuration

  • Service registration and discovery

  • Routing

  • Service-to-service calls

  • Load balancing

  • Circuit Breakers

  • Global locks

  • Leadership election and cluster state

  • Distributed messaging

Unresolved directive in spring-cloud.adoc - include::../../../config/src/main/asciidoc/spring-cloud-config.adoc[]

Spring Cloud Netflix

This project provides Netflix OSS integrations for Spring Boot apps through autoconfiguration and binding to the Spring Environment and other Spring programming model idioms. With a few simple annotations you can quickly enable and configure the common patterns inside your application and build large distributed systems with battle-tested Netflix components. The patterns provided include Service Discovery (Eureka), Circuit Breaker (Hystrix), Intelligent Routing (Zuul) and Client Side Load Balancing (Ribbon).

Service Discovery: Eureka Clients

Example eureka client:

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@RestController
public class Application {

	@RequestMapping("/")
	public String home() {
		return "Hello world";
	}

	public static void main(String[] args) {
		new SpringApplicationBuilder(Application.class).web(true).run(args);
	}

}

(i.e. utterly normal Spring Boot app). Configuration is required to locate the Eureka server. Example:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8080/v2/
      default.defaultZone: http://localhost:8080/v2/

The default application name, virtual host and non-secure port are taken from the Environment is ${spring.application.name}, ${spring.application.name}.mydomain.net and ${server.port} respectively.

Service Discovery: Eureka Server

Example eureka server:

@Configuration
@EnableAutoConfiguration
@EnableEurekaServer
public class Application {

	public static void main(String[] args) {
		new SpringApplicationBuilder(Application.class).web(true).run(args);
	}

}

The server has a home page with a UI, and HTTP API endpoints per the normal Eureka functionality under /v2/*.

Eureka (apache → tomcat) see flux capacitor and google group discussion.

Circuit Breaker: Hystrix Clients

Circuit Breaker: Hystrix Dashboard

Turbine

Declarative REST Client: Feign

Client Side Load Balancer: Ribbon

External Configuration: Archaius

Router and Filter: Zuul

Spring Cloud Cluster

Spring Cloud Cluster offers a set of primitives for building "cluster" features into a distributed system. Example are leadership election, consistent storage of cluster state, global locks and one-time tokens.

Spring Platform Bus

Spring Cloud Bus links nodes of a distributed system with a lightweight message broker. This can then be used to broadcast state changes (e.g. configuration changes) or other management instructions.

Quick Start

Spring Cloud for Cloud Foundry

Integration between Cloud Foundry and Spring Cloud.

Service Broker Example

Example script to deploy and regis#ter a broker:

DOMAIN=mydomain.net
cf push app -p target/*.jar --no-start
cf env app | grep SPRING_PROFILES_ACTIVE || cf set-env app SPRING_PROFILES_ACTIVE cloud
cf env app | grep APPLICATION_DOMAIN || cf set-env app APPLICATION_DOMAIN ${DOMAIN}

cf services | grep configserver && cf bind app configserver

cf restart app
cf create-service-broker app user secure http://app.${DOMAIN}

for f in `cf curl /v2/service_plans | grep '\"guid' | sed -e 's/.*: "//' -e 's/".*//'`; do
    cf curl v2/service_plans/$f -X PUT -d '{"public":true}'
done

cf create-service app free appi

At which point you have a service called "app" and a service instance called "appi":

$ cf marketplace
OK

service        plans   description
app            free    Singleton service app
$ cf services
Getting services in org default / space development as admin...
OK

name           service        plan   bound apps
appi           app            free

Your application can define a configuration property application.domain (defaults to "cfapps.io") which will be used to construct the credentials for any app that binds to your service. Or it can define the URI directly using cloudfoundry.service.definition.metadata.uri.

You can change some other basic metadata by setting config properties:

  • cloudfoundry.service.definition.* is bound to a ServiceDefinition (defined in spring-boot-cf-service-broker) which has optional setters for plans and metadata.

  • cloudfoundry.service.broker.* is bound to an internal bean. It has optional setters for "name" (the service name), "description" (user friendly description) and "prefix" (used to create a unique id from the name).

An app which binds to your service will get credentials that contain a "uri" property linking to your service. A Spring Boot app can bind to that through the vcap.services.[service].credentials.uri environment property.

If your service also has a Eureka core dependency, and you can expose it as a Eureka service, then any service which registers with Eureka will also become a Cloud Foundry service.