Simplify Cloud Applications using 
Spring Cloud 
Ramnivas Laddad and Scott Frederick 
© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission.
Agenda 
• Spring Cloud Basics 
• Application Config Options 
• Java config 
• XML config 
• Extensibility mechanism 
• Cloud Platforms 
• Cloud Services 
• Frameworks 
• Spring Boot Integration 
2
Cloud Apps Awareness 
3
Cloud Apps Awareness 
3 
Application
Container 
Cloud Apps Awareness 
3 
Application
Container 
Cloud Apps Awareness 
3 
Application 
App Instance 
Information
Container 
Cloud Apps Awareness 
3 
Application 
Service 
App Instance 
Information
Container 
Cloud Apps Awareness 
3 
Application 
Service 
Services 
Information 
App Instance 
Information
Cloud Apps Awareness: 
Cloud Foundry Instance Information 
{ 
"limits": { 
"mem" : 512, "disk" : 1024, "fds" : 16384 
}, 
"application_version":"5e6fe3f7-6900-4af8-8376-bf3223ce886b", 
"application_name":"hello-spring-cloud", 
"application_uris":["myapp.cfapps.io"], 
"version":"5e6fe3f7-6900-4af8-8376-bf3223ce886b", 
"name":"hello-spring-cloud", 
"space_name":"development", 
"space_id":"5f629937-1821-4f48-9eb4-8c67c70c0df0", 
"instance_id":"b84fa4cd1c75431486dec1609828ae36", 
"instance_index":0, 
"host":"0.0.0.0", 
"port":63202, 
"started_at_timestamp":1401394307, 
"state_timestamp":1401394307 
} 
4 
VCAP_APPLICATION env variable
Cloud Apps Awareness: Cloud Foundry Services 
{ 
"elephantsql": [ 
{ 
"name" : "inventory-db", 
"label" : "elephantsql", 
"tags" : ["relational","Data Store","postgresql"], 
"plan" : "turtle", 
"credentials" : { 
"uri" : "postgres://user:pass@babar.elephantsql.com:5432/db", 
"max_conns" : "5" 
} 
} 
], 
"rediscloud": [ 
{ 
"name" : "rediscloud-service", 
"label" : "rediscloud", 
"tags" : ["key-value","redis","Data Store"], 
"plan" : "25mb", 
"credentials" : { 
"hostname" : "pub-redis.garantiadata.com", 
"port" : "11853", 
"password" : "pass" 
} 
} 
] 
} 
5 
VCAP_SERVICES env variable
Cloud Apps Awareness: 
Heroku Instance Information 
• Individual env variables 
! 
PORT 
12345 
! 
DYNO 
web.1 
! 
6
Cloud Apps Awareness: Heroku Services 
• One environment variable per service 
! 
HEROKU_POSTGRESQL_PURPLE_URL 
postgres://user:pass@host.amazonaws.com:5432/db 
! 
REDISCLOUD_URL 
redis://rediscloud:pass@host.garantiadata.com:19038 
REDISTOGO_URL 
redis://redistogo:pass@host.redistogo.com:9139 
7
Spring Cloud Goals 
• Abstraction over cloud services and application environment 
• Implementation for multiple cloud platforms 
• Cloud Foundry 
• Heroku 
• Local testing simulating a cloud-like environment 
• Extensibility without modifying the core code 
• Cloud Connector 
• Service Creator 
8
Using Java Config 
9
Scanning for services 
!! 
@Configuration 
@CloudScan 
public class CloudConfig { 
! 
} 
10
Scanning for services 
!! 
@Configuration 
@CloudScan 
public class CloudConfig { 
! 
} 
10
Taking over control 
@Configuration 
public class CloudConfig extends AbstractCloudConfig { 
@Bean 
public DataSource dataSource() { 
return connectionFactory().dataSource(); 
} 
! 
@Bean 
public MongoDbFactory mongoDb() { 
return connectionFactory().mongoDbFactory(); 
} 
} 
11
Taking over control: Working with specific services 
@Configuration 
public class CloudConfig extends AbstractCloudConfig { 
@Bean 
public DataSource inventoryDataSource() { 
return connectionFactory().dataSource("inventory-service"); 
} 
! 
@Bean 
public DataSource customerDataSource() { 
return connectionFactory().dataSource("customers-service"); 
} 
} 
12
Taking over control: Configuring Services 
@Configuration 
public class CloudConfig extends AbstractCloudConfig { 
@Bean 
public DataSource inventoryDataSource() { 
PoolConfig poolConfig = new PoolConfig(20, 200); 
ConnectionConfig connectionConfig = 
new ConnectionConfig("characterEncoding=UTF-8"); 
DataSourceConfig serviceConfig = 
new DataSourceConfig(poolConfig, connectionConfig); 
return connectionFactory().dataSource( 
"inventory-service", serviceConfig); 
} 
} 
13
Acquiring generic services 
@Configuration 
public class CloudConfig extends AbstractCloudConfig { 
@Bean 
public Search search() { 
return connectionFactory().service( 
"search-service", Search.class); 
} 
} 
14
Demo 
Spring Cloud on Cloud Foundry 
15
Deploy to Cloud Foundry 
$ gradle assemble 
$ cf create-service cleardb spark cities-db 
$ cf push 
16 
--- 
applications: 
- name: cities 
host: cities-s12gx 
path: build/libs/spring-boot-cities.jar 
services: 
- cities-db 
env: 
SPRING_PROFILES_ACTIVE: cloud 
http://cities-s12gx.cfapps.io/
Demo 
Spring Cloud on Heroku 
17
Deploy to Heroku 
$ heroku create cities-s12gx --stack cedar --buildpack http:// 
github.com/heroku/heroku-buildpack-java.git 
$ heroku config:set SPRING_CLOUD_APP_NAME=spring-boot-cities 
$ heroku config:set SPRING_PROFILES_ACTIVE=cloud 
$ heroku addons:add heroku-postgresql:hobby-dev 
$ git push heroku master 
18 
http://cities-s12gx.herokuapp.com/
Using XML Config 
19
Scanning for services 
20 
<cloud:service-scan/>
Taking over control 
21 
<cloud:data-source/> 
! 
<cloud:mongo-db-factory/> 
! 
...
Taking over control: Specifying services 
22 
<cloud:data-source 
service-name="inventory-service"/> 
! 
<cloud:data-source 
service-name="customers-service"/>
Taking over control: Configuring Services 
23 
<cloud:data-source service-name="inventory-service"> 
<cloud:pool pool-size="20" max-wait-time="200"/> 
<cloud:connection properties="characterEncoding=UTF-8"/> 
</cloud:data-source>
Acquiring generic services 
24 
<cloud:service service-name="search-service"/>
Acquiring generic services 
24 
<cloud:service service-name="search-service"/> 
<cloud:service service-name="search-service" 
connector-type="com.example.Search"/>
Services Supported 
• Cloud Foundry, Heroku, and Local connectors with Spring 
• MySQL, Postgres, Oracle 
• Redis 
• MongoDB 
• AMQP / RabbitMQ 
• SMTP 
• Pivotal CF connectors with Spring 
• Pivotal HD 
25
Demo 
Spring Cloud with Hadoop 
26
Explicit Cloud Config 
27 
@org.springframework.context.annotation.Configuration 
public class CloudConfig extends AbstractCloudConfig { 
@Bean 
public ConnectionFactory rabbitConnectionFactory() { 
return connectionFactory().rabbitConnectionFactory(); 
} 
@Bean 
public DataSource hawqDataSource() { 
return connectionFactory().dataSource("phd-service/hawq"); 
} ! 
@Bean 
public DataSource gemfirexdDataSource() { 
return connectionFactory().dataSource("phd-service/gemfirexd"); 
} 
@Bean 
public Configuration hadoopConfiguration() { 
return connectionFactory().service(Configuration.class); 
} 
}
Consuming Service Beans: Explicit Config 
28 
@Autowired @Qualifier("hawqDataSource") 
DataSource hawqDataSource; 
@Autowired @Qualifier(“gemfirexdDataSource") 
DataSource gemfirexdDataSource; 
! 
@Autowired ConnectionFactory rabbitConnectionFactory; 
! 
@Autowired Configuration hadoopConfiguration; 
!!
Cloud Config with Scanning 
29 
@Configuration 
@CloudScan 
public class CloudConfig { 
}
Consuming Service Beans: Explicit Config 
30 
@Autowired @Qualifier("phd-service/hawq") 
DataSource hawqDataSource; 
@Autowired @Qualifier("phd-service/gemfirexd") 
DataSource gemfirexdDataSource; 
! 
@Autowired ConnectionFactory rabbitConnectionFactory; 
! 
@Autowired Configuration hadoopConfiguration;
Spring Cloud Extensibility 
31
Axes of Extensibility 
32
Axes of Extensibility 
32 
Cloud Platform
Axes of Extensibility 
32 
Cloud Platform 
Cloud Services
Axes of Extensibility 
32 
Cloud Platform 
Cloud Services 
Framework Support
Service Connector 
Extensibility Overview 
ServiceInfo 
33 
CloudConnector ServiceConnectorCreator 
SSerevrivciec eC Cononnencetcotror
Cloud Platform Extensibility 
34 
public interface CloudConnector { 
! 
boolean isInMatchingCloud(); 
ApplicationInstanceInfo getApplicationInstanceInfo(); 
! 
List<ServiceInfo> getServiceInfos(); 
}
Registering Cloud Connector 
! 
• Add a line with the class name to 
/META-INF/services/org.springframework.cloud.CloudConnector! 
!!! 
• Cloud Foundry example:! 
org.springframework.cloud.cloudfoundry.CloudFoundryConnector 
! 
•Heroku example:! 
org.springframework.cloud.heroku.HerokuConnector 
35
Cloud Service Extensibility 
36
Cloud Service Extensibility 
36 
public interface ServiceInfo { 
public String getId(); 
}
Cloud Service Extensibility 
public interface ServiceInfoCreator<SI extends ServiceInfo, SD> { 
36 
public boolean accept(SD serviceData); 
! 
public SI createServiceInfo(SD serviceData); 
} 
public interface ServiceInfo { 
public String getId(); 
}
Registering Service Info Creators 
• Each Cloud Connector can choose any scheme it prefers 
! 
• Cloud Foundry Cloud Connector example 
/META-INF/services/org.springframework.cloud.cloudfoundry.CloudFoundryServiceInfoCreator 
37
Registering Service Info Creators 
• Each Cloud Connector can choose any scheme it prefers 
! 
• Cloud Foundry Cloud Connector example 
/META-INF/services/org.springframework.cloud.cloudfoundry.CloudFoundryServiceInfoCreator 
37 
org.springframework.cloud.cloudfoundry.MysqlServiceInfoCreator 
org.springframework.cloud.cloudfoundry.PostgresqlServiceInfoCreator 
org.springframework.cloud.cloudfoundry.RedisServiceInfoCreator 
org.springframework.cloud.cloudfoundry.MongoServiceInfoCreator 
org.springframework.cloud.cloudfoundry.AmqpServiceInfoCreator 
org.springframework.cloud.cloudfoundry.MonitoringServiceInfoCreator 
org.springframework.cloud.cloudfoundry.SmtpServiceInfoCreator 
org.springframework.cloud.cloudfoundry.OracleServiceInfoCreator
Framework extensibility 
• Mapping ServiceInfo to framework-specific service connector 
• RelationalServiceInfo -> DataSource 
• MongoServiceInfo -> MongoDbFactory 
• ... 
38 
public interface ServiceConnectorCreator<SC, SI extends ServiceInfo> { 
! 
SC create(SI serviceInfo, ServiceConnectorConfig serviceConnectorConfig); 
Class<SC> getServiceConnectorType(); 
! 
Class<?> getServiceInfoType(); 
}
Framework extensibility registration 
• Each framework may choose any mechanism! 
! 
• Spring Connection Creator example! 
/META-INF/services/org.springframework.cloud.service.ServiceConnectorCreator 
39
Framework extensibility registration 
• Each framework may choose any mechanism! 
! 
• Spring Connection Creator example! 
/META-INF/services/org.springframework.cloud.service.ServiceConnectorCreator 
39 
org.springframework.cloud.service.relational.MysqlDataSourceCreator 
org.springframework.cloud.service.relational.PostgresqlDataSourceCreator 
org.springframework.cloud.service.relational.OracleDataSourceCreator 
org.springframework.cloud.service.keyval.RedisConnectionFactoryCreator 
org.springframework.cloud.service.document.MongoDbFactoryCreator 
org.springframework.cloud.service.messaging.RabbitConnectionFactoryCreator 
org.springframework.cloud.service.smtp.MailSenderCreator
Demo 
Spring Cloud to Consume a Microservice 
40
Deploy to Cloud Foundry 
$ gradle assemble 
$ cf create-user-provided-service cities-ws 
-p '{"url": "http://cities-s12gx.cfapps.io/", "tag": "cities"}' 
$ cf push 
41 
--- 
applications: 
- name: cities-ui 
host: cities-ui-s12gx 
path: build/libs/spring-boot-cities-ui.war 
services: [ cities-ws ] 
env: 
SPRING_PROFILES_ACTIVE: cloud 
http://cities-ui-s12gx.cfapps.io
Spring Boot Integration 
42
Auto-configuration 
• Add spring-cloud dependencies in project 
• … that’s it 
! 
! 
• The same effect as adding @CloudScan 
43 
Available in Spring Boot 1.2.x
Spring Cloud starter 
! 
<dependency> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-cloud</artifactId> 
</dependency> 
44 
Available in Spring Boot 1.2.x
What’s next 
• Support for many more services 
• Elasticsearch 
• Memcache 
• Riak 
• Cassandra 
• Neo4j 
• ... 
• Support for other cloud platforms 
• Support for other frameworks? 
45
What’s next 
• Support for many more services 
• Elasticsearch 
• Memcache 
• Riak 
• Cassandra 
• Neo4j 
• ... 
• Support for other cloud platforms 
• Support for other frameworks? 
45 
Community Contributions Welcome!
Simplify Cloud Applications using 
Spring Cloud 
Ramnivas Laddad and Scott Frederick 
© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission.

Simplify Cloud Applications using Spring Cloud

  • 1.
    Simplify Cloud Applicationsusing Spring Cloud Ramnivas Laddad and Scott Frederick © 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission.
  • 2.
    Agenda • SpringCloud Basics • Application Config Options • Java config • XML config • Extensibility mechanism • Cloud Platforms • Cloud Services • Frameworks • Spring Boot Integration 2
  • 3.
  • 4.
    Cloud Apps Awareness 3 Application
  • 5.
    Container Cloud AppsAwareness 3 Application
  • 6.
    Container Cloud AppsAwareness 3 Application App Instance Information
  • 7.
    Container Cloud AppsAwareness 3 Application Service App Instance Information
  • 8.
    Container Cloud AppsAwareness 3 Application Service Services Information App Instance Information
  • 9.
    Cloud Apps Awareness: Cloud Foundry Instance Information { "limits": { "mem" : 512, "disk" : 1024, "fds" : 16384 }, "application_version":"5e6fe3f7-6900-4af8-8376-bf3223ce886b", "application_name":"hello-spring-cloud", "application_uris":["myapp.cfapps.io"], "version":"5e6fe3f7-6900-4af8-8376-bf3223ce886b", "name":"hello-spring-cloud", "space_name":"development", "space_id":"5f629937-1821-4f48-9eb4-8c67c70c0df0", "instance_id":"b84fa4cd1c75431486dec1609828ae36", "instance_index":0, "host":"0.0.0.0", "port":63202, "started_at_timestamp":1401394307, "state_timestamp":1401394307 } 4 VCAP_APPLICATION env variable
  • 10.
    Cloud Apps Awareness:Cloud Foundry Services { "elephantsql": [ { "name" : "inventory-db", "label" : "elephantsql", "tags" : ["relational","Data Store","postgresql"], "plan" : "turtle", "credentials" : { "uri" : "postgres://user:pass@babar.elephantsql.com:5432/db", "max_conns" : "5" } } ], "rediscloud": [ { "name" : "rediscloud-service", "label" : "rediscloud", "tags" : ["key-value","redis","Data Store"], "plan" : "25mb", "credentials" : { "hostname" : "pub-redis.garantiadata.com", "port" : "11853", "password" : "pass" } } ] } 5 VCAP_SERVICES env variable
  • 11.
    Cloud Apps Awareness: Heroku Instance Information • Individual env variables ! PORT 12345 ! DYNO web.1 ! 6
  • 12.
    Cloud Apps Awareness:Heroku Services • One environment variable per service ! HEROKU_POSTGRESQL_PURPLE_URL postgres://user:pass@host.amazonaws.com:5432/db ! REDISCLOUD_URL redis://rediscloud:pass@host.garantiadata.com:19038 REDISTOGO_URL redis://redistogo:pass@host.redistogo.com:9139 7
  • 13.
    Spring Cloud Goals • Abstraction over cloud services and application environment • Implementation for multiple cloud platforms • Cloud Foundry • Heroku • Local testing simulating a cloud-like environment • Extensibility without modifying the core code • Cloud Connector • Service Creator 8
  • 14.
  • 15.
    Scanning for services !! @Configuration @CloudScan public class CloudConfig { ! } 10
  • 16.
    Scanning for services !! @Configuration @CloudScan public class CloudConfig { ! } 10
  • 17.
    Taking over control @Configuration public class CloudConfig extends AbstractCloudConfig { @Bean public DataSource dataSource() { return connectionFactory().dataSource(); } ! @Bean public MongoDbFactory mongoDb() { return connectionFactory().mongoDbFactory(); } } 11
  • 18.
    Taking over control:Working with specific services @Configuration public class CloudConfig extends AbstractCloudConfig { @Bean public DataSource inventoryDataSource() { return connectionFactory().dataSource("inventory-service"); } ! @Bean public DataSource customerDataSource() { return connectionFactory().dataSource("customers-service"); } } 12
  • 19.
    Taking over control:Configuring Services @Configuration public class CloudConfig extends AbstractCloudConfig { @Bean public DataSource inventoryDataSource() { PoolConfig poolConfig = new PoolConfig(20, 200); ConnectionConfig connectionConfig = new ConnectionConfig("characterEncoding=UTF-8"); DataSourceConfig serviceConfig = new DataSourceConfig(poolConfig, connectionConfig); return connectionFactory().dataSource( "inventory-service", serviceConfig); } } 13
  • 20.
    Acquiring generic services @Configuration public class CloudConfig extends AbstractCloudConfig { @Bean public Search search() { return connectionFactory().service( "search-service", Search.class); } } 14
  • 21.
    Demo Spring Cloudon Cloud Foundry 15
  • 22.
    Deploy to CloudFoundry $ gradle assemble $ cf create-service cleardb spark cities-db $ cf push 16 --- applications: - name: cities host: cities-s12gx path: build/libs/spring-boot-cities.jar services: - cities-db env: SPRING_PROFILES_ACTIVE: cloud http://cities-s12gx.cfapps.io/
  • 23.
    Demo Spring Cloudon Heroku 17
  • 24.
    Deploy to Heroku $ heroku create cities-s12gx --stack cedar --buildpack http:// github.com/heroku/heroku-buildpack-java.git $ heroku config:set SPRING_CLOUD_APP_NAME=spring-boot-cities $ heroku config:set SPRING_PROFILES_ACTIVE=cloud $ heroku addons:add heroku-postgresql:hobby-dev $ git push heroku master 18 http://cities-s12gx.herokuapp.com/
  • 25.
  • 26.
    Scanning for services 20 <cloud:service-scan/>
  • 27.
    Taking over control 21 <cloud:data-source/> ! <cloud:mongo-db-factory/> ! ...
  • 28.
    Taking over control:Specifying services 22 <cloud:data-source service-name="inventory-service"/> ! <cloud:data-source service-name="customers-service"/>
  • 29.
    Taking over control:Configuring Services 23 <cloud:data-source service-name="inventory-service"> <cloud:pool pool-size="20" max-wait-time="200"/> <cloud:connection properties="characterEncoding=UTF-8"/> </cloud:data-source>
  • 30.
    Acquiring generic services 24 <cloud:service service-name="search-service"/>
  • 31.
    Acquiring generic services 24 <cloud:service service-name="search-service"/> <cloud:service service-name="search-service" connector-type="com.example.Search"/>
  • 32.
    Services Supported •Cloud Foundry, Heroku, and Local connectors with Spring • MySQL, Postgres, Oracle • Redis • MongoDB • AMQP / RabbitMQ • SMTP • Pivotal CF connectors with Spring • Pivotal HD 25
  • 33.
    Demo Spring Cloudwith Hadoop 26
  • 34.
    Explicit Cloud Config 27 @org.springframework.context.annotation.Configuration public class CloudConfig extends AbstractCloudConfig { @Bean public ConnectionFactory rabbitConnectionFactory() { return connectionFactory().rabbitConnectionFactory(); } @Bean public DataSource hawqDataSource() { return connectionFactory().dataSource("phd-service/hawq"); } ! @Bean public DataSource gemfirexdDataSource() { return connectionFactory().dataSource("phd-service/gemfirexd"); } @Bean public Configuration hadoopConfiguration() { return connectionFactory().service(Configuration.class); } }
  • 35.
    Consuming Service Beans:Explicit Config 28 @Autowired @Qualifier("hawqDataSource") DataSource hawqDataSource; @Autowired @Qualifier(“gemfirexdDataSource") DataSource gemfirexdDataSource; ! @Autowired ConnectionFactory rabbitConnectionFactory; ! @Autowired Configuration hadoopConfiguration; !!
  • 36.
    Cloud Config withScanning 29 @Configuration @CloudScan public class CloudConfig { }
  • 37.
    Consuming Service Beans:Explicit Config 30 @Autowired @Qualifier("phd-service/hawq") DataSource hawqDataSource; @Autowired @Qualifier("phd-service/gemfirexd") DataSource gemfirexdDataSource; ! @Autowired ConnectionFactory rabbitConnectionFactory; ! @Autowired Configuration hadoopConfiguration;
  • 38.
  • 39.
  • 40.
    Axes of Extensibility 32 Cloud Platform
  • 41.
    Axes of Extensibility 32 Cloud Platform Cloud Services
  • 42.
    Axes of Extensibility 32 Cloud Platform Cloud Services Framework Support
  • 43.
    Service Connector ExtensibilityOverview ServiceInfo 33 CloudConnector ServiceConnectorCreator SSerevrivciec eC Cononnencetcotror
  • 44.
    Cloud Platform Extensibility 34 public interface CloudConnector { ! boolean isInMatchingCloud(); ApplicationInstanceInfo getApplicationInstanceInfo(); ! List<ServiceInfo> getServiceInfos(); }
  • 45.
    Registering Cloud Connector ! • Add a line with the class name to /META-INF/services/org.springframework.cloud.CloudConnector! !!! • Cloud Foundry example:! org.springframework.cloud.cloudfoundry.CloudFoundryConnector ! •Heroku example:! org.springframework.cloud.heroku.HerokuConnector 35
  • 46.
  • 47.
    Cloud Service Extensibility 36 public interface ServiceInfo { public String getId(); }
  • 48.
    Cloud Service Extensibility public interface ServiceInfoCreator<SI extends ServiceInfo, SD> { 36 public boolean accept(SD serviceData); ! public SI createServiceInfo(SD serviceData); } public interface ServiceInfo { public String getId(); }
  • 49.
    Registering Service InfoCreators • Each Cloud Connector can choose any scheme it prefers ! • Cloud Foundry Cloud Connector example /META-INF/services/org.springframework.cloud.cloudfoundry.CloudFoundryServiceInfoCreator 37
  • 50.
    Registering Service InfoCreators • Each Cloud Connector can choose any scheme it prefers ! • Cloud Foundry Cloud Connector example /META-INF/services/org.springframework.cloud.cloudfoundry.CloudFoundryServiceInfoCreator 37 org.springframework.cloud.cloudfoundry.MysqlServiceInfoCreator org.springframework.cloud.cloudfoundry.PostgresqlServiceInfoCreator org.springframework.cloud.cloudfoundry.RedisServiceInfoCreator org.springframework.cloud.cloudfoundry.MongoServiceInfoCreator org.springframework.cloud.cloudfoundry.AmqpServiceInfoCreator org.springframework.cloud.cloudfoundry.MonitoringServiceInfoCreator org.springframework.cloud.cloudfoundry.SmtpServiceInfoCreator org.springframework.cloud.cloudfoundry.OracleServiceInfoCreator
  • 51.
    Framework extensibility •Mapping ServiceInfo to framework-specific service connector • RelationalServiceInfo -> DataSource • MongoServiceInfo -> MongoDbFactory • ... 38 public interface ServiceConnectorCreator<SC, SI extends ServiceInfo> { ! SC create(SI serviceInfo, ServiceConnectorConfig serviceConnectorConfig); Class<SC> getServiceConnectorType(); ! Class<?> getServiceInfoType(); }
  • 52.
    Framework extensibility registration • Each framework may choose any mechanism! ! • Spring Connection Creator example! /META-INF/services/org.springframework.cloud.service.ServiceConnectorCreator 39
  • 53.
    Framework extensibility registration • Each framework may choose any mechanism! ! • Spring Connection Creator example! /META-INF/services/org.springframework.cloud.service.ServiceConnectorCreator 39 org.springframework.cloud.service.relational.MysqlDataSourceCreator org.springframework.cloud.service.relational.PostgresqlDataSourceCreator org.springframework.cloud.service.relational.OracleDataSourceCreator org.springframework.cloud.service.keyval.RedisConnectionFactoryCreator org.springframework.cloud.service.document.MongoDbFactoryCreator org.springframework.cloud.service.messaging.RabbitConnectionFactoryCreator org.springframework.cloud.service.smtp.MailSenderCreator
  • 54.
    Demo Spring Cloudto Consume a Microservice 40
  • 55.
    Deploy to CloudFoundry $ gradle assemble $ cf create-user-provided-service cities-ws -p '{"url": "http://cities-s12gx.cfapps.io/", "tag": "cities"}' $ cf push 41 --- applications: - name: cities-ui host: cities-ui-s12gx path: build/libs/spring-boot-cities-ui.war services: [ cities-ws ] env: SPRING_PROFILES_ACTIVE: cloud http://cities-ui-s12gx.cfapps.io
  • 56.
  • 57.
    Auto-configuration • Addspring-cloud dependencies in project • … that’s it ! ! • The same effect as adding @CloudScan 43 Available in Spring Boot 1.2.x
  • 58.
    Spring Cloud starter ! <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cloud</artifactId> </dependency> 44 Available in Spring Boot 1.2.x
  • 59.
    What’s next •Support for many more services • Elasticsearch • Memcache • Riak • Cassandra • Neo4j • ... • Support for other cloud platforms • Support for other frameworks? 45
  • 60.
    What’s next •Support for many more services • Elasticsearch • Memcache • Riak • Cassandra • Neo4j • ... • Support for other cloud platforms • Support for other frameworks? 45 Community Contributions Welcome!
  • 61.
    Simplify Cloud Applicationsusing Spring Cloud Ramnivas Laddad and Scott Frederick © 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission.