适用于亚马逊网络服务的 Spring Cloud
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了适用于亚马逊网络服务的 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 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 开发工具包会记录一条警告消息并出现异常。 可以通过在类上设置日志记录级别来隐藏此警告消息。 logging.level.com.amazonaws.util.EC2MetadataUtils=error 已启用 Ifis,但应用程序未在 EC2 环境中运行,AWS 开发工具包会记录一条警告消息,并显示一条异常消息,这会给应用程序日志添加可能不必要的干扰。 可以通过在类上设置日志记录级别来隐藏此警告消息。 logging.level.com.amazonaws.internal.InstanceMetadataServiceResourceFetcher=error |
2.3.1. 开发工具包凭证配置
为了调用亚马逊云科技,必须为 亚马逊开发工具包配置凭证。Spring Cloud AWS 支持配置特定于应用程序上下文的凭据,这些凭据用于已完成请求的每个服务调用 通过 Spring Cloud AWS 组件,参数存储和密钥管理器配置除外。 因此,整个应用程序上下文必须只有一个凭据配置。
如果没有专用凭据,则由所有客户端使用 提供程序定义。这基本上将使用以下身份验证信息
|
根据总体凭据策略,有不同的选项来配置凭据。可能的描述在 以下各小章。
简单的凭据配置
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 配置以下凭证链:
-
AWSStaticCredentialsProvider
提供国际金融机构cloud.aws.credentials.access-key
-
EC2ContainerCredentialsProviderWrapper
IFIS 设置为cloud.aws.credentials.instance-profile
true
-
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 | | 配置文件所在的文件路径。未提供默认值 toif 值 |
与凭证一样,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 | |
社交网络 | |
SES | |
目录 | |
弹性缓存 | |
云观察 | |
例如:
@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 模板配置用户数据。
下面概述了用于配置用户数据的 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 模板也是如此。
下面概述了用于配置实例标签的 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 id="myCustomClient" 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
参数键 | 春天属性 | spring cloud zuul参数调优
spring cloud微服务快速教程之 Spring Cloud Alibaba--sentinel-限流熔断降级 |