抢占先机
VMware 提供培训和认证,以加速您的进步。
了解更多在上篇博客中,我向您展示了如何使用 Spring Cloud 的 Java 配置选项以声明方式获取服务连接器(如果您需要,还提供 XML 命名空间支持)。在这篇博客中,我们将更仔细地研究如何以编程方式使用 Spring Cloud。这将在您无法使用 Java 或 XML 配置的情况下提供帮助。它还将揭开 Spring Cloud 的工作原理,并为本系列中的下一篇博客做好准备,我们将在其中讨论扩展 Spring Cloud。
要使用 Spring Cloud,我们需要访问 Cloud
类的对象。但是,您不能直接创建 Cloud
对象(其构造函数不是公共的)。相反,您将通过 CloudFactory
获取它。
CloudFactory cloudFactory = new CloudFactory();
Cloud cloud = cloudFactory.getCloud();
以这种方式创建的云对象适用于应用程序运行的环境。例如,如果应用程序在 Cloud Foundry 中运行,则它被配置为理解如何向应用程序公开服务。请注意,创建 CloudFactory
实例有点昂贵,因此您应尽量避免创建多个实例。如果您使用诸如 Spring 之类的依赖注入框架,它将负责避免多个实例;否则,只需自己管理它。
一旦我们拥有了云对象,我们就可以使用各种标准获取应用程序实例信息、服务信息对象,以及使用指定的标准获取服务连接器。假设,您想获取绑定到应用程序的所有服务的 ServiceInfo
对象,并打印关系服务的 JDBC URL,您可以使用以下代码段
List<ServiceInfo> serviceInfos = cloud.getServiceInfos();
for (ServiceInfo serviceInfo : serviceInfos) {
if (serviceInfo instanceof RelationalServiceInfo) {
System.out.println(((RelationalServiceInfo) serviceInfo).getJdbcUrl());
}
}
这将产生如下输出
jdbc:postgresql://babar.elephantsql.com:5432/tbsonrjm?user=***&password=***
使用 getServiceInfos()
及其变体获取的对象包含足够的信息,例如 URL 和凭据,以创建服务连接器。在某些情况下,获取 ServiceInfo
对象可能是您所需要的全部,因为您始终可以基于它创建合适的连接器(例如 DataSource
)。但在大多数情况下,您会让 Spring Cloud 为服务创建一个合适的服务连接器。例如,如果您想直接获取“inventory-db”服务的 DataSource
,您可以使用以下代码段
DataSource inventoryDataSource =
cloud.getServiceConnector("inventory-db", DataSource.class, null);
此方法有一个变体:getSingletonServiceConnector()
,您可以按如下方式使用它
DataSource inventoryDataSource = cloud.getSingletonServiceConnector(DataSource.class, null);
在这里,它将返回绑定到应用程序的唯一关系数据库服务的 DataSource
;如果没有这样的服务,或者有多个服务,它将抛出一个异常。我们将 null
作为最后一个参数传递给这两种方法,以便为创建的连接器使用默认配置。但是,您可以传递您希望覆盖的配置。例如,这里我们指定了要创建的数据源的池配置以及连接配置。
PoolConfig poolConfig = new PoolConfig(20, 200);
ConnectionConfig connectionConfig = new ConnectionConfig("characterEncoding=UTF-8");
DataSourceConfig serviceConfig = new DataSourceConfig(poolConfig, connectionConfig);
DataSource invetoryDataSource = cloud.getSingletonServiceConnector(DataSource.class, serviceConfig);
最后,有一种方法可以获取包含应用程序 ID(云相关,但通常是应用程序名称)、应用程序实例 ID 和松散定义的应用程序属性的应用程序信息。让我们打印所有这些信息
ApplicationInstanceInfo appInstanceInfo = cloud.getApplicationInstanceInfo();
System.out.println("Application id: " + appInstanceInfo.getAppId());
System.out.println("Application instance id: " + appInstanceInfo.getInstanceId());
for (Map.Entry<String, Object> entry: appInstanceInfo.getProperties().entrySet()) {
System.out.println("Application property: " + entry.getKey() + "=" + entry.getValue());
}
当您在 Cloud Foundry 中运行的应用程序中执行此代码时,您将获得类似于以下内容的输出(此处已缩写)。如果同一应用程序在 Heroku 中运行,它将产生类似的输出,但具有不同的键集
Application id: hello-spring-cloud Application instance id: 8b523252a9d3478b92750ef27ad4e5b0 Application property: limits={mem=800, disk=1024, fds=16384} Application property: application_version=b1257c57-2a5c-47aa-8ca7-5e8b6d9a7b9c Application property: application_name=hello-spring-cloud Application property: application_uris=[hello-spring-cloud.cfapps.io] Application property: version=b1257c57-2a5c-47aa-8ca7-5e8b6d9a7b9c Application property: name=hello-spring-cloud Application property: space_name=development Application property: space_id=5f629937-1821-4f48-9eb4-8c67c70c0df0 Application property: application_id=a345f90f-e075-4005-b003-f4ab86ad716a Application property: instance_id=8b523252a9d3478b92750ef27ad4e5b0 Application property: instance_index=0 Application property: host=0.0.0.0 Application property: port=61023 Application property: start=2014-07-15 21:27:34 +0000 Application property: state_timestamp=1405459654
这就是您以编程方式使用 Spring Cloud 所需了解的全部内容。在下一篇博客中,我们将把重点转移到 Spring Cloud 的可扩展性方面。敬请关注。