五分钟带你读懂!Spring Cloud 构建微服务分布式云平台
======
由于 Pivotal Web Services 对 Spring Cloud 应用程序具有原生支持,因而部署过程非常简单。但是,它确实需要在应用程序端具有特定的依赖项和配置特别是如果开发人员的微服务必须与 Pivotal 平台( 如 Service Registry、Config Server 或 Circuit Breaker)提供的内置服务集成的话,更是如此。除了 Spring Cloud 的标准依赖项管理之外,还应该在 pom.xml 中包含 spring-cloud-services- dependencies,最新版本与 Edgware.SR2 版本列车一起使用,如下所示。
org . springframework. cloud
spring-cloud-dependencies
Edgware . SR2
pom
import
dependency>
io.pivotal.spring. cloud
spring-cloud-services-dependencies
1.6.1. RELEASE
pom
import
根据所选的集成服务,开发人员可能希望在项目中包含以下工件。我
们决定使用 Pivotal 平台提供的所有 Spring Cloud 功能,因此,我们的微服务将获取配置服务器的属性,在 Eureka 中注册它们,并使用 Hystrix 命令包装服务间通信。
![](https://static001.geekbang.org/infoq/8a/8acc7416ac8b8c2151d6dd361d4cc6a7.png)
以下是为在 Pivotal 平台上部署的应用程序启用发现客户端、配置客户端和断路器所需要的依赖项。
io.pivotal. spring.cloud
spring-cloud-services-starter-circuit-breaker
io.pivotal. spring . cloud
spring-cloud-services - starter -config-client
dependency>
io.pivotal. spring.cloud
spr ing-cloud- services-starter-service-registry
dependency>
我们将为示例微服务提供更多集成。所有这些都将在 MongoDB 中存储数据,而 MongoDB 也可以作为 Pivotal 平台上的服务提供。要完成此目标,首先应该在项目依赖项中包含 starter spring-boot- starter-data-mongodb.
org. springframework.boot
spring-boot -starter-data -mongodb
dependency>
应该使用 springdata.mongodb.uri 属性在配置设置中提供 MongoDB 数据库的地址。为了允许应用程序与 MongoDB 数据库连接,我们必须创建一个 Pivotal 的服务 mLab,然后将其绑定到应用程序。默认情况下,与绑定服务相关的元数据将作为环境变量 $VCAP_ SERVICES 公开给应用程序。这种方法的主要动机是 Cloud Foundry 被设计为多语言,这意味着任何语言和平台都可以作为构建包(Buildpack)获得支持。可以使用 veap 前缀注入所有 Cloud Foundry 属性。如果想要访问 Pivotal 的服务,则应该使用 veap.services 前缀,然后传递如下所示的服务名称。
spring :
data:
mongodb :
uri: ${vcap.services.mlab. credentials.uril
实际上,这就是需要在应用程序端完成的所有工作,这样就可以使它们与 Pivotal 平台上创建的组件一起正常工作。现在我们必须与在 Spring 中编写的标准微服务相同的方式启用 Spring Cloud 功能,如下所示。
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableCircuitBreaker
public class OrderApplication {
public static void main(String[] args) {
SpringApplication. run (OrderApplication.class, args);
部署应用程序
======
可以通过 3 种不同的方式在 Pivotal Web Service (PWS)平台上管理应用程序。第一种方式是通过 htps://console. run.pivotal.io 上提供的 Web 控制台。开发人员可以通过这种方式监控、扩展、重新启动已部署的应用程序,启用和禁用服务,定义新指标以及更改账户设置。但是,使用 Web 控制台(换句话说,也就是初始应用程序部署)却无法执行此操作,它需要使用命令行界面(Command-Line Interface, CLI)执行。开发人员可以从 pivotalio 网站下载所需的安装程序。安装完成之后,即可通过输入 cf 来调用计算机上的 Cloud Foundry CLI,如 cf help.
![](https://static001.geekbang.org/infoq/73/7337607eeca377402ded09431db87513.png)
1.使用命令行界面
命令行界面提供了一组命令,允许开发人员在 Cloud Foundry 上管理应用程序、代理的服务、空间、域和其他组件等。接下来将介绍在 PWS 上运行应用程序时应该知道的最重要的命令。
(1)要部署应用程序,必须先导航到其目录。然后,应该使用 cf login 命令登录 PWS,如下所示。
$ cf login -a https://api. run.pivotal.io
(2)使用 cf push 命令将应用程序推送到 Pivotal Web Service,并传递服务的名称。
$ cf push account-service -P target / account-service-1.0.0-
SNAPSHOT. jar
(3)或者,开发人员也可以在应用程序的根目录中提供 manifest.yml 文件以及所有必需的部署设置。在这种情况下,开发人员只需运行 cf push 命令而无须任何其他参数,如下所示。
applications:
name: account-service
memory: 300M
random- -route: true
path: target/account-service-1.0-SNAPSHOT.jar
(4)使用如.上例所示的 manifest.yml 文件中提供的配置设置进行部署将失败。要查看原因,可以运行命令 cf logs。原因是堆的内存限制不足。
$ cf logs account-service -- recent
默认情况下,平台将为代码缓存分配 240MB,为元空间(Metaspace)分配 140MB, 为每个线程分配 1MB,并假设 Tomcat 连接器最多有 200 个线程。这样就很容易计算出,使用这些设置,每个应用程序需要大约 650MB 的分配内存(而上面的示例仅分配了 300MB)。我们可以通过调用 cf set-env 命令并传递 JAVA _OPTS 参数来更改这些设置,如以下代码所示。像这样的内存限制在生产模式下是不够的,但可以用于测试目的。要确保这些更改生效,可以使用 cf restage 命令,如下所示。.
$ cf set-env account- service JAVA OPTS ”-Xmx150M -Xss250K -
XX:ReservedCodeCacheSize=70M -Xx :MaxMetaspaceSize=90M"
$ cf restage account- service
分配的内存很重要,特别是如果只有 2GB 内存可用于免费账户。应用默认内存设置后,我们就只能在 Pivotal 平台上部署两个应用程序,因为每个应用程序占用 1GB 的内存。虽然已经解决了前面描述的问题,但我们的应用仍然无法正常工作。
2.绑定到服务
在引导期间,应用程序无法连接所需的服务。出现此问题的原因是服务未默认绑定到应用程序。可以通过运行命令 cf services 来显示在空间中创建的所有服务,并通过调用命令 ef bind- service 将它们中的每-一个绑定到给定的微服务。在以下示例命令的执行中,我们将 Eureka、配置服务器和 MongoDB 都绑定到 account-service 服务。最后,可以再次运行 cf restage,此时-切都应该正常工作,如下所示。
$ ef bind-service account-service discovery- service
$cf bind-service account- service config-service
$ cf bind-service account-service sample-db
3.使用 Maven 插件
如前文所述,命令行界面和 Web 控制台并不是在 Pivotal 平台上管理应用程序的唯一方法。Cloud Foundry 团队已经实现了 Maven 插件,以促进和加快应用程序部署。有趣的是,同一个插件可用于管理任何 Cloud Foundry 实例的推送和更新,而不仅限于由 Pivotal 提供的实例。
使用 CloudFoundry 的 Maven 插件时,开发人员可以轻松地将云部署集成到 Maven 项目的生命周期中。这允许开发人员在 Cloud Foundry 中推送、删除和更新项目。如果想要将项目与 Maven 一起推送,只需运行以下命令。
$ mvn clean install ef:push
一般来说,Maven 插件提供的命令与命令行界面提供的命令非常相似。例如,开发人员可以通过执行命令 mvn cfapps 来显示应用程序的列表。如果要删除某个应用程序,则可以运行以下命令。
$ mvn cf:de1ete -Dcf。appname = product- service
如果要将某些更改上传到现有应用程序,则可以使用 cf:update,其命令如下。
$ mvn clean install cf :update
在运行任何命令之前,都必须正确配置插件。首先,需要传递 Cloud Foundry 登录凭据。建议将它们分别存储在 Maven 的 settings.xml 文件中。服务器标记内的典型条目可能如下所示。
...
cloud- foundry-credentials
piotr .minkowski@play.p1
123456
...
使用 Maven 插件而不是命令行界面的命令有一个重要的优点:开发人员可以在一个位置配置所有必要的配置设置,并可以在应用程序构建期间使用单个命令应用它们。插件的完整配置显示在以下代码段中。除了一些基本设置( 包括空间、内存和大量实例)之外,还可以使用 JAVA_ OPTS 环境变量更改内存限制,并将所需服务绑定到应用程序。运行 ef.push 命令之后,就可以在
ht:p:pro/uci-service-piomin.cfapps.. io/地址使用 product-service 服务。
org.cloudfoundry
cf -maven-plugin
1.1.3
评论