springcloud openfeign 请求报错 java.net.UnknownHostException:

现象

背景

项目内部服务之间使用openfeign通过eureka注册中心进行服务间调用,与外部通过http直接调用。外部调用某个业务方提供的接口需要证书校验,因对方未提供证书故设置了忽略证书校验代码如下

java 复制代码
@Configuration
public class IgnoreHttpsSSLClient {

@Bean
@ConditionalOnMissingBean
public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
SpringClientFactory clientFactory) throws NoSuchAlgorithmException, KeyManagementException {
SSLContext ctx = SSLContext.getInstance("SSL");
X509TrustManager tm = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}

@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}

@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
ctx.init(null, new TrustManager[]{tm}, null);
return new LoadBalancerFeignClient(new Client.Default(ctx.getSocketFactory(),
new HostnameVerifier() {

@Override
public boolean verify(String hostname, SSLSession session) {
// TODO Auto-generated method stub
return true;
}
}),
cachingFactory, clientFactory);
}

}

看着没毛病,但@Configuration注解其实是对所有的feignclient都做了忽略证书处理。不过不要紧,因为其他服务都不需要证书,如此,程序运行了很久,终于一次架构升级的需求到来,开发人员升级完版本上述代码出现了编译错误,因时间久远某些jar发生了变更,不得已开发人员删除了部分内容,更新了代码然后没经过充分测试上线了,bug如期产生了,更新代码如下

java 复制代码
@Configuration
public class IgnoreFeignHttpsSSLClient {
@Bean
@ConditionalOnMissingBean
public Client feignClient() {
try {
SSLContext ctx = SSLContext.getInstance("SSL");
X509TrustManager tm = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
ctx.init(null, new TrustManager[]{tm}, null);
return new Client.Default(ctx.getSocketFactory(), (hostname, session) -> true);
} catch (Exception e) {
return null;
}
}
}

给各位3s秒钟能看出问题么,好了公布答案feignclient 由LoadBalancerFeignClient 更改成了默认feignclient导致服务间调用全都走http调用所以报了java.net.UnknownHostException。

解决方法

产生问题根本原因是应用@configuration注解作用了所有feignclient,那解决方案很简单删掉这个注解即可。

相关推荐
晨曦中的暮雨13 分钟前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
文丑颜不良啊2 小时前
LeetCode876~900题目解析
java·leetcode
aloha_7892 小时前
Java 基础、集合、异常与 JUnit 5 速查
java·junit·sqlserver
知守观3 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
独隅3 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
Wang's Blog3 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
SL_staff3 小时前
JVS私有化文档系统上线避坑指南:5大运维与业务协同断点及检测加固实践
java·开源·全栈
FinelyYang5 小时前
考试系统简答题 AI 阅卷:覆盖度驱动、异步评分与人机协同落地实践
java·大数据·人工智能
hhhjhl5 小时前
Yup 跨端三方库仓颉适配全流程
java·开发语言
用户3126874877205 小时前
Java 对象内存布局:压缩指针、对齐填充与 JOL 实测
java