适用于亚马逊网络服务的 Spring Cloud

时间:2022-11-28 20:05:33

适用于亚马逊网络服务的 Spring Cloud

Spring Cloud for Amazon Web Services 是 Spring Cloud 伞形项目的一部分,它简化了与托管 Amazon Web Services 的集成。它提供了一种使用众所周知的 Spring 习语和 API(例如消息收发或缓存 API)与 AWS 提供的服务进行交互的便捷方式。开发人员可以围绕托管服务构建应用程序,而无需关心基础结构或维护。

Spring Cloud 是在非限制性 Apache 2.0 许可证下发布的。如果您想为文档的这一部分做出贡献,或者如果您发现错误,请在github 的项目中找到源代码和问题跟踪器。

1. 使用亚马逊云科技

Amazon 提供了一个Java 开发工具包,用于对Amazon Web Service平台提供的所有服务发出请求。使用 SDK,应用程序开发人员仍然需要集成 SDK使用大量与基础设施相关的代码进入他们的应用程序。Spring Cloud AWS 提供应用程序 开发人员已经集成了基于 Spring 的模块来使用服务并尽可能避免与基础设施相关的代码。 Spring Cloud AWS 模块提供了一个模块集,以便应用程序开发人员可以根据 他们对特定服务的需求。下图提供了所有Spring Cloud AWS模块的一般概述 为相应的Spring Cloud AWS服务提供服务支持。

适用于亚马逊网络服务的 Spring Cloud

  • Spring Cloud AWS Core 是 Spring Cloud AWS的核心模块,提供安全和配置的基本服务 设置。开发人员不会直接使用此模块,而是通过其他模块使用。核心模块提供对 基于云的环境配置,提供对基于实例的EC2元数据和整个应用程序堆栈特定CloudFormation元数据的直接访问。
  • Spring Cloud AWS Context 通过 Spring提供对简单存储服务的访问 资源加载程序抽象。此外,开发人员可以使用简单电子邮件服务和Spring邮件抽象发送电子邮件。此外,开发人员可以使用 Spring 缓存支持引入声明式缓存 和弹性缓存缓存服务。
  • Spring Cloud AWS JDBC为关系数据库服务提供自动数据源查找和配置,该服务可以与JDBC或Spring的任何其他支持数据访问技术一起使用。
  • Spring Cloud AWS Messaging使开发人员能够使用简单队列服务接收和发送消息 点对点通信。通过集成简单通知服务支持发布-订阅消息传递。
  • Spring Cloud AWS 参数存储配置使 Spring Cloud 应用程序能够将AWS 参数存储用作引导属性源,与为 Spring CloudConfig Server 或 Consul 的键值存储提供的支持相当。
  • Spring Cloud AWS Secrets Manager Configuration 使 Spring Cloud 应用程序能够使用AWS Secrets Manager作为 Bootstrap 属性源,与 Spring CloudConfig Server 或 Consul 的键值存储提供的支持相当。

2. 基本设置

在使用Spring Cloud AWS模块之前,开发人员必须选择依赖项并配置Spring Cloud AWS模块。 接下来的章节将介绍依赖关系管理以及Spring AWS云项目的基本配置。

2.1. 春云AWS专家依赖管理

Spring Cloud AWS 模块依赖项可以直接在Maven中使用,直接配置 的特定模块。Spring Cloud AWS 模块包括 Spring 模块的所有传递依赖项,以及 以及操作模块所需的亚马逊开发工具包。常规依赖项配置如下所示:

<dependencies>
<dependency>
<groupId>io.awspring.cloud</groupId>
<artifactId>spring-cloud-aws-context</artifactId>
<version>{spring-cloud-aws-version}</version>
</dependency>
</dependencies>

可以通过将模块名称替换为相应的模块名称来包含不同的模块(例如,代替​​spring-cloud-aws-messaging​​​​spring-cloud-aws-context​​)

2.2. 亚马逊开发工具包依赖版本管理

Amazon SDK 的发布频率高于 Spring Cloud AWS。如果您需要使用比Spring Cloud AWS配置的版本更新的AWS SDK版本 将 AWS SDK BOM 添加到依赖项管理部分,确保在配置 AWS 开发工具包依赖项的任何其他 BOM 依赖项之前声明该 BOM。

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-bom</artifactId>
<version>${aws-java-sdk.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

2.3. 亚马逊开发工具包配置

Spring Cloud AWS 配置目前是使用 Spring Cloud AWS 命名空间提供的自定义元素完成的。 JavaConfig 将很快得到支持。配置设置直接在Spring XML配置文件中完成 以便可以直接使用元素。Spring Cloud AWS 的每个模块都提供自定义命名空间,以允许模块化 模块的使用。下面概述了使用 Spring Cloud AWS 的典型 XML 配置:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aws-context="http://www.springframework.org/schema/cloud/aws/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/cloud/aws/context
http://www.springframework.org/schema/cloud/aws/context/spring-cloud-aws-context.xsd">

<aws-context:context-region region="..."/>
</beans>


在应用程序启动时,出于其内部目的,Spring Cloud AWS 会检查应用程序是否在 AWS 云环境中运行 通过使用 AWS 开发工具包提供的类。从版本 1.11.678 开始,在 AWS 环*部进行此检查时,AWS 开发工具包会记录一条警告消息并出现异常。 可以通过在类上设置日志记录级别来隐藏此警告消息。​​EC2MetadataUtils​​​​ERROR​​​​com.amazonaws.util.EC2MetadataUtils​




logging.level.com.amazonaws.util.EC2MetadataUtils=error




已启用 Ifis,但应用程序未在 EC2 环境中运行,AWS 开发工具包会记录一条警告消息,并显示一条异常消息,这会给应用程序日志添加可能不必要的干扰。 可以通过在类上设置日志记录级别来隐藏此警告消息。​​ContextInstanceDataAutoConfiguration​​​​ERROR​​​​com.amazonaws.internal.InstanceMetadataServiceResourceFetcher​




logging.level.com.amazonaws.internal.InstanceMetadataServiceResourceFetcher=error



2.3.1. 开发工具包凭证配置

为了调用亚马逊云科技,必须为 亚马逊开发工具包配置凭证。Spring Cloud AWS 支持配置特定于应用程序上下文的凭据,这些凭据用于已完成请求的每个服务调用 通过 Spring Cloud AWS 组件,参数存储和密钥管理器配置除外。 因此,整个应用程序上下文必须只有一个凭据配置。


如果没有专用凭据,则由所有客户端使用 提供程序定义。这基本上将使用以下身份验证信息​​com.amazonaws.auth.DefaultAWSCredentialsProviderChain​



  • 使用环境变量和​​AWS_ACCESS_KEY_ID​​​​AWS_SECRET_ACCESS_KEY​
  • 使用系统属性和​​aws.accessKeyId​​​​aws.secretKey​
  • 使用用户特定的配置文件凭据文件
  • 如果设置了环境变量,请使用 ECS 凭据​​AWS_CONTAINER_CREDENTIALS_RELATIVE_URI​
  • 使用实例配置文件凭证(见下文)


根据总体凭据策略,有不同的选项来配置凭据。可能的描述在 以下各小章。

简单的凭据配置

Amazon 开发工具包的凭证由访问密钥(可能共享)和私有密钥(不得共享)组成。双 可以使用 Spring Cloud AWS 创建的每个 Amazon 开发工具包服务的 XML 命名空间来配置安全属性 模块。整体配置如下所示

<beans ...>
<aws-context:context-credentials>
<aws-context:simple-credentials access-key="AKIAIO" secret-key="wJalrXUtnFEMI/K7M" />
</aws-context:context-credentials>
</beans>


访问密钥和密钥应外部化到属性文件中(例如 Spring Boot 应用程序配置) 并且不签入源管理系统。


实例配置文件配置

实例配置文件配置允许分配 启动 EC2 实例时由角色授权的配置文件。然后,对从 EC2 实例发出的所有调用进行身份验证 具有特定于实例配置文件的用户角色。因此,配置中不需要专用的访问密钥和密钥。 Spring Cloud AWS 中实例配置文件的配置如下所示:

<beans ...>
<aws-context:context-credentials>
<aws-context:instance-profile-credentials/>
</aws-context:context-credentials>
</beans>
混合使用两种安全配置

在某些情况下,结合这两种身份验证策略以允许应用程序使用实例配置文件非常有用 具有显式访问密钥和密钥配置的回退。如果在内部测试应用程序,这将非常有用 EC2(例如在测试服务器上)和本地进行测试。下一个代码片段显示了这两种安全配置的组合。

<beans ...>
<aws-context:context-credentials>
<aws-context:instance-profile-credentials/>
<aws-context:simple-credentials access-key="${accessKey:}" secret-key="${secretKey:}"/>
</aws-context:context-credentials>
</beans>


访问密钥和私有密钥使用占位符表达式和默认值定义,以避免引导 如果根本没有配置属性,则出错。


参数存储和机密管理器配置凭据和区域配置

参数存储和密钥管理器配置支持使用引导上下文来配置默认客户端,该客户端使用 aand。 如果要覆盖此设置,则需要使用配置为使用所选凭据和/或区域提供程序的类型 Bean 定义自己的 Spring Cloud 引导程序配置类。 由于此上下文是在创建 Spring Cloud Bootstrap 上下文时创建的,因此您不能简单地覆盖 Bean 在常规类中。​​AWSSimpleSystemsManagement​​​​com.amazonaws.auth.DefaultAWSCredentialsProviderChain​​​​com.amazonaws.regions.DefaultAwsRegionProviderChain​​​​AWSSimpleSystemsManagement​​​​@Configuration​

2.3.2. 区域配置

亚马逊云科技在不同的区域可用。基于 根据自定义要求,用户可以在不同的 Amazon 区域托管应用程序。该模块提供了一种为整个应用程序上下文定义区域的方法。spring-cloud-aws-context

显式区域配置

可以使用 XML 元素显式配置区域。如果区域不能自动 派生原因是应用程序未托管在 EC2 实例上(例如本地测试)或必须手动覆盖区域。

<beans ...>
<aws-context:context-region region="eu-west-1"/>
</beans>


还允许使用表达式或占位符来外部化配置,并确保区域可以 使用属性文件或系统属性重新配置。


自动区域配置

如果应用程序上下文在 EC2 实例内启动,则可以从实例元数据中自动获取区域,因此必须 不是静态配置。配置将如下所示:

<beans ...>
<aws-context:context-region auto-detect="true" />
</beans>
服务特定区域配置

如果一个应用程序上下文使用来自不同区域的服务,则也可以为特定服务覆盖区域。 如上所述,可以全局完成配置,并使用区域属性为每个服务进行配置。 数据库服务的配置可能如下所示(稍后介绍)

<beans ...>
<aws-context:context-region region="eu-central-1" />
<jdbc:data-source ... region="eu-west-1" />
</beans>


虽然理论上可以为每个应用程序使用多个区域,但我们强烈建议编写 仅托管在一个区域内,如果应用程序同时托管在不同的区域中,则拆分应用程序。


2.3.3. 弹簧引导自动配置

继Spring Cloud伞形项目之后,Spring Cloud AWS还提供专用的Spring Boot支持。春云 可以使用 Spring Boot 属性配置 AWS,并且还会根据 常规设置。

Maven 依赖项

Spring Cloud AWS 提供了一个专用模块来启用 Spring Boot 支持。必须将该模块添加到常规中 应用程序内的 Maven 依赖项。典型配置如下所示

<dependencies>
<dependency>
<groupId>io.awspring.cloud</groupId>
<artifactId>spring-cloud-aws-autoconfigure</artifactId>
<version>{spring-cloud-version}</version>
</dependency>
</dependencies>

必须添加其他依赖项以启用消息传递和 JDBC 等特定功能。Spring Cloud AWS 将 仅配置 Spring 引导应用程序的类路径中可用的类。

配置凭据

Spring 引导提供了一种使用属性文件或 YAML 配置文件定义属性的标准方法。春云 AWS 支持使用 Spring Boot 应用程序配置文件配置凭证信息。

默认情况下,Spring Cloud AWS 配置DefaultAWSCredentialsProviderChain来解析 AWS 凭证。

如果配置了其他凭证提供程序,则不使用 DefaultAWSCredentialsProviderChain,Spring Cloud AWS 配置以下凭证链:

  1. ​AWSStaticCredentialsProvider​​提供国际金融机构cloud.aws.credentials.access-key
  2. ​EC2ContainerCredentialsProviderWrapper​​IFIS 设置为cloud.aws.credentials.instance-profiletrue
  3. ​ProfileCredentialsProvider​​提供国际金融机构cloud.aws.credentials.profile-name

Spring Cloud AWS 提供以下属性来配置整个应用程序的凭证设置。

财产

描述

cloud.aws.credentials.access-key

AKIAIOSFODNN7EXAMPLE

要与静态提供程序一起使用的访问密钥

cloud.aws.credentials.secret-key

wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

要与静态提供程序一起使用的密钥

cloud.aws.credentials.instance-profile

配置实例配置文件凭证提供程序,无需进一步配置

cloud.aws.credentials.profile-name

违约

指定配置文件中配置文件的名称

cloud.aws.credentials.profile-path

​~/.aws/credentials​

配置文件所在的文件路径。未提供默认值 toif 值​​~/.aws/credentials​

配置区域

与凭证一样,Spring Cloud AWS 模块也支持 Spring 内部区域的配置 引导配置文件。可以使用DefaultAwsRegionProviderChain自动检测区域或显式配置区域(例如,在本地测试的情况下) 针对 AWS 云)。

用于配置区域的属性如下所示

财产

描述

cloud.aws.region.static

欧盟西部-1

为应用程序配置静态区域。可能的区域是(当前)美国东部 1、美国西部 1、美国西部 2、 欧洲西部-1、欧洲中部-1、亚太东南-1、亚太东南-1、亚太东北-1、南非-东部-1、CN-北部-1 和任何自定义区域 配置了自己的区域元数据

现在可以将每个集成配置为具有特定区域。如果以这种方式指定区域,则其优先级高于默认或静态区域。例如:

财产

描述

cloud.aws.sqs.region

欧盟西部-1

配置 SQS 集成将使用的区域。

启用集成

可以通过属性启用或禁用每个集成。默认情况下,所有集成都处于启用状态,但以下情况除外:​​ContextInstanceDataAutoConfiguration​

财产

描述

cloud.aws.sqs.enabled

禁用 SQS 集成自动配置。

配置端点

对于每个集成的 AWS 服务,您可以将 Spring Cloud AWS 配置为使用配置属性的自定义终端节点。例如:

cloud.aws.s3.endpoint=http://localhost:4566
cloud.aws.sqs.endpoint=http://localhost:4566
cloud.aws.rds.endpoint=http://localhost:4566

在集成测试中使用Localstack或与 AWS 兼容的第三方服务(如 MinIO)集成时,使用自定义终端节点特别有用。

配置客户端配置

对于某些 AWS 服务集成,您可以将 Spring Cloud AWS 配置为使用自定义。​​ClientConfiguration​

要覆盖所有集成使用的默认值,请创建具有名称的类型 Bean。​​ClientConfiguration​​​​ClientConfiguration​​​​com.amazonaws.ClientConfiguration.BEAN_NAME​

@Configuration
class CustomAwsConfiguration {

@Bean(name = "com.amazonaws.ClientConfiguration.BEAN_NAME")
ClientConfiguration clientConfiguration() {
ClientConfiguration clientConfiguration= new ClientConfiguration();
clientConfiguration.setProxyHost(proxyHost);
clientConfiguration.setProxyPort(proxyPort);
clientConfiguration.setProxyUsername(proxyUserName);
clientConfiguration.setProxyPassword(proxyPassword);
return clientConfiguration;
}
}

还可以通过定义类型的 Bean 和特定于集成的名称来提供特定的集成:​​ClientConfiguration​​​​ClientConfiguration​

SQS

​sqsClientConfiguration​

社交网络

​snsClientConfiguration​

SES

​sesClientConfiguration​

目录

​rdsClientConfiguration​

弹性缓存

​elastiCacheClientConfiguration​

云观察

​cloudWatchClientConfiguration​

例如:

@Configuration
class CustomSqsConfiguration {

@Bean
ClientConfiguration sqsClientConfiguration() {
ClientConfiguration clientConfiguration= new ClientConfiguration();
clientConfiguration.setProxyHost(proxyHost);
clientConfiguration.setProxyPort(proxyPort);
clientConfiguration.setProxyUsername(proxyUserName);
clientConfiguration.setProxyPassword(proxyPassword);
return clientConfiguration;
}
}

3. 云环境

应用程序通常需要特定于环境的配置信息,尤其是在不断变化的环境中,例如在 亚马逊云环境。Spring Cloud AWS 支持在 使用常见 Spring 机制(如属性占位符或 Spring 表达式语言)的应用程序上下文。

3.1. 检索实例元数据

实例元数据在 EC2 环境。可以使用提供实例元数据的特殊 HTTP 地址查询元数据。春云 AWS 使应用程序能够直接在表达式或属性占位符中访问此元数据,而无需调用 外部 HTTP 服务。

3.1.1. 使用 XML 启用实例元数据支持

实例元数据检索支持是通过 XML 元素启用的,例如 Spring 中的标准属性占位符。 下面的代码示例演示如何在应用程序上下文中激活实例元数据支持。

<beans ...>
<aws-context:context-instance-data />
</beans>

3.1.2. 使用 Java 启用实例元数据支持

还可以在 Java 配置类中配置实例元数据,而无需 XML 配置。 下一个示例显示了一个典型的 Springclass,该类使用​​@Configuration​​​​io.awspring.cloud.context.config.annotation.EnableInstanceData​

@Configuration
@EnableContextInstanceData
public static class ApplicationConfiguration {
}

3.1.3. 在 Spring 引导中启用实例元数据支持

如果应用程序,则实例元数据在 Spring 引导应用程序中可用作属性源 在 EC2 实例上运行,并且属性设置为 。​​cloud.aws.instance.data.enabled​​​​true​

3.1.4. 使用实例元数据

实例元数据可用于 XML、Java 占位符和表达式。下面的示例演示了 XML 文件中的实例元数据使用占位符以及引用特殊变量的表达式​​environment​

<beans ...>
<bean class="io.awspring.cloud....SimpleConfigurationBean">
<property name="value1" value="#{environment.ami-id}" />
<property name="value2" value="#{environment.hostname}" />
<property name="value3" value="${instance-type}" />
<property name="value4" value="${instance-id}" />
</bean>
</beans>

实例元数据也可以注入 Springannotation 直接进入 Java 字段。下一个示例演示了如何在 Spring Bean 中使用实例元数据。​​org.springframework.beans.factory.annotation.Value​

@Component
public class ApplicationInfoBean {

@Value("${ami-id:N/A}")
private String amiId;

@Value("${hostname:N/A}")
private String hostname;

@Value("${instance-type:N/A}")
private String instanceType;

@Value("${services/domain:N/A}")
private String serviceDomain;
}


每个实例元数据都可以通过实例元数据服务中可用的键访问 可以通过用斜杠 ('/') 分隔属性来访问嵌套属性。


3.1.5. 使用实例用户数据

除了默认实例元数据外,还可以在每个实例上配置用户数据。检索此用户数据并 由Spring Cloud AWS解析。可以在使用应用程序启动 EC2 实例时定义用户数据。Spring Cloud AWS 需要用户数据中的格式,以便它可以解析字符串并提取键值对。​​<key>:<value>;<key>:<value>​

可以使用如下所示的管理控制台或CloudFormation 模板配置用户数据。

适用于亚马逊网络服务的 Spring Cloud

下面概述了用于配置用户数据的 CloudFormation 模板代码段:

...
"Resources": {
"ApplicationServerInstance": {
"Type": "AWS::EC2::Instance",
"Properties": {
"ImageId": "ami-6a56b81d",
"UserData": {
"Fn::Base64": "data1:value1;data2:value2"
},
"InstanceType": "t1.micro",
}
}
...

用户数据可以通过占位符直接在应用程序上下文中访问,例如实例元数据 或表达式。

@Component
public class SecondConfigurationBean {

@Value("${data1}")
private String firstDataOption;

@Value("${data2}")
private String secondDataOption;
}

3.1.6. 使用实例标签

还可以使用标记而不是用户数据配置用户配置的属性。标签是上下文中的全局概念 的亚马逊网络服务,并用于不同的服务。Spring Cloud AWS 还支持跨不同 服务业。与用户数据相比,用户标签可以在运行时更新,无需停止和重新启动 实例。


用户数据也可用于执行脚本 在实例启动时。因此,利用实例标签进行用户配置和用户数据来执行脚本非常有用 在实例启动时。


可以通过下面概述的管理控制台在实例级别配置特定于实例的标签,并且 像用户数据一样,后面显示的 CloudFormation 模板也是如此。

适用于亚马逊网络服务的 Spring Cloud

下面概述了用于配置实例标签的 CloudFormation 模板代码段:

...
"Resources": {
"UserTagAndUserDataInstance": {
"Type": "AWS::EC2::Instance",
"Properties": {
"ImageId": "ami-6a56b81d",
"InstanceType": "t1.micro",
"Tags": [
{
"Key": "tag1",
"Value": "tagv1"
},
{
"Key": "tag3",
"Value": "tagv3"
},
{
"Key": "tag2",
"Value": "tagv2"
},
{
"Key": "tag4",
"Value": "tagv4"
}
]
}
}
}
...

要检索实例标签,Spring Cloud AWS必须发出经过身份验证的请求,因此它将需要该区域 和实际解析占位符之前的安全配置。还因为启动时实例标签不可用 在应用程序上下文中,它们只能作为表达式引用,而不能使用占位符引用。该元素定义一个属性,该属性将在应用程序上下文中为名称创建映射。这张地图 然后可以使用表达式查询其他 Bean 定义。​​context-instance-data​​​​user-tags-map​

<beans ...>
<aws-context:context-instance-data user-tags-map="instanceData" />
</beans>

Java Bean 可能会使用注释解析表达式。​​@Value​

public class SimpleConfigurationBean {

@Value("#{instanceData.tag1}")
private String value1;

@Value("#{instanceData.tag2}")
private String value2;

@Value("#{instanceData.tag3}")
private String value3;

@Value("#{instanceData.tag4}")
private String value4;
}

3.1.7. 配置自定义 EC2 客户端

在某些情况下,需要自定义 EC2 客户端来检索实例信息。该元素支持具有属性的自定义 EC2 客户端。下一个 示例显示了可能具有特殊配置的自定义 EC2 客户端的使用。​​context-instance-data​​​​amazon-ec2​

<beans ...>

<aws-context:context-credentials>....</aws-context:context-credentials>
<aws-context:context-region ... />
<aws-context:context-instance-data amazon-ec2="myCustomClient"/>

<bean class="com.amazonaws.services.ec2.AmazonEC2Client">
...
</bean>
</beans>

3.1.8. 注入默认 EC2 客户端

如果为实例数据配置了用户标签(见上文),Spring Cloud AWS 使用 指定的区域和安全凭据。应用程序开发人员可以使用注释将 EC2 客户端直接注入到他们的代码中。​​@Autowired​

public class ApplicationService {

private final AmazonEC2 amazonEc2;

@Autowired
public ApplicationService(AmazonEC2 amazonEc2) {
this.amazonEc2 = amazonEc2;
}
}

3.2. 将您的 Spring 云应用程序与 AWS 参数存储集成

Spring Cloud 提供对集中配置的支持,当应用程序启动时,可以读取并作为常规 Spring 提供。参数存储配置允许您使用此机制 与AWS 参数存储。​​PropertySource​

只需添加对入门模块的依赖即可激活支持。 该支持类似于为 Spring Cloud Config Server 或 Consul 的键值存储提供的支持: 配置参数可以定义为在所有服务之间共享或针对特定服务共享,并且可以 特定于配置文件。加密的值将在检索时解密。​​spring-cloud-starter-aws-parameter-store-config​

所有配置参数都从通用路径前缀(默认为 )。从那里共享 参数从默认为 的路径中检索,并且特定于服务的参数使用 默认为已配置。可以使用点和正斜杠来指定名称 的配置键。激活的配置文件的名称将使用默认为 强调。​​/config​​​​application​​​​spring.application.name​

这意味着对于调用的服务,默认情况下模块将查找并使用以下参数:​​my-service​

参数键

春天属性

描述

​/config/application/cloud.aws.stack.name​

​cloud.aws.stack.name​

由启用了配置支持的所有服务共享。可以使用特定于服务或配置文件的属性进行重写。

​/config/application_production/cloud.aws.stack.name​

​cloud.aws.stack.name​

由启用了配置支持并激活了 Spring 配置文件的所有服务共享。 可以使用特定于服务的属性重写。​​production​

​/config/my-service/cloud/aws/stack/auto​

​cloud.aws.stack.auto​

具体到服务。请注意,键路径中的斜杠将替换为点。​​my-service​

​/config/my-service_production/cloud/aws/stack/auto​

​cloud.aws.stack.auto​

特定于激活 Spring 配置文件时的服务。​​my-service​​​​production​

请注意,此模块不支持将完整的配置文件用作参数值,例如Spring Cloud Consul: AWS 参数值限制为 4096 个字符,因此我们仅支持配置单个 Spring 属性。

您可以在 Spring Cloudorfile 中配置以下设置 (请注意,应用了宽松的属性绑定,因此您不必使用此确切的语法):​​bootstrap.properties​​​​bootstrap.yml​

财产

违约

解释

​aws.paramstore.prefix​

​/config​

指示从参数存储加载的每个属性的第一级的前缀。 值必须以正斜杠开头,后跟一个或多个有效路径段,否则为空。

​aws.paramstore.defaultContext​

​application​

定义在所有服务之间共享的属性的上下文的名称

​aws.paramstore.profileSeparator​

​_​

将追加的配置文件与上下文名称分开的字符串。只能包含 字母数字字符旁边的点、破折号、正斜杠、反斜杠和下划线。

​aws.paramstore.failFast​

​true​

指示检索参数时出错是否应无法启动应用程序。

​aws.paramstore.name​

的配置值​​spring.application.name​

构造要查找此特定服务的属性的路径时要使用的名称。

​aws.paramstore.enabled​

​true​

可用于禁用参数存储配置支持,即使自动配置位于类路径上也是如此。

​aws.paramstore.region​

​eu-central-1​

可用于配置区域 AWSSimpleSystemsManagementClient。


为了找出在应用程序启动时从 AWS 参数存储中检索到哪些属性, 打开登录类。​​DEBUG​​​​io.awspring.cloud.paramstore.AwsParamStorePropertySource​




logging.level.io.awspring.cloud.paramstore.AwsParamStorePropertySource=debug



在(又名 Ilford)中,默认情况下不再启用引导阶段。挨次 启用它,您需要一个额外的依赖项:​​spring-cloud​​​​2020.0.0​

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>{spring-cloud-version}</version>
</dependency>

但是,从 开始,允许导入默认的 aws 参数存储密钥​​spring-cloud-aws​​​​2.3​

财产

描述

​spring.config.import=aws-parameterstore:​

基于每个活动配置文件 spring.application.name 属性值导入参数

​spring.config.import=aws-parameterstore:config-key;other-config-key​

按单个键导入参数

​spring.config.import=optional:aws-parameterstore:config-key;other-config-key​

即使找不到指定参数的参数,With应用程序也会启动。​​optional​

Spring Boot 2.4 更改了文件的加载方式,这意味着 spring-cloud-aws 的配置文件加载也发生了变化。 链接到 Spring 引导参考文档 关于文件特定加载:参考文档在官方:Spring 博客上阅读更多内容。

3.3. IAM 权限

Spring Cloud AWS 需要以下 IAM 权限:

从特定路径获取参数

​ssm:GetParametersByPath​

授予对参数存储的访问权限的示例 IAM 策略:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ssm:GetParametersByPath",
"Resource": "yourArn"
}
]
}

3.4. 将您的 Spring Cloud 应用程序与 AWS 密钥管理器集成

Spring Cloud 提供对集中配置的支持,当应用程序启动时,可以读取并作为常规 Spring 提供。密钥管理器配置允许您使用此机制 与AWS 密钥管理器一起使用。​​PropertySource​

只需添加对入门模块的依赖即可激活支持。 该支持类似于为 Spring Cloud Config Server 或 Consul 的键值存储提供的支持: 配置参数可以定义为在所有服务之间共享或针对特定服务共享,并且可以 特定于配置文件。​​spring-cloud-starter-aws-secrets-manager-config​

所有配置参数都从通用路径前缀(默认为 )。从那里共享 参数从默认为 的路径中检索,并且特定于服务的参数使用 默认为已配置。可以使用点和正斜杠来指定名称 的配置键。激活的配置文件的名称将使用默认为 强调。​​/secret​​​​application​​​​spring.application.name​

这意味着对于调用的服务,默认情况下模块将查找并使用以下参数:​​my-service​

参数键

描述

​/secret/application​

由启用了配置支持的所有服务共享。可以使用特定于服务或配置文件的属性进行重写。

​/secret/application_production​

由启用了配置支持并激活了 Spring 配置文件的所有服务共享。 可以使用特定于服务的属性重写。​​production​

​/secret/my-service​

具体到服务..​​my-service​

​/secret/my-service_production​

特定于激活 Spring 配置文件时的服务。​​my-service​​​​production​

您可以在 Spring Cloudorfile 中配置以下设置 (请注意,应用了宽松的属性绑定,因此您不必使用此确切的语法):​​bootstrap.properties​​​​bootstrap.yml​

财产

违约

解释

​aws.secretsmanager.prefix​

​/secret​

指示从机密管理器加载的每个属性的第一级的前缀。 值必须以正斜杠开头,后跟一个或多个有效路径段,否则为空。

​aws.secretsmanager.defaultContext​

​application​

定义在所有服务之间共享的属性的上下文的名称

​aws.secretsmanager.profileSeparator​

​_​

将追加的配置文件与上下文名称分开的字符串。只能包含 字母数字字符旁边的点、破折号、正斜杠、反斜杠和下划线。

​aws.secretsmanager.failFast​

​true​

指示检索机密时出错是否应无法启动应用程序。

​aws.secretsmanager.name​

的配置值​​spring.application.name​

构造要查找此特定服务的属性的路径时要使用的名称。

​aws.secretsmanager.enabled​

​true​

可用于禁用密钥管理器配置支持,即使自动配置位于类路径上。

​aws.secretsmanager.region​

​eu-central-1​

可用于设置 AWSSecretsManagerClient 的区域。

在(又名 Ilford)中,默认情况下不再启用引导阶段。挨次 启用它,您需要一个额外的依赖项:​​spring-cloud​​​​2020.0.0​

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>{spring-cloud-version}</version>
</dependency>

但是,从 开始,允许导入默认的 aws secretsmanager 密钥​​spring-cloud-aws​​​​2.3​

财产

描述

​spring.config.import=aws-secretsmanager:​

基于每个活动配置文件 spring.application.name 属性值导入参数

​spring.config.import=aws-secretsmanager:secret-key;other-secret-key​

通过单个密钥导入机密

​spring.config.import=optional:aws-secretsmanager:secret-key;other-secret-key​

即使没有找到指定机密的机密,Withapplication 也会启动。​​optional​

Spring Boot 2.4 更改了文件的加载方式,这意味着 spring-cloud-aws 的配置文件加载也发生了变化。 链接到 Spring 引导参考文档 关于文件特定加载:参考文档在官方 Spring 博客上阅读更多内容

3.5. IAM 权限

Spring Cloud AWS 需要以下 IAM 权限:

获取机密值:

​secretsmanager:GetSecretValue​

授予密钥管理器访问权限的示例 IAM 策略:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": "yourArn"
}
]
}

4. 管理云环境

使用管理控制台手动管理环境无法扩展,并且随着 基础结构的复杂性。亚马逊云科技提供CloudFormation服务,允许定义堆栈配置模板并使用服务引导整个基础设施。 为了允许多个堆栈并行,堆栈中的每个资源都会接收一个唯一的物理名称,其中包含 一些任意生成的名称。为了以统一的方式与堆栈资源进行交互,Spring Cloud AWS允许 开发人员使用逻辑名称而不是随机物理名称。

下图显示了典型的堆栈配置。

适用于亚马逊网络服务的 Spring Cloud

模板文件描述所有堆栈资源及其逻辑名称CloudFormation服务解析堆栈 模板文件,并使用其物理名称创建所有资源。应用程序可以使用所有堆栈配置的资源 使用模板中定义的逻辑名称。Spring Cloud AWS 将所有逻辑名称解析为应用程序开发人员的相应物理名称

4.1. 依赖关系

要在Spring Cloud AWS中启用CloudFormation支持,您必须添加以下将触发的依赖项:​​ContextStackAutoConfiguration​

<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-cloudformation</artifactId>
</dependency>

4.2. 自动云形成配置

如果应用程序在堆栈内运行(因为底层 EC2 实例已在堆栈中引导),则 Spring Cloud AWS 将自动检测堆栈并解析堆栈中的所有资源。应用程序开发人员 可以使用堆栈模板中的所有逻辑名称与服务进行交互。在下面的示例中,数据库 资源是使用 CloudFormation 模板配置的,为数据库实例定义逻辑名称。

"applicationDatabase": {
"Type": "AWS::RDS::DBInstance",
"Properties": {
"AllocatedStorage": "5",
"DBInstanceClass": "db.t1.micro",
"DBName": "test"
...
]
}
}

然后创建数据源,并将接收一个物理名称(例如 ir142c39k6o5irj)作为数据库服务名称。应用 开发人员仍然可以使用逻辑名称(在本例中)与数据库进行交互。示例 下面显示了由 elementand 自动解析定义的堆栈配置 特定堆栈。元素使用要使用的属性的逻辑名称 数据库。​​applicationDatabase​​​​aws-context:stack-configuration​​​​data-source​​​​db-instance-identifier​

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aws-context="http://www.springframework.org/schema/cloud/aws/context"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/cloud/aws/context
http://www.springframework.org/schema/cloud/aws/context/spring-cloud-aws-context.xsd">

<aws-context:context-credentials>
...
</aws-context:context-credentials>

<aws-context:context-region .. />

<aws-context:stack-configuration/>

<jdbc:data-source db-instance-identifier="applicationDatabase" ... />
</beans>


有关 Amazon RDS 配置和设置的更多详细信息,请参阅本文的相应章节 文档。


4.3. 手动云形成配置

如果应用程序未在堆栈配置的 EC2 实例中运行,则必须配置堆栈配置 手动地。该配置由一个附加元素属性组成,该属性将用于解析所有 运行时的相应堆栈配置信息。​​stack-name​

<beans ....>
...
<aws-context:stack-configuration stack-name="myStackName" />
...
</beans>

4.4. 使用 Java 配置类进行 CloudFormation 配置

Spring Cloud AWS还支持在Java类中配置CloudFormation支持,避免使用。 应用程序配置中的 XML。Spring Cloud AWS 提供了允许自动和手动的注释 堆栈配置。下一个示例显示了一个配置类,该类使用 显式堆栈名称(此处)。​​og.springframework.cloud.aws.context.config.annotation.EnableStackConfiguration​​​​manualStackName​

@Configuration
@EnableStackConfiguration(stackName = "manualStackName")
class ApplicationConfiguration {
}


如果应启用自动堆栈名称,请不要定义该属性。​​stackName​


4.5. Spring 引导中的 CloudFormation 配置

Spring Cloud AWS 还支持 Spring Boot 配置中的 CloudFormation 支持配置。这 可以使用下表中描述的属性定义手动和自动堆栈配置。

财产


描述

cloud.aws.stack.name

我的堆栈名称

将用于检索资源的手动配置堆栈名称的名称。

cloud.aws.stack.auto

为应用程序启用自动堆栈名称检测。

4.6. 手动名称解析

Spring Cloud AWS使用CloudFormation堆栈使用逻辑名称在内部解析所有资源。在某些情况下 可能需要解析应用程序代码中的物理名称。Spring Cloud AWS 提供预配置 服务,用于根据逻辑名称解析物理堆栈名称。此示例显示了手动堆栈资源解析。

@Service
public class ApplicationService {

private final ResourceIdResolver resourceIdResolver;

@Autowired
public ApplicationService(ResourceIdResolver resourceIdResolver) {
this.resourceIdResolver = resourceIdResolver;
}

public void handleApplicationLogic() {
String physicalBucketName =
this.resourceIdResolver.resolveToPhysicalResourceId("someLogicalName");
}
}

4.7. 堆栈标签

与 Amazon EC2 实例一样,CloudFormation 还提供堆栈特定的标签,可用于 配置堆栈特定的配置信息并在应用程序内接收它们。例如,这可以是一个 特定于阶段的配置属性(如 DEV、INT、PRD)。

<beans ....>
...
<aws-context:stack-configuration user-tags-map="stackTags"/>
...
</beans>

然后,应用程序可以使用类似表达式访问堆栈标签。​​#{stackTags.key1}​

4.8. 使用自定义云形成客户端

与EC2配置设置一样,该元素支持自定义CloudFormation客户端 具有特殊设置。客户端本身可以使用属性进行配置,如示例中所示:​​aws-context:stack-configuration​​​​amazon-cloud-formation​

<beans>
<aws-context:stack-configuration amazon-cloud-formation=""/>

<bean class="com.amazonaws.services.cloudformation.AmazonCloudFormationClient">
</bean>
</beans>

5. 消息传递

Spring Cloud AWS 提供 AmazonSQS 和 Amazon SNS集成 这简化了通过 SQS 或 SNS 发布和使用消息的过程。虽然 SQS 完全依赖于消息传递 API 在Spring 4.0中引入,SNS仅部分实现了它,因为接收部分必须以不同的方式处理 推送通知。

5.1. 配置消息传递

在使用和配置消息传递支持之前,应用程序必须包含相应的模块依赖项 进入 Maven 配置。Spring Cloud AWS 消息收发支持作为一个单独的模块提供,允许模块化使用 的模块。

5.1.1. Maven 依赖配置

Spring Cloud AWS 消息收发模块作为独立模块提供,可以使用以下依赖项声明进行导入:

<dependency>
<groupId>io.awspring.cloud</groupId>
<artifactId>spring-cloud-aws-messaging</artifactId>
<version>{spring-cloud-version}</version>
</dependency>

5.2. SQS 支持

Amazon SQS 是 Amazon Web Service 平台上的托管消息收发服务,可提供点对点通信 有队列。与 JMS 或其他邮件服务相比,Amazon SQS 具有几个功能和限制,应该 考虑到了。

  • Amazon SQS 仅允许有效负载,因此必须将任何负载转换为字符串表示形式。 Spring Cloud AWS 有专门的支持,通过将 Java 对象转换为 JSON 来传输带有 Amazon SQS 消息的 Java 对象。StringObject
  • Amazon SQS 没有事务支持,因此消息可能会被检索两次。申请必须写在 一种幂等方式,以便他们可以接收两次消息。
  • Amazon SQS 的最大邮件大小为每条消息 256kb,因此无法发送更大的消息。

5.2.1. 发送消息

包含许多发送消息的便捷方法。有一些发送方法指定 使用对象的目标和那些使用字符串指定目标的目的地,该字符串将 根据 SQS API 进行解析。不带目标参数的发送方法使用默认目标。​​QueueMessagingTemplate​​​​QueueMessageChannel​

import com.amazonaws.services.sqs.AmazonSQSAsync;
import org.springframework.beans.factory.annotation.Autowired;
import io.awspring.cloud.messaging.core.QueueMessagingTemplate;
import org.springframework.messaging.support.MessageBuilder;

public class SqsQueueSender {

private final QueueMessagingTemplate queueMessagingTemplate;

@Autowired
public SqsQueueSender(AmazonSQSAsync amazonSQSAsync) {
this.queueMessagingTemplate = new QueueMessagingTemplate(amazonSQSAsync);
}

public void send(String message) {
this.queueMessagingTemplate.send("physicalQueueName", MessageBuilder.withPayload(message).build());
}
}

此示例使用 theclass 创建具有字符串有效负载的消息。泰斯 通过将引用传递给客户端来构造。send 方法中的目标是一个字符串值,该 必须与 AWS 上定义的队列名称匹配。此值将在运行时由 Amazon SQS 客户端解析。选择 可以将实现传递给构造函数以通过以下方式解析资源 在 CloudFormation 堆栈中运行时的逻辑名称(有关以下内容的更多信息,请参阅管理云环境) 资源名称解析)。​​MessageBuilder​​​​QueueMessagingTemplate​​​​AmazonSQSAsync​​​​ResourceIdResolver​​​​QueueMessagingTemplate​

使用消息传递命名空间,可以在 XML 配置文件中定义 a。​​QueueMessagingTemplate​

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aws-context="http://www.springframework.org/schema/cloud/aws/context"
xmlns:aws-messaging="http://www.springframework.org/schema/cloud/aws/messaging"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/cloud/aws/context
http://www.springframework.org/schema/cloud/aws/context/spring-cloud-aws-context.xsd
http://www.springframework.org/schema/cloud/aws/messaging
http://www.springframework.org/schema/cloud/aws/messaging/spring-cloud-aws-messaging">

<aws-context:context-credentials>
<aws-context:instance-profile-credentials />
</aws-context:context-credentials>

<aws-messaging:queue-messaging-template />

</beans>

在此示例中,消息传递命名空间处理程序构造一个新的。该客户 根据提供的凭据自动创建并传递给模板的构造函数。如果 应用程序在传递给构造函数的已配置的 CloudFormation 堆栈 AI 内运行(有关资源名称解析的更多信息,请参阅管理云环境)。​​QueueMessagingTemplate​​​​AmazonSQSAsync​​​​ResourceIdResolver​

使用消息转换器

为了便于域模型对象的发送,具有各种发送方法,这些 将 Java 对象作为消息数据内容的参数。重载的方法并将转换过程委托给接口的实例。此接口定义了一个简单的协定,用于在 Java 对象和 SQS 消息之间进行转换。默认 实现只是解包消息有效负载,只要它与目标类型匹配。由 使用转换器,您和您的应用程序代码可以专注于通过 发送或接收的业务对象 SQS,而不关心它如何表示为 SQS 消息的详细信息。​​QueueMessagingTemplate​​​​convertAndSend()​​​​receiveAndConvert()​​​​QueueMessagingTemplate​​​​MessageConverter​​​​SimpleMessageConverter​


由于 SQS 只能发送有效负载,因此应仅使用默认转换器 以发送有效负载。对于更复杂的对象,应使用自定义转换器,例如由 消息传递命名空间处理程序。​​String​​​​SimpleMessageConverter​​​​String​


建议使用 XML 消息传递命名空间来创建,因为它将设置更多 复杂,当杰克逊在类路径上时将对象转换为 JSON。​​QueueMessagingTemplate​​​​MessageConverter​

<aws-messaging:queue-messaging-template  />
this.queueMessagingTemplate.convertAndSend("queueName", new Person("John, "Doe"));

在此示例中,ais 使用消息传递命名空间创建。方法之法 转换有效负载使用 配置并发送消息。​​QueueMessagingTemplate​​​​convertAndSend​​​​Person​​​​MessageConverter​

5.2.2. 接收消息

接收 SQS 消息有两种方法,一种是使用 theor 的方法 注释驱动的侦听器终结点。后者是迄今为止更方便的接收消息的方式。​​receive​​​​QueueMessagingTemplate​

Person person = this.queueMessagingTemplate.receiveAndConvert("queueName", Person.class);

在此示例中,将从 SQS 队列中获取一条消息并将其转换为目标类 作为参数传递。​​QueueMessagingTemplate​

5.2.3. 注释驱动的侦听器端点

注释驱动的侦听器终端节点是侦听 SQS 消息的最简单方法。只需对方法进行注释,然后将消息路由到带注释的方法。​​MessageMapping​​​​QueueMessageHandler​

<aws-messaging:annotation-driven-queue-listener />
@SqsListener("queueName")
public void queueListener(Person person) {
// ...
}

在此示例中,启动了一个队列侦听器容器,用于轮询传递给注释的 SQS。传入消息将转换为目标类型,然后调用带批注的方法。​​queueName​​​​MessageMapping​​​​queueListener​

除了有效负载之外,还可以在侦听器方法中注入标头,theorannotations.is 用于注入特定的标头值,同时注入包含所有标头。​​@Header​​​​@Headers​​​​@Header​​​​@Headers​​​​Map<String, String>​

只有标准 完全支持随 SQS 消息一起发送的消息属性。 处理自定义消息属性时,就好像自定义类型标签(类型名称中“.”之后的所有内容)在属性键中不存在一样。 它在转换过程中被静默省略,但只要原始消息存在于“sourceData”标头中,仍然可以访问它。

除了提供的参数解析器外,还可以使用属性在元素上注册自定义解析器(请参阅下面的示例)。​​aws-messaging:annotation-driven-queue-listener​​​​aws-messaging:argument-resolvers​

<aws-messaging:annotation-driven-queue-listener>
<aws-messaging:argument-resolvers>
<bean class="org.custom.CustomArgumentResolver" />
</aws-messaging:argument-resolvers>
</aws-messaging:annotation-driven-queue-listener>

默认情况下,创建具有核心的计算值和 最大池大小。核心池大小设置为队列数的两倍,最大池大小通过乘以 按字段值划分的队列数。如果这些默认值不能满足 该应用程序,可以使用属性设置自定义任务执行器(请参阅下面的示例)。​​SimpleMessageListenerContainer​​​​ThreadPoolTaskExecutor​​​​maxNumberOfMessages​​​​task-executor​

<aws-messaging:annotation-driven-queue-listener task-executor="simpleTaskExecutor" />

5.2.4. 先进先出队列支持

​AmazonSQSBufferedAsyncClient​​Spring Cloud AWS默认用于与SQS通信的与FIFO队列不兼容。 要将 FIFO 队列与 Spring Cloud SQS 一起使用,建议使用不基于的自定义 SQS 客户端 Bean 覆盖默认的 SQS 客户端 bean。 例如:​​AmazonSQSBufferedAsyncClient​

import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.services.sqs.AmazonSQSAsync;
import com.amazonaws.services.sqs.AmazonSQSAsyncClientBuilder;
import io.awspring.cloud.core.region.RegionProvider;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

@Bean
AmazonSQSAsync amazonSQS(AWSCredentialsProvider awsCredentialsProvider, RegionProvider regionProvider,
ClientConfiguration clientConfiguration) {
return AmazonSQSAsyncClientBuilder.standard().withCredentials(awsCredentialsProvider)
.withClientConfiguration(clientConfiguration).withRegion(regionProvider.getRegion().getName()).build();
}
}
删除策略

SQS 集成支持处理消息时使用的删除策略。 请注意,未成功删除的 SQS 消息将记录为错误。

​ALWAYS​

在成功(未引发异常)或失败(引发异常)时始终删除消息

​NEVER​

使用此策略方法时,侦听必须注意删除消息。

​NO_REDRIVE​

如果未定义重新驱动策略,则删除邮件

​ON_SUCCESS​

仅当侦听器方法成功执行时才删除消息(不引发异常)

​DEFAULT​

如果未更改,则设置为默认值。​​NO_REDRIVE​

可以在 内部指定删除策略。显式使用策略时,初始化优先于全局删除策略。​​@SqsListener​​​​@SqsListener​

@SqsListener(value = "queueName", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)

所有人都将使用的全局删除策略可以通过以下属性进行设置:​​@SqsListener​

cloud.aws.sqs.handler.default-deletion-policy=ON_SUCCESS
消息回复

可以对消息侦听器方法进行批注以将其返回值发送到另一个通道。使用在元素上设置的已定义消息传递模板来发送返回值。消息传递模板必须实现 界面。​​@SendTo​​​​SendToHandlerMethodReturnValueHandler​​​​aws-messaging:annotation-driven-queue-listener​​​​DestinationResolvingMessageSendingOperations​

<aws-messaging:annotation-driven-queue-listener send-to-message-template="queueMessagingTemplate"/>
@SqsListener("treeQueue")
@SendTo("leafsQueue")
public List<Leaf> extractLeafs(Tree tree) {
// ...
}

在此示例中,该方法将接收来自 然后返回将要发送到的 aofs。请注意,在 XML 元素上有一个属性指定为用于发送消息返回值的消息传递模板 侦听器方法。​​extractLeafs​​​​treeQueue​​​​List​​​​Leaf​​​​leafsQueue​​​​aws-messaging:annotation-driven-queue-listener​​​​send-to-message-template​​​​QueueMessagingTemplate​

处理异常

在带批注的方法内部引发的异常可以由带批注的方法处理。​​@SqsListener​​​​@MessageExceptionHandler​

import io.awspring.cloud.messaging.listener.annotation.SqsListener;
import org.springframework.messaging.handler.annotation.MessageExceptionHandler;
import org.springframework.stereotype.Component;

@Component
public class MyMessageHandler {

@SqsListener("queueName")
void handle(String message) {
...
throw new MyException("something went wrong");
}

@MessageExceptionHandler(MyException.class)
void handleException(MyException e) {
...
}
}

5.2.5. 简单消息侦听器容器工厂

也可以通过创建类型的 bean 来配置 Java。​​SimpleMessageListenerContainer​​​​SimpleMessageListenerContainerFactory​

@Bean
public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory(AmazonSQSAsync amazonSqs) {
SimpleMessageListenerContainerFactory factory = new SimpleMessageListenerContainerFactory();
factory.setAmazonSqs(amazonSqs);
factory.setAutoStartup(false);
factory.setMaxNumberOfMessages(5);
// ...

return factory;
}

5.2.6. 通过 Amazon SQS 使用 AWS 事件消息

还可以使用 SQS 消息侦听器接收 AWS 生成的事件消息。因为 AWS 消息不包含 mime 类型的标头,必须配置 Jackson 消息转换器 使用属性 false 也解析没有正确 MIME 类型的消息。​​strictContentTypeMatch​

下一个代码显示了使用和重新配置消息转换器的配置。​​QueueMessageHandlerFactory​​​​MappingJackson2MessageConverter​

@Bean
public QueueMessageHandlerFactory queueMessageHandlerFactory() {
QueueMessageHandlerFactory factory = new QueueMessageHandlerFactory();
MappingJackson2MessageConverter messageConverter = new MappingJackson2MessageConverter();

//set strict content type match to false
messageConverter.setStrictContentTypeMatch(false);
factory.setArgumentResolvers(Collections.<HandlerMethodArgumentResolver>singletonList(new PayloadArgumentResolver(messageConverter)));
return factory;
}

通过上述配置,可以接收 S3 存储桶(以及其他 事件通知,如弹性转码器消息)内部注释的方法 s 如下所示。​​@SqsListener​

@SqsListener("testQueue")
public void receive(S3EventNotification s3EventNotificationRecord) {
S3EventNotification.S3Entity s3Entity = s3EventNotificationRecord.getRecords().get(0).getS3();
}

5.3. IAM 权限

Spring Cloud AWS 需要以下 IAM 权限:

将消息发送到队列

​sqs:SendMessage​

从队列接收消息

​sqs:ReceiveMessage​

从队列中删除邮件

​sqs:DeleteMessage​

要将 sqsListener 与 SimpleMessageListenerContainerFactory 一起使用,您还需要添加

​sqs:GetQueueAttributes​

要使用具有 Sqs 名称而不是 ARN 的 SqsListener,您需要

​sqs:GetQueueUrl​

授予对 SQS 的访问权限的示例 IAM 策略:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sqs:DeleteMessage",
"sqs:ReceiveMessage",
"sqs:SendMessage",
"sqs:GetQueueAttributes",
"sqs:GetQueueUrl"
],
"Resource": "yourARN"
}

5.4. 社交网络支持

Amazon SNS 是一种发布-订阅消息收发系统,允许客户端向特定主题发布通知。其他 感兴趣的客户可以使用不同的协议(如 HTTP/HTTPS、电子邮件或 Amazon SQS 队列)进行订阅,以接收消息。

下图显示了 Amazon SNS 架构的典型示例。

适用于亚马逊网络服务的 Spring Cloud

Spring Cloud AWS 通过提供使用 aand 发送通知的支持来支持 Amazon SNS 使用基于 Spring Web MVC 的编程模型接收带有 HTTP/HTTPS 端点的通知。亚马逊河 基于 SQS 的订阅可以与 Spring Cloud AWS 消息收发模块提供的注释驱动的消息支持一起使用。​​NotificationMessagingTemplate​​​​@Controller​

5.4.1. 发送消息

包含两种发送通知的便捷方法。第一个指定 目标使用 将针对 SNS API 解析。第二个没有目的地 参数并使用默认目标。上可用的所有常用发送方法都已实现,但发送通知不太方便,因为主题必须作为标头传递。​​NotificationMessagingTemplate​​​​String​​​​MessageSendingOperations​


目前只能使用有效负载发送,因为这是预期的 通过 SNS API 键入。​​String​​​​NotificationMessagingTemplate​


import com.amazonaws.services.sns.AmazonSNS;
import org.springframework.beans.factory.annotation.Autowired;
import io.awspring.cloud.messaging.core.NotificationMessagingTemplate;

public class SnsNotificationSender {

private final NotificationMessagingTemplate notificationMessagingTemplate;

@Autowired
public SnsNotificationSender(AmazonSNS amazonSns) {
this.notificationMessagingTemplate = new NotificationMessagingTemplate(amazonSns);
}

public void send(String subject, String message) {
this.notificationMessagingTemplate.sendNotification("physicalTopicName", message, subject);
}
}

此示例构造一个 newby 将客户端作为参数传递。在该方法中,便利方法用于向SNS主题发送。这 方法中的目标是一个字符串值,该值必须与 AWS 上定义的主题名称匹配。此值 由 Amazon SNS 客户端在运行时解析。(可选)可以将实现传递给构造函数,以便在 CloudFormation 堆栈中运行时按逻辑名称解析资源。 (有关资源名称解析的详细信息,请参阅管理云环境。​​NotificationMessagingTemplate​​​​AmazonSNS​​​​send​​​​sendNotification​​​​message​​​​subject​​​​sendNotification​​​​ResourceIdResolver​​​​NotificationMessagingTemplate​

建议使用 XML 消息传递命名空间进行创建,因为它会自动创建 配置 SNS 客户端以设置默认转换器。​​NotificationMessagingTemplate​

<aws-messaging:notification-messaging-template  />

5.4.2. 注释驱动的 HTTP 通知端点

SNS 支持多种终端节点类型(SQS、Email、HTTP、HTTPS),Spring Cloud AWS 支持 HTTP(S) 终端节点。 SNS 向 HTTP 主题侦听器终端节点发送三种类型的请求,每种请求都提供了注释:

  • 订阅请求→@NotificationSubscriptionMapping
  • 通知请求→@NotificationMessageMapping
  • 取消订阅请求→@NotificationUnsubscribeMapping

HTTP端点基于Spring MVC控制器。Spring Cloud AWS 添加了一些自定义参数解析器来提取 通知请求中的消息和主题。

@Controller
@RequestMapping("/topicName")
public class NotificationTestController {

@NotificationSubscriptionMapping
public void handleSubscriptionMessage(NotificationStatus status) throws IOException {
//We subscribe to start receive the message
status.confirmSubscription();
}

@NotificationMessageMapping
public void handleNotificationMessage(@NotificationSubject String subject, @NotificationMessage String message) {
// ...
}

@NotificationUnsubscribeConfirmationMapping
public void handleUnsubscribeMessage(NotificationStatus status) {
//e.g. the client has been unsubscribed and we want to "re-subscribe"
status.confirmSubscription();
}
}


目前无法在方法级别定义映射URL,因此必须 在类型级别完成,并且必须包含终结点的完整路径。​​RequestMapping​


此示例使用三种方法来创建新的 Spring MVC 控制器来处理上面列出的三个请求。挨次 若要解析方法的参数,必须注册自定义参数解析程序。这 下面列出了 XML 配置。​​handleNotificationMessage​

<mvc:annotation-driven>
<mvc:argument-resolvers>
<ref bean="notificationResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>

<aws-messaging:notification-argument-resolver />

元素注册了三个参数解析器:,, 和。​​aws-messaging:notification-argument-resolver​​​​NotificationStatusHandlerMethodArgumentResolver​​​​NotificationMessageHandlerMethodArgumentResolver​​​​NotificationSubjectHandlerMethodArgumentResolver​

5.5. 使用云形成

Amazon SQS 队列和 SNS 主题可以在堆栈中配置,然后由应用程序使用。Spring Cloud AWS 还支持按逻辑名称查找堆栈配置的队列和主题,并解析为物理 名字。以下示例显示了 CloudFormation 模板中的 SNS 主题和 SQS 队列配置。

"LogicalQueueName": {
"Type": "AWS::SQS::Queue",
"Properties": {
}
},
"LogicalTopicName": {
"Type": "AWS::SNS::Topic",
"Properties": {
}
}

逻辑名称,然后可以在配置和应用程序中使用 如下图所示:​​LogicalQueueName​​​​LogicalTopicName​

<aws-messaging:queue-messaging-template default-destination="LogicalQueueName" />

<aws-messaging:notification-messaging-template default-destination="LogicalTopicName" />
@SqsListener("LogicalQueueName")
public void receiveQueueMessages(Person person) {
// Logical names can also be used with messaging templates
this.notificationMessagingTemplate.sendNotification("anotherLogicalTopicName", "Message", "Subject");
}

使用如上例所示的逻辑名称时,可以在不同的环境中创建堆栈,而无需任何 应用程序内的配置或代码更改。

5.6. IAM 权限

Spring Cloud AWS 需要以下 IAM 权限:

将通知发布到主题

​sns:Publish​

要发布通知,您还需要

​sns:ListTopics​

使用批注驱动的 HTTP 通知终结点

​sns:ConfirmSubscription​

授予对 SNS 的访问权限的示例 IAM 策略:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sns:Publish",
"sns:ConfirmSubscription"
],
"Resource": "yourArn"
},
{
"Effect": "Allow",
"Action": "sns:ListTopics",
"Resource": "*"
}
]
}