3. 云环境
应用程序通常需要特定于环境的配置信息,尤其是在不断变化的环境中,例如 Amazon 云环境。Spring Cloud AWS 支持在 应用程序上下文使用常见的 Spring 机制,如属性占位符或 Spring 表达式语言。
3.1. 检索实例元数据
实例元数据在 EC2 环境。可以使用提供实例元数据的特殊 HTTP 地址查询元数据。Spring Cloud AWS 使应用程序能够直接在表达式或属性占位符中访问此元数据,而无需调用 外部 HTTP 服务。
3.1.1. 使用 XML 启用实例元数据支持
实例元数据检索支持是通过 XML 元素(如 Spring 中的标准属性占位符)启用的。 以下代码示例演示了如何在应用程序上下文中激活实例元数据支持。
<beans ...>
<aws-context:context-instance-data />
</beans>
无需授权的服务调用即可检索实例元数据,因此上述配置不需要 任何区域或特定于安全配置的配置。 |
3.1.2. 使用 Java 启用实例元数据支持
实例元数据也可以在 Java 配置类中配置,而无需 XML 配置。
下一个示例显示了一个典型的 Spring 类,该类使用@Configuration
org.springframework.cloud.aws.context.config.annotation.EnableInstanceData
@Configuration
@EnableContextInstanceData
public static class ApplicationConfiguration {
}
3.1.3. 在 Spring Boot 中启用实例元数据支持
如果应用程序 在 EC2 实例上运行。
3.1.4. 使用实例元数据
实例元数据可用于 XML、Java 占位符和表达式。下面的示例演示了
XML 文件中的实例元数据,使用占位符以及引用特殊变量的表达式environment
<beans ...>
<bean class="org.springframework.cloud.aws....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>
实例元数据也可以注入 Spring 注解
直接进入 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. 使用 instance 标签
用户配置的属性也可以使用标记而不是用户数据进行配置。标记是上下文中的全局概念 的 Amazon Web Services 并用于不同的服务。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 必须发出经过身份验证的请求,因此它需要 region
和安全配置。还因为实例标签在启动时不可用
在 Application 上下文中,它们只能作为表达式引用,而不能作为占位符引用。该元素定义了一个属性,该属性将在应用程序上下文中为名称创建一个映射。这张地图
然后,可以使用其他 bean 定义的 expression 进行查询。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 客户端来检索实例信息。该元素支持具有 attribute.下一个
example 显示了自定义 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 Cloud 应用程序与 AWS Parameter Store 集成
Spring Cloud 提供对集中配置的支持,当应用程序启动时,可以读取集中配置并将其作为常规 Spring 提供。Parameter Store Configuration 允许您使用此机制
与 AWS Parameter Store 一起使用。PropertySource
只需在 starter module 上添加依赖项即可激活支持。
该支持类似于为 Spring Cloud Config Server 或 Consul 的键值存储提供的支持:
可以将配置参数定义为在所有服务之间共享,也可以针对特定服务共享,并且可以
特定于配置文件。加密的值在检索时将被解密。spring-cloud-starter-aws-parameter-store-config
所有配置参数都是从公共路径前缀中检索的,该前缀默认为 。从那里分享
参数是从默认为 的路径中检索的,而特定于服务的参数使用的路径是
默认为配置的 .您可以使用点和正斜杠来指定名称
的配置键。已激活用户档案的名称将使用分隔符附加到路径中,该分隔符默认为
强调。/config
application
spring.application.name
这意味着,对于默认情况下称为 module 的服务,将查找并使用以下参数:my-service
参数键 | Spring 属性 | 描述 |
---|---|---|
|
|
由启用了 Configuration support (配置支持) 的所有服务共享。可以使用特定于服务或配置文件的属性覆盖。 |
|
|
由启用了 Configuration support 并激活了 Spring 配置文件的所有服务共享。
可以使用特定于服务的属性覆盖。 |
|
|
特定于服务。请注意,键路径中的斜杠将替换为点。 |
|
|
特定于激活 Spring 配置文件时的服务。 |
请注意,此模块不支持将完整的配置文件用作参数值,例如 Spring Cloud Consul 就是这样: AWS 参数值限制为 4096 个字符,因此我们仅支持配置单个 Spring 属性。
您可以在 Spring Cloud 或文件中配置以下设置
(请注意,应用了 Relaxed 属性绑定,因此您不必使用这种确切的语法):bootstrap.properties
bootstrap.yml
财产 | 违约 | 解释 |
---|---|---|
|
|
前缀,表示从 Parameter Store 加载的每个属性的第一级。 值必须以正斜杠开头,后跟一个或多个有效的路径段,或者为空。 |
|
|
定义在所有服务之间共享的属性的上下文的名称 |
|
|
将附加的配置文件与上下文名称分隔开的字符串。只能包含 字母数字字符旁边的点、破折号、正斜杠、反斜杠和下划线。 |
|
|
指示检索参数时是否出现错误导致应用程序启动失败。 |
|
的 configured 值 |
在构造属性以查找此特定服务的路径时使用的名称。 |
|
|
可用于禁用 Parameter Store Configuration 支持,即使自动配置位于 Classpath 上。 |
为了找出在应用程序启动时从 AWS Parameter Store 检索哪些属性,
打开 Logging on Class(登录类)。
|
3.3. 将 Spring Cloud 应用程序与 AWS Secrets Manager 集成
Spring Cloud 提供对集中配置的支持,当应用程序启动时,可以读取集中配置并将其作为常规 Spring 提供。Secrets Manager 配置允许您使用此机制
使用 AWS Secrets Manager。PropertySource
只需在 starter module 上添加依赖项即可激活支持。
该支持类似于为 Spring Cloud Config Server 或 Consul 的键值存储提供的支持:
可以将配置参数定义为在所有服务之间共享,也可以针对特定服务共享,并且可以
特定于配置文件。spring-cloud-starter-aws-secrets-manager-config
所有配置参数都是从公共路径前缀中检索的,该前缀默认为 。从那里分享
参数是从默认为 的路径中检索的,而特定于服务的参数使用的路径是
默认为配置的 .您可以使用点和正斜杠来指定名称
的配置键。已激活用户档案的名称将使用分隔符附加到路径中,该分隔符默认为
强调。/secret
application
spring.application.name
这意味着,对于默认情况下称为 module 的服务,将查找并使用以下参数:my-service
参数键 | 描述 |
---|---|
|
由启用了 Configuration support (配置支持) 的所有服务共享。可以使用特定于服务或配置文件的属性覆盖。 |
|
由启用了 Configuration support 并激活了 Spring 配置文件的所有服务共享。
可以使用特定于服务的属性覆盖。 |
|
特定于服务.. |
|
特定于激活 Spring 配置文件时的服务。 |
您可以在 Spring Cloud 或文件中配置以下设置
(请注意,应用了 Relaxed 属性绑定,因此您不必使用这种确切的语法):bootstrap.properties
bootstrap.yml
财产 | 违约 | 解释 |
---|---|---|
|
|
前缀,指示从 Secrets Manager 加载的每个属性的第一级。 值必须以正斜杠开头,后跟一个或多个有效的路径段,或者为空。 |
|
|
定义在所有服务之间共享的属性的上下文的名称 |
|
|
将附加的配置文件与上下文名称分隔开的字符串。只能包含 字母数字字符旁边的点、破折号、正斜杠、反斜杠和下划线。 |
|
|
指示检索密钥时是否出现错误导致应用程序启动失败。 |
|
的 configured 值 |
在构造属性以查找此特定服务的路径时使用的名称。 |
|
|
可用于禁用 Secrets Manager 配置支持,即使自动配置位于 Classpath 上。 |