Spring Boot如何基于单配置文件多环境凭证创建多个Amazon SNS客户端
Spring Boot 多环境AmazonSnsClient实例创建方案
1. 绑定多环境AWS配置属性
使用Spring Boot自带的@ConfigurationProperties注解直接读取列表格式的配置,无需额外第三方依赖:
import org.springframework.boot.context.properties.ConfigurationProperties; import java.util.List; @ConfigurationProperties(prefix = "abc") public class AwsEnvProperties { private List<EnvConfig> env; // getter、setter省略,IDE自动生成即可 public List<EnvConfig> getEnv() { return env; } public void setEnv(List<EnvConfig> env) { this.env = env; } public static class EnvConfig { // 可在配置中加abc.env[0].name=DEV用于区分环境,也可直接用下标作为标识 private String name; private AwsConfig aws; // getter、setter省略 public String getName() { return name; } public void setName(String name) { this.name = name; } public AwsConfig getAws() { return aws; } public void setAws(AwsConfig aws) { this.aws = aws; } public static class AwsConfig { private String accessKeyId; private String awsSecretKeyId; // 可按需拓展region、endpoint等配置 private String region; // getter、setter省略 public String getAccessKeyId() { return accessKeyId; } public void setAccessKeyId(String accessKeyId) { this.accessKeyId = accessKeyId; } public String getAwsSecretKeyId() { return awsSecretKeyId; } public void setAwsSecretKeyId(String awsSecretKeyId) { this.awsSecretKeyId = awsSecretKeyId; } public String getRegion() { return region; } public void setRegion(String region) { this.region = region; } } } }
在启动类上添加注解开启配置绑定:
@SpringBootApplication @EnableConfigurationProperties(AwsEnvProperties.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
2. 批量创建AmazonSnsClient实例
在配置类中读取配置列表,生成对应数量的客户端存入Map,注册为Spring Bean:
import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.sns.AmazonSNS; import com.amazonaws.services.sns.AmazonSNSClientBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; @Configuration public class SnsClientConfig { @Resource private AwsEnvProperties awsEnvProperties; @Bean public Map<String, AmazonSNS> amazonSnsClientMap() { Map<String, AmazonSNS> clientMap = new HashMap<>(); for (AwsEnvProperties.EnvConfig envConfig : awsEnvProperties.getEnv()) { // 构造AWS凭证 BasicAWSCredentials credentials = new BasicAWSCredentials( envConfig.getAws().getAccessKeyId(), envConfig.getAws().getAwsSecretKeyId() ); // 构造SNS客户端 AmazonSNS snsClient = AmazonSNSClientBuilder.standard() .withCredentials(new AWSStaticCredentialsProvider(credentials)) // 没有配置region的话可替换为默认值 .withRegion(envConfig.getAws().getRegion() == null ? "cn-north-1" : envConfig.getAws().getRegion()) .build(); // 存入Map,key为环境标识 clientMap.put(envConfig.getName() == null ? "env-" + envConfig : envConfig.getName(), snsClient); } return clientMap; } }
3. 使用方式与常见说明
- 调用客户端:直接注入
Map<String, AmazonSNS> amazonSnsClientMap,根据环境名从Map中取对应客户端即可调用SNS接口 - 关于现成注解:目前Spring Boot和AWS官方Starter没有提供直接批量生成多SNS客户端的注解,上述实现逻辑轻量,完全满足同配置文件存储多环境凭证、启动自动创建客户端的需求
内容的提问来源于stack exchange,提问作者Sweta Sharma
相关产品推荐
相关产品推荐

