介绍
Spring Cloud Connector 为在云平台上运行的基于 JVM 的应用程序提供了一个简单的抽象,以便在运行时发现绑定服务和部署信息,并支持将发现的服务注册为 Spring bean。它基于插件模型,因此相同的编译应用程序可以部署在本地或多个云平台中的任何一个上,并且它支持通过Java服务提供程序接口(SPI)自定义服务定义。
连接器项目为发现 Heroku 和 Cloud Foundry 云上的通用服务提供了开箱即用的支持。它还包括一个基于属性的连接器,可以为开发和测试提供配置。
概念
核心连接器概念如下所述。
云连接器 | 特定于平台的接口,用于标识平台的存在并发现绑定到应用程序部署的任何服务。 |
服务连接器 | 表示与服务的运行时连接的对象(例如 a)。 |
服务信息 | 有关基础服务(如主机、端口和凭据)的信息。 |
申请信息 | 有关应用程序和特定正在运行的实例的信息。 |
子模块
该项目包含三个主要子模块。
- Spring Cloud Connector Core:核心库,与云无关,与 Spring 无关。它为喜欢手动访问云服务和应用程序信息的开发人员提供了一个编程入口点。它还为多个常见服务(数据库、消息队列)提供基本服务定义,并提供基于 SPI 的扩展机制,用于提供云和服务连接器。
- Spring Cloud Spring Service Connector:一个 Spring 库,它将应用程序信息、云信息和发现的服务公开为适当类型的 Spring bean(例如,SQL 服务将作为具有可选连接池的 a 公开)。
javax.sql.DataSource
- 云连接器:
- Spring Cloud Cloud Foundry Connector:用于 Cloud Foundry 的连接器。
- 春云 Heroku 连接器:Heroku 连接器。
- Spring Cloud 本地配置连接器:基于属性的连接器,用于在开发或测试期间手动提供配置信息。允许在应用程序部署的所有阶段使用相同的 Spring 云连接器配置布线。
开始
有关如何使用构建系统包含适当的依赖项的示例,请参阅下文。
包括云连接器
包括要发现的每个云平台的连接器。包括多个连接器是完全可以的;每个连接器将确定它是否应在特定环境中处于活动状态。
在 Maven 中,替换为所需的工件版本:${VERSION}
<!-- To use Spring Cloud Connectors for development -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-localconfig-connector</artifactId>
<version>${VERSION}</version>
</dependency>
<!-- If you intend to deploy the app to Cloud Foundry -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-cloudfoundry-connector</artifactId>
<version>${VERSION}</version>
</dependency>
<!-- If you intend to deploy the app to Heroku -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-heroku-connector</artifactId>
<version>${VERSION}</version>
</dependency>
在 Gradle 中,替换为所需的版本:${VERSION}
dependencies {
// To use Spring Cloud Connectors for development
compile 'org.springframework.cloud:spring-cloud-localconfig-connector:${VERSION}'
// If you intend to deploy the app to Cloud Foundry
compile 'org.springframework.cloud:spring-cloud-cloudfoundry-connector:${VERSION}'
// If you intend to deploy the app to Heroku
compile 'org.springframework.cloud:spring-cloud-heroku-connector:${VERSION}'
}
弹簧应用
如果您正在编写 Spring 应用程序,除了云连接器依赖项之外,还包括Spring 服务连接器依赖项。
在马文:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-spring-service-connector</artifactId>
<version>${VERSION}</version>
</dependency>
在格拉德尔:
dependencies {
compile 'org.springframework.cloud:spring-cloud-spring-service-connector:${VERSION}'
}
然后按照 Spring服务连接器文档中关于使用 Java配置或 <cloud>命名空间进行 Spring 配置的说明进行操作。
非弹簧应用
每个云连接器都包含依赖项,因此只需包含所需平台的连接器即可。然后按照有关使用 Spring 云连接器 API 的说明进行操作。spring-cloud-core
春季云连接器核心
此核心库提供对应用程序和服务信息的编程访问。该库没有 Spring 依赖项,可用于非 Spring 应用程序。
此库需要 Java 6 或更高版本。它与云无关;使用 Java SPI,它支持可插拔的云和服务连接器。除了本地提供的开发和测试配置外,对Cloud Foundry和Heroku的支持是开箱即用的。
连接到云
注意 | 如果您在 Spring 应用程序中使用 Spring Cloud Connectors,则应考虑自动注入 Spring bean。 |
- 在运行时类路径中包含所需的云连接器,如主文档中所述。
- 创建一个实例。创建实例的成本有点高,因此我们建议使用单例实例。如果您使用的是依赖注入框架(如 Spring),请为 创建 bean。
CloudFactory
CloudFactory
CloudFactory
CloudFactory cloudFactory = new CloudFactory();
- 获取运行应用程序的环境的对象。
Cloud
Cloud cloud = cloudFactory.getCloud();
请注意,您的类路径上必须具有适合您的部署环境的内容。例如,如果要将应用程序部署到 Cloud Foundry,则必须将Cloud Foundry 连接器添加到类路径中。如果没有找到合适的,该方法将抛出一个。CloudConnector
CloudConnector
getCloud()
CloudException
- 使用该实例访问应用程序和服务信息以及创建服务连接器。
Cloud
// ServiceInfo has all the information necessary to connect to the underlying service
List<ServiceInfo> serviceInfos = cloud.getServiceInfos();
// Find the `ServiceInfo` definitions suitable for connecting to a particular service type
List<ServiceInfo> databaseInfos = cloud.getServiceInfos(DataSource.class);
// Alternatively, let Spring Cloud Connectors create a service connector for you
String serviceId = "inventory-db";
DataSource ds = cloud.getServiceConnector(serviceId, DataSource.class,
null /* default config */);
弹簧服务连接器
Spring 服务连接器为 Spring 应用程序创建服务连接对象。它允许连接豆的Java或XML配置,目前支持关系数据库,如MySQL和PostgreSQL;SMTP通过;RabbitMQ via Spring AMQP;以及MongoDB,Redis和Cassandra通过Spring Data项目。它还支持连接到通用(例如,私有)服务。javax.sql.DataSource
org.springframework.mail.MailSender
有关此服务连接器的详细信息,请参阅弹簧云弹簧服务连接器。
云铸造连接器
Cloud Foundry Connector 发现绑定到在 Cloud Foundry 环境中运行的应用程序的服务。由于它使用Cloud Foundry标准格式的绑定服务信息,因此与提供商无关;它目前知道应用程序监控,Cassandra,DB2,MongoDB,MySQL,Oracle,PostgreSQL,RabbitMQ,Redis,SMTP和SQL Server服务。
有关此云连接器的详细信息,请参阅Spring Cloud Cloud Foundry 连接器。
希罗库连接器
Heroku 连接器发现绑定到在 Heroku 中运行的应用程序的服务。它目前知道PostgreSQL(由Heroku提供),MySQL(由ClearDB提供),Redis(由Redis To Go,Redis Cloud,RedisGreen,openredis和Heroku提供),MongoDB(由MongoLab,MongoHQ和MongoSoup提供)和RabbitMQ(由CloudAMQP提供)。它可以扩展以支持这些服务的其他提供商。
有关此云连接器的详细信息,请参阅Spring Cloud Heroku 连接器。
本地配置连接器
此连接器提供在本地配置 Spring 云连接器服务以进行开发或测试的功能。当前实现仅从 Java 属性读取。
快速入门
由于服务 URI 包含口令,并且不应存储在代码中,因此此连接器不会尝试从类路径中读取服务定义。可以将服务定义作为系统属性提供。
java -Dspring.cloud.database='mysql://user:pass@host:1234/dbname' -jar my-app.jar
您还可以通过设置系统属性从配置属性文件提供服务定义:spring.cloud.propertiesFile
java -Dspring.cloud.propertiesFile=/path/to/spring-cloud.properties -jar my-app.jar
或者通过在运行时类路径上提供引导属性文件。将仅检查此文件以查找命名的属性,并且其值将从系统属性中内插。spring-cloud-bootstrap.properties
spring.cloud.propertiesFile
spring.cloud.propertiesFile: ${user.home}/.config/myApp/spring-cloud.properties
系统属性或配置属性文件应包含应用程序 ID 和所需服务,格式如下。
spring.cloud.appId: myApp
; spring.cloud.{id}: URI
spring.cloud.database: mysql://user:pass@host:1234/dbname
服务类型由 URI 方案确定。如果连接器找到名为的属性(在系统属性或配置属性文件中),它将激活。spring.cloud.appId
属性来源
此连接器首先尝试读取一般系统属性和专门命名的系统属性。如果系统属性不可读(如果安全管理器拒绝),则它们将被视为空。如果找到系统属性 namedis,则该文件将作为属性列表加载。spring.cloud.propertiesFile
checkPropertiesAccess
spring.cloud.propertiesFile
提供引导属性文件
为了避免使用配置属性文件的路径手动配置运行配置或测试运行程序,连接器可以从运行时类路径中读取模板化文件名。此文件必须命名并位于类路径根目录中。为了安全起见,连接器不会尝试从文件中读取任何服务 URI。如果连接器找到该文件,它将读取该属性并将模式${system.property}替换为系统属性中的相应值。最有用的选项通常是。spring-cloud-bootstrap.properties
spring.cloud.propertiesFile
${user.home}
在系统属性中指定的配置属性文件将覆盖类路径上可能提供的任何引导程序文件。
属性优先级
为了提供最大的配置灵活性,连接器将使用运行时定义的系统属性覆盖文件中指定的任何属性(应用程序 ID 和服务定义)。如果覆盖服务 ID,连接器将记录一条消息。spring.cloud.propertiesFile
WARN
激活连接器
Spring 云连接器核心期望只有一个云连接器与运行时环境匹配。此连接器通过配置属性文件或系统属性(命名)中是否存在属性来标识“本地云”。此属性将在 中使用。spring.cloud.appId
ApplicationInstanceInfo
服务定义
如果连接器已激活,它将循环访问与模式匹配的键的所有可用属性。每个值都被解释为服务的 URI,服务类型由方案确定。支持每个标准。spring.cloud.{serviceId}
UriBasedServiceInfo
实例编号
此连接器创建用作实例 ID 的 UUID,因为 Java 不提供任何可移植机制来可靠地确定主机名或 PID。
扩展弹簧云连接器
除了内置服务和云支持以及随附的 Spring 服务连接器之外,Spring 云连接器还可以扩展以支持其他云平台、云服务或应用程序框架。详情见下文。
扩展性概述
如包括云连接器部分所述,应用程序可以包含多个云平台的云连接器。Spring 云连接器核心激活运行应用程序的平台。该云连接器的类为应用程序的服务创建对象,类使用这些对象创建要在应用程序中使用的服务连接对象。CloudConnector
ServiceInfoCreator
ServiceInfo
ServiceConnectorCreator
ServiceInfo
您可以通过以下三种方式之一扩展 Spring 云连接器:
- 云平台支持。Spring Cloud Connectors开箱即用,为Cloud Foundry和Heroku平台提供支持。您可以扩展 Spring 云连接器,以提供对其他云平台和提供商的支持。
Spring Cloud Connector 使用CloudConnector接口来提供云平台支持。特定云平台的实现负责检测应用程序何时在该云平台中运行,从云平台获取有关应用程序的信息,以及获取有关绑定到应用程序的服务的信息。CloudConnector
- 云服务支持。您可以扩展 Spring 云连接器以支持其他服务,包括特定于您自己的环境或应用程序的服务。
Spring 云连接器使用两个接口来提供云服务支持:
- 服务信息对连接到服务所需的信息进行建模。对于数据库服务,实现可能包括主机、端口、数据库名称、用户名和密码字段;对于 Web 服务,它可能包括 URL 和 API 密钥的字段。
ServiceInfo
- 服务信息创建者根据云连接器收集的服务信息创建对象。实现特定于云平台。
ServiceInfo
ServiceInfoCreator
- 应用程序框架支持。SpringCloud Spring 服务连接器创建具有Spring 数据类型的服务连接器。您可以使用另一个框架扩展 Spring 云连接器以提供服务连接对象。Spring Cloud Connectors使用ServiceConnectorCreator接口来提供框架支持。使用 aobject 提供的服务连接信息创建服务连接器。
ServiceConnectorCreator
ServiceInfo
添加云平台支持
要允许 Spring 云连接器检测新的云平台,请为该平台添加云连接器。
云连接器确定应用程序是否在特定云中运行,标识应用程序信息(例如特定正在运行的实例的名称和实例 ID),并将绑定服务(例如环境变量中公开的 URI)映射为对象。ServiceInfo
提示 | 有关示例,请参阅Cloud FoundryConnector 和Heroku Connector。 |
Spring Cloud Connectors使用Java SPI来发现可用的连接器。
连接器类必须实现CloudConnector接口,其中包括三种方法:
-
boolean isInMatchingCloud()
:确定连接器是否在其提供支持的云中运行。
Spring 云连接器核心调用应用程序中包含的每个云连接器,并激活响应的第一个连接器。isInMatchingCloud()
true
-
ApplicationInstanceInfo getApplicationInstanceInfo()
:返回有关正在运行的应用程序实例的信息。
必须提供实例 ID () 和应用程序 ID ()。可以根据需要将其他属性添加到 a,并通过以下方式返回。ApplicationInstanceInfo
String
String
Map
getProperties()
-
List<ServiceInfo> getServiceInfos()
:返回绑定到应用程序的每个服务的对象。ServiceInfo
getServiceInfos()
可以返回一个空如果尚未将任何服务绑定到应用程序。List
新的云连接器应在提供程序配置文件中列出完全限定的类名。META-INF/services/org.springframework.cloud.CloudConnector
添加服务支持
要允许 Spring 云连接器发现新类型的服务,请创建一个ServiceInfo类,其中包含连接到该服务所需的信息。如果可以通过 URI 指定服务,请扩展UriBasedServiceInfo,并在对构造函数的调用中提供 URI 方案。super
以下类将公开可用位置的信息。HelloWorldService
helloworld://username:password@host:port/Bonjour
public class HelloWorldServiceInfo extends UriBasedServiceInfo {
public static final String URI_SCHEME = "helloworld";
// Needed to support structured service definitions such as Cloud Foundry's
public HelloWorldServiceInfo(String id, String host, int port, String username, String password, String greeting) {
super(id, URI_SCHEME, host, port, username, password, greeting);
}
// Needed to support URI-based service definitions such as Heroku's
public HelloWorldServiceInfo(String id, String uri) {
super(id, uri);
}
}
创建类后,您需要为要支持的每个云平台创建一个ServiceInfoCreator。如果要为 Spring 云连接器已支持的云平台添加服务支持,则可能需要扩展相应的创建者基类。ServiceInfo
云铸造厂 | 扩展。 |
希罗库 | 扩展。 |
本地配置 | 扩展。 |
通常可以像实例化新方法一样简单。ServiceInfoCreator
ServiceInfo
@Override
public HelloWorldServiceInfo createServiceInfo(String id, String uri) {
return new HelloWorldServiceInfo(id, uri);
}
在云基类的相应提供程序配置文件中注册类。ServiceInfoCreator
ServiceInfoCreator
云铸造厂 | 将创建者的完全限定类名添加到其中。 |
希罗库 | 将创建者的完全限定类名添加到其中。 |
本地配置 | 将创建者的完全限定类名添加到其中。 |
添加框架支持
要允许 Spring 云连接器为支持的云服务提供特定于框架的服务对象,请为框架添加服务连接器。
服务连接器使用 afor 云连接器发现的服务,并将其转换为相应的服务对象(例如,对于表示 SQL 数据库的服务定义)。ServiceInfo
DataSource
提示 | 服务连接器可以紧密绑定到它们正在创建的服务对象的框架。例如,Spring 服务连接器中的某些连接器创建由 Spring 数据定义的连接工厂,用于构建 Spring 数据模板。 |
连接器类必须实现ServiceConnectorCreator接口,该接口有三种方法:
-
SC create()
:从给定的配置创建服务连接对象。ServiceInfo
-
Class<SC> getServiceConnectorType()
:返回将创建的连接对象的类型。 -
Class<?> getServiceInfoType()
:返回类将接受的类型。ServiceInfo
在提供程序配置文件中列出完全限定的连接器类名。META-INF/services/org.springframework.cloud.service.ServiceConnectorCreator