目标功能
多短信服务商(策略)接入
支持配置启用/禁用服务商
可配置默认短信服务商
支持动态切换(如按业务类型、环境等)
可扩展更多服务商/通道
示例配置(application.yml)
sms:
default-provider: aliyun
providers:
aliyun:
enabled: true
app-id: xxx
app-secret: yyy
tencent:
enabled: true
app-id: aaa
app-secret: bbb
huawei:
enabled: false
app-id: 123
app-secret: 456
配置类绑定
@component
@configurationproperties(prefix = "sms")
@data
public class smsproperties {
private string defaultprovider;
private map<string, providerconfig> providers;
@data
public static class providerconfig {
private boolean enabled;
private string appid;
private string appsecret;
}
}
短信发送策略接口
public interface smsprovider {
string getproviderkey(); // aliyun / tencent / huawei
boolean isenabled(); // 是否启用(可从配置读取)
void sendsms(string phone, string message);
}
示例:阿里云 & 腾讯云 实现类
@component
public class aliyunsmsprovider implements smsprovider {
private final smsproperties smsproperties;
public aliyunsmsprovider(smsproperties smsproperties) {
this.smsproperties = smsproperties;
}
@override
public string getproviderkey() {
return "aliyun";
}
@override
public boolean isenabled() {
smsproperties.providerconfig config = smsproperties.getproviders().get(getproviderkey());
return config != null && config.isenabled();
}
@override
public void sendsms(string phone, string message) {
system.out.println("【阿里云】发送短信:" + phone + " - " + message);
// 实际调用 sdk
}
}
@component
public class tencentsmsprovider implements smsprovider {
private final smsproperties smsproperties;
public tencentsmsprovider(smsproperties smsproperties) {
this.smsproperties = smsproperties;
}
@override
public string getproviderkey() {
return "tencent";
}
@override
public boolean isenabled() {
smsproperties.providerconfig config = smsproperties.getproviders().get(getproviderkey());
return config != null && config.isenabled();
}
@override
public void sendsms(string phone, string message) {
system.out.println("【腾讯云】发送短信:" + phone + " - " + message);
// 实际调用 sdk
}
}
动态选择器(默认服务商 + 指定服务商)
@component
public class smsproviderrouter {
private final smsproperties smsproperties;
private final map<string, smsprovider> providermap;
public smsproviderrouter(list<smsprovider> providers, smsproperties smsproperties) {
this.smsproperties = smsproperties;
this.providermap = providers.stream()
.collect(collectors.tomap(smsprovider::getproviderkey, p -> p));
}
public void sendsms(string phone, string message, @nullable string providerkey) {
string key = (providerkey != null) ? providerkey : smsproperties.getdefaultprovider();
smsprovider provider = providermap.get(key);
if (provider == null || !provider.isenabled()) {
throw new illegalstateexception("短信服务商不可用: " + key);
}
provider.sendsms(phone, message);
}
}
接口测试
@restcontroller
@requestmapping("/sms")
public class smscontroller {
private final smsproviderrouter router;
public smscontroller(smsproviderrouter router) {
this.router = router;
}
@postmapping("/send")
public string send(@requestparam string phone,
@requestparam string msg,
@requestparam(required = false) string provider) {
router.sendsms(phone, msg, provider);
return "发送成功";
}
}
测试效果
默认发送(配置的是 aliyun)
post /sms/send?phone=13800138000&msg=测试一波
输出:
【阿里云】发送短信:13800138000 - 测试一波
指定腾讯云发送:
post /sms/send?phone=13800138000&msg=测试一波&provider=tencent
输出:
【腾讯云】发送短信:13800138000 - 测试一波
总结
通过配置驱动 + 策略模式的组合,短信服务切换更灵活,具备:
- 高扩展性(支持无限短信服务商)
- 高可维护性(配置即策略)
- 高可控性(启用、禁用、默认、切换快速搞定)
不仅适用于短信服务,还可拓展到:
- 第三方支付(支付宝 / 微信 / stripe)
- 文件存储(阿里 oss / 腾讯 cos)
- 消息通知(钉钉 / 企业微信 / 飞书)
到此这篇关于springboot基于配置实现短信服务策略的动态切换的文章就介绍到这了,更多相关springboot动态切换短信服务内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论