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

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

相关推荐
XXOOXRT3 小时前
基于SpringBoot的加法计算器
java·spring boot·后端·html5
moxiaoran57534 小时前
Go语言的错误处理
开发语言·后端·golang
短剑重铸之日9 小时前
《7天学会Redis》特别篇: Redis分布式锁
java·redis·分布式·后端·缓存·redission·看门狗机制
小北方城市网10 小时前
SpringBoot 全局异常处理与接口规范实战:打造健壮可维护接口
java·spring boot·redis·后端·python·spring·缓存
hanqunfeng10 小时前
(三十三)Redisson 实战
java·spring boot·后端
小北方城市网11 小时前
SpringBoot 集成 MyBatis-Plus 实战(高效 CRUD 与复杂查询):简化数据库操作
java·数据库·人工智能·spring boot·后端·安全·mybatis
hanqunfeng12 小时前
(四十)SpringBoot 集成 Redis
spring boot·redis·后端
小北方城市网13 小时前
SpringBoot 集成 MinIO 实战(对象存储):实现高效文件管理
java·spring boot·redis·分布式·后端·python·缓存
程序员泠零澪回家种桔子13 小时前
RAG自查询:让AI精准检索的秘密武器
人工智能·后端·算法
曹轲恒13 小时前
SpringBoot配置文件(1)
java·spring boot·后端