spring_reference/deploying_to_the_cloud.md

82 lines
4.4 KiB
Markdown
Raw Normal View History

2015-03-04 15:38:55 +00:00
### 部署到云端
2015-03-04 16:11:14 +00:00
对于大多数流行云PaaS平台即服务提供商Spring Boot的可执行jars就是为它们准备的。这些提供商往往要求你带上自己的容器它们管理应用的进程不特别针对Java应用程序所以它们需要一些中间层来将你的应用适配到云概念中的一个运行进程。
2015-03-05 15:17:03 +00:00
两个流行的云提供商Heroku和Cloud Foundry采取一个打包'buildpack'方法。为了启动你的应用程序不管需要什么buildpack都会将它们打包到你的部署代码它可能是一个JDK和一个java调用也可能是一个内嵌的webserver或者是一个成熟的应用服务器。buildpack是可插拔的但你最好尽可能少的对它进行自定义设置。这可以减少不受你控制的功能范围最小化部署和生产环境的发散。
2015-03-04 16:11:14 +00:00
2015-03-05 15:17:03 +00:00
理想情况下你的应用就像一个Spring Boot可执行jar所有运行需要的东西都打包到它内部。
2015-03-04 16:11:14 +00:00
* Cloud Foundry
2015-03-05 15:17:03 +00:00
如果不指定其他打包方式Cloud Foundry会启用它提供的默认打包方式。Cloud Foundry的[Java buildpack](https://github.com/cloudfoundry/java-buildpack)对Spring应用有出色的支持包括Spring Boot。你可以部署独立的可执行jar应用也可以部署传统的.war形式的应用。
一旦你构建了应用(比如,使用`mvn clean package`)并[安装](http://docs.cloudfoundry.org/devguide/installcf/install-go-cli.html)了cf[命令行工具](http://docs.cloudfoundry.org/devguide/installcf/install-go-cli.html),你可以使用下面的`cf push`命令(将路径指向你编译后的.jar来部署应用。在发布一个应用前确保你已登陆cf命令行客户端。
```shell
$ cf push acloudyspringtime -p target/demo-0.0.1-SNAPSHOT.jar
```
查看`cf push`[文档](http://docs.cloudfoundry.org/devguide/installcf/whats-new-v6.html#push)获取更多可选项。如果相同目录下存在[manifest.yml](http://docs.cloudfoundry.org/devguide/deploy-apps/manifest.html)Cloud Foundry会使用它。
就此cf开始上传你的应用
```java
Uploading acloudyspringtime... OK
Preparing to start acloudyspringtime... OK
-----> Downloaded app package (8.9M)
-----> Java Buildpack source: system
-----> Downloading Open JDK 1.7.0_51 from .../x86_64/openjdk-1.7.0_51.tar.gz (1.8s)
Expanding Open JDK to .java-buildpack/open_jdk (1.2s)
-----> Downloading Spring Auto Reconfiguration from 0.8.7 .../auto-reconfiguration-0.8.7.jar (0.1s)
-----> Uploading droplet (44M)
Checking status of app 'acloudyspringtime'...
0 of 1 instances running (1 starting)
...
0 of 1 instances running (1 down)
...
0 of 1 instances running (1 starting)
...
1 of 1 instances running (1 running)
App started
```
恭喜!应用现在处于运行状态!
检验部署应用的状态是很简单的:
```shell
$ cf apps
Getting applications in ...
OK
name requested state instances memory disk urls
...
acloudyspringtime started 1/1 512M 1G acloudyspringtime.cfapps.io
...
```
一旦Cloud Foundry意识到你的应用已经部署你就可以点击给定的应用URI此处是[acloudyspringtime.cfapps.io/](http://acloudyspringtime.cfapps.io/)。
2015-03-04 16:11:14 +00:00
- 绑定服务
2015-03-05 15:17:03 +00:00
默认情况下,运行应用的元数据和服务连接信息被暴露为应用的环境变量(比如,$VCAP_SERVICES。采用这种架构的原因是因为Cloud Foundry多语言特性任何语言和平台都支持作为buildpack。进程级别的环境变量是语言无关language agnostic的。
环境变量并不总是有利于设计最简单的API所以Spring Boot自动提取它们然后将这些数据导入能够通过Spring `Environment`抽象访问的属性里:
```java
@Component
class MyBean implements EnvironmentAware {
private String instanceId;
@Override
public void setEnvironment(Environment environment) {
this.instanceId = environment.getProperty("vcap.application.instance_id");
}
// ...
}
```
所有的Cloud Foundry属性都以vcap作为前缀。你可以使用vcap属性获取应用信息比如应用的公共URL和服务信息比如数据库证书。具体参考VcapApplicationListener Javadoc。
**注**[Spring Cloud Connectors](http://cloud.spring.io/spring-cloud-connectors/)项目很适合比如配置数据源的任务。Spring Boot提供自动配置支持和一个`spring-boot-starter-cloud-connectors` starter POM。
2015-03-04 16:11:14 +00:00
* Heroku
* Openshift
* Google App Engine