问题背景
某天,线上环境突然出现大量微信小程序登录失败的问题,用户反馈无法正常登录。查看日志发现大量 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
经验教训
-
不要完全依赖运营商DNS:运营商DNS服务器偶尔会出现故障,建议配置多个备用DNS服务器
-
DNS配置要定期检查:定期验证DNS服务器的可用性,避免单点故障
-
应用层增加容错机制 :在代码中捕获
UnknownHostException异常,提供友好的错误提示和重试机制 -
监控告警要完善:对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;
}
}
通过这次排查,我们不仅解决了问题,还完善了系统的容错能力和监控体系,为后续的稳定性保障打下了坚实基础。