一、系统架构设计
1.1 整体架构概述
本系统采用Springboot作为后端框架,结合微信公众平台API实现消息推送功能。系统分为三大部分:数据采集层(天气API接口)、业务处理层(Springboot服务)和消息推送层(微信公众平台)。
数据采集层通过调用第三方天气服务API获取实时天气数据,业务处理层对数据进行格式化处理并生成早安问候语,消息推送层负责将最终内容通过微信模板消息发送给用户。系统采用RESTful API设计风格,各模块间通过HTTP协议进行通信。
1.2 技术选型依据
选择Springboot框架主要基于以下考虑:
- 内置Tomcat容器,简化部署流程
- 自动配置特性减少开发工作量
- 完善的依赖管理系统(Maven/Gradle)
- 活跃的社区支持和丰富的插件生态
微信公众平台API提供稳定的消息推送能力,其模板消息机制可自定义消息内容格式,满足个性化推送需求。天气数据源选用和风天气API,提供JSON格式的标准化数据接口。
二、核心功能实现
2.1 微信公众平台配置
- 申请微信公众号服务号(需认证)
- 配置服务器地址(URL)、Token和EncodingAESKey
- 启用模板消息功能,申请”早安问候”模板
- 设置IP白名单(开发阶段可设为0.0.0.0/0)
关键配置代码示例:
@Configurationpublic class WeChatConfig {@Value("${wechat.appId}")private String appId;@Value("${wechat.appSecret}")private String appSecret;@Beanpublic WxMpService wxMpService() {WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl();config.setAppId(appId);config.setSecret(appSecret);// 其他配置...WxMpService service = new WxMpServiceImpl();service.setWxMpConfigStorage(config);return service;}}
2.2 天气数据获取
通过HTTP客户端调用天气API,建议使用OkHttp或RestTemplate。数据解析采用Jackson库处理JSON响应。
天气服务实现示例:
@Servicepublic class WeatherService {private static final String WEATHER_API = "https://devapi.qweather.com/v7/weather/now";@Value("${weather.key}")private String apiKey;public WeatherData getWeather(String city) {String url = WEATHER_API + "?location=" + city + "&key=" + apiKey;ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);ObjectMapper mapper = new ObjectMapper();WeatherResponse weatherResponse = mapper.readValue(response.getBody(), WeatherResponse.class);return convertToWeatherData(weatherResponse);}// 数据转换方法...}
2.3 消息生成逻辑
早安问候语生成算法包含:
- 时间判断(6
00发送) - 天气状况适配(雨天提醒带伞,晴天建议防晒)
- 节假日特殊处理
- 用户个性化标签插入
模板消息示例:
{"touser": "OPENID","template_id": "TEMPLATE_ID","data": {"first": {"value": "早安,{{name}}!"},"keyword1": {"value": "{{date}}"},"keyword2": {"value": "{{weather}}"},"keyword3": {"value": "{{temperature}}℃"},"remark": {"value": "{{advice}}"}}}
三、定时任务实现
3.1 Spring Task配置
在启动类添加@EnableScheduling注解,创建定时任务类:
@Componentpublic class MorningTask {@Autowiredprivate WeChatService weChatService;@Scheduled(cron = "0 0 7 * * ?") // 每天7点执行public void sendMorningGreeting() {List<User> users = userService.getAllSubscribers();users.forEach(user -> {WeatherData weather = weatherService.getWeather(user.getCity());String message = generateMessage(user, weather);weChatService.sendTemplateMessage(user.getOpenId(), message);});}// 消息生成方法...}
3.2 分布式锁实现
为防止集群环境下重复推送,需实现分布式锁:
@Componentpublic class DistributedLock {private final RedisTemplate<String, String> redisTemplate;public boolean tryLock(String key, long expire) {Boolean success = redisTemplate.opsForValue().setIfAbsent(key, "locked", expire, TimeUnit.SECONDS);return Boolean.TRUE.equals(success);}public void unlock(String key) {redisTemplate.delete(key);}}
四、部署与优化
4.1 服务器配置建议
- 推荐使用CentOS 7+系统
- Java环境:JDK 11+
- 内存配置:至少2GB(生产环境建议4GB+)
- 定时任务建议使用cron表达式而非固定延迟
4.2 性能优化方案
- 天气API调用缓存:对相同城市的查询结果缓存1小时
- 异步消息发送:使用@Async注解实现异步推送
- 批量用户处理:分批(每批100人)处理用户列表
- 错误重试机制:对失败推送进行3次重试
4.3 监控告警设置
- 推送成功率监控(Prometheus+Grafana)
- 天气API调用次数统计
- 异常日志收集(ELK栈)
- 微信接口错误码告警
五、扩展功能建议
- 用户地理位置自动获取:通过微信JS-SDK获取用户位置
- 多语言支持:根据用户设置发送不同语言的问候
- 语音消息推送:使用微信语音接口发送语音问候
- 互动功能开发:用户回复触发特定操作
- 数据分析看板:统计推送效果和用户行为
六、安全注意事项
- 严格校验微信服务器验证请求
- 对用户OpenID进行加密存储
- 限制API调用频率(微信接口有QPS限制)
- 定期更换Token和EncodingAESKey
- 实现IP访问限制(Nginx层)
本系统通过Springboot框架实现了高效稳定的微信消息推送服务,结合天气API数据提供个性化问候。实际部署时需注意微信公众平台的接口调用限制(模板消息每日上限10万次),建议根据用户规模合理规划推送策略。对于百万级用户系统,可考虑使用消息队列(RabbitMQ/Kafka)进行削峰填谷处理。