记一次微信小程序登录异常排查:从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;
    }
}

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

相关推荐
candyTong1 天前
Claude Code Agent Teams:多 Agent 协作的生命周期与实现机制
后端·架构
IT_陈寒1 天前
为什么你应该学习JavaScript?
前端·人工智能·后端
淇奥71 天前
【MyBatis-Plus】MyBatis-Plus 学习笔记
后端
_code_bear_1 天前
OpenSpec CLI 与 OPSX 工作流说明
前端·后端·架构
用户8356290780511 天前
使用 Python 在 PowerPoint 中添加并控制音频播放
后端·python
用户8356290780511 天前
使用 Python 在 PowerPoint 中生成并自定义饼图与环形图
后端·python
念何架构之路1 天前
Go语言常见并发模式
开发语言·后端·golang
Cosolar1 天前
大模型应用开发面试 • 第4期|A2A、复杂挑战与具身智能
人工智能·后端·面试
迷渡1 天前
聊一聊 Bun 用 Rust 重写这件事
开发语言·后端·rust
王中阳Go1 天前
秒杀、分库分表、全链路追踪:一个电商微服务的架构全拆解
后端·go