领先一步
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的可扩展性方面。敬请关注。