以编程方式使用 Spring Cloud

工程 | Ramnivas Laddad | 2014 年 7 月 29 日 | ...

在上篇博客中,我向您展示了如何使用 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 的可扩展性方面。敬请关注。

获取 Spring 新闻通讯

与 Spring 新闻通讯保持联系

订阅

抢占先机

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部