记一次微信小程序登录异常排查:从UnknownHostException到DNS解析失败

问题背景

某天,线上环境突然出现大量微信小程序登录失败的问题,用户反馈无法正常登录。查看日志发现大量 UnknownHostException: api.weixin.qq.com异常,但奇怪的是,其他业务接口都能正常访问。

错误信息

vbscript 复制代码
org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://api.weixin.qq.com/sns/jscode2session": api.weixin.qq.com; nested exception is java.net.UnknownHostException: api.weixin.qq.com

排查过程

第一步:基础网络连通性测试

首先在服务器上执行基础网络测试:

bash 复制代码
# 测试域名解析
ping api.weixin.qq.com
# 输出:unknown host

# 使用dig工具测试DNS解析
dig api.weixin.qq.com
# 输出:connection timed out; no servers could be reached

dig命令的 connection timed out提示非常关键,说明服务器无法连接到配置的DNS服务器。

第二步:检查DNS配置

查看当前DNS配置:

bash 复制代码
cat /etc/resolv.conf

输出结果:

复制代码
nameserver 183.60.83.19
nameserver 183.60.82.98

第三步:验证DNS服务器可达性

测试配置的DNS服务器是否可达:

bash 复制代码
ping 183.60.83.19
# 输出:Destination Host Unreachable

ping 183.60.82.98
# 输出:Destination Host Unreachable

确认问题:​配置的DNS服务器不可达

第四步:使用公共DNS测试

为了确认不是微信API的问题,使用Google的公共DNS进行测试:

css 复制代码
dig @8.8.8.8 api.weixin.qq.com

输出结果正常,能够正确解析到微信API的IP地址,说明微信API本身没有问题。

解决方案

修改DNS配置

编辑 /etc/resolv.conf文件,将不可达的DNS服务器替换为可靠的公共DNS:

bash 复制代码
# 备份原配置
cp /etc/resolv.conf /etc/resolv.conf.bak

# 编辑配置文件
vi /etc/resolv.conf

修改内容为:

复制代码
nameserver 114.114.114.114
nameserver 8.8.8.8
nameserver 223.5.5.5

验证修复效果

bash 复制代码
# 测试域名解析
dig api.weixin.qq.com
# 输出:正常返回IP地址

# 测试网络连通性
ping api.weixin.qq.com
# 输出:正常响应

重启应用后,微信小程序登录功能恢复正常。

问题总结

问题类型

具体表现

根本原因

解决方案

DNS解析失败

UnknownHostException

配置的DNS服务器不可达

更换为公共DNS服务器

网络连通性

域名无法解析

运营商DNS服务器故障

使用114.114.114.114等备用DNS

经验教训

  1. 不要完全依赖运营商DNS​:运营商DNS服务器偶尔会出现故障,建议配置多个备用DNS服务器

  2. DNS配置要定期检查​:定期验证DNS服务器的可用性,避免单点故障

  3. 应用层增加容错机制 ​:在代码中捕获 UnknownHostException异常,提供友好的错误提示和重试机制

  4. 监控告警要完善​:对DNS解析失败、网络连通性异常等关键指标设置监控告警

代码层面的优化建议

在Spring Boot应用中,可以在调用微信API的地方增加异常处理和重试机制:

less 复制代码
@Retryable(value = {ResourceAccessException.class}, maxAttempts = 3, backoff = @Backoff(delay = 1000))
public WxSessionInfo getWxSession(String code) {
    try {
        return restTemplate.getForObject(url, WxSessionInfo.class);
    } catch (ResourceAccessException e) {
        log.error("微信API调用失败,域名解析异常", e);
        throw e;
    }
}

通过这次排查,我们不仅解决了问题,还完善了系统的容错能力和监控体系,为后续的稳定性保障打下了坚实基础。

相关推荐
陈随易4 小时前
pm2 替代品,nodejs&bun 线上部署必备工具
前端·后端·程序员
丘山一郎5 小时前
Spring 中的IOC控制反转 和DI依赖注入
java·后端·spring
码视野5 小时前
基于 Spring Boot + Vue3 的【大学英语四六级 (CET-4/6) 作文智能评分与句式润色系统】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端·vue3
MetaLite5 小时前
Spring-AOP自调用为什么失效-AopContext真能解决吗
java·后端·spring
MC皮蛋侠客6 小时前
Tauri 2.x 系列(五):调用系统 API——官方插件、Rust crate 与原生能力
开发语言·后端·rust
Profile排查笔记7 小时前
指纹浏览器怎么设置 IP?代理配置、检测与排错流程
前端·人工智能·后端·自动化
IT_陈寒8 小时前
SpringBoot自动配置失效?你可能漏了这个小开关
前端·人工智能·后端
摇滚侠9 小时前
《SpringBoot 3:入门与应用实战》第 9 章 使用 WebMvc 开发应用 阅读笔记 1
spring boot·笔记·后端
用户8356290780519 小时前
使用 Python 在 Excel 中插入 OLE 对象
后端·python
程序员小八7779 小时前
Go 语言特性
开发语言·后端·golang