Feign调用500错误如何有效记录一次?

2026-05-17 03:221阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计523个文字,预计阅读时间需要3分钟。

Feign调用500错误如何有效记录一次?

前言+最近某个应用在服务期间使用Feign时直接调用500+status返回,严重影响公司业务进行。+报错如下:+分析思路:找到问题原因+跟踪了feign源码发现报错是在response中返回的,然后查看返回

前言

最近某个应用在服务间使用Feign时一直报500 status reading,严重影响到公司业务进行。

报错如下:

分析思路 找到问题原因

首先跟踪了feign源码发现报错是在response中返回的,然后查看被调用方无任何日志信息。此时判断非业务异常返回。

再确认非业务异常后,通过tcpdump将tcp信息导出得到以下信息

拿到报文后,显示自己调用该接口来测试是否报错,但无论如何都调用成功,在经过一段时间折腾后发现host与tcp的请求地址不一致,为什么会出现这种情况?

Feign调用500错误如何有效记录一次?

johnfeng.github.io/blog/2015/06/30/okhttp-updates-post-wouldnt-be-allowed-to-have-null-body/ inputBody = new byte[0]; } } RequestBody body = inputBody != null ? RequestBody.create(mediaType, inputBody) : null; requestBuilder.method(input.httpMethod().name(), body); return requestBuilder.build(); }

此时还有一个以为为何原来的不报错呢?同样跟踪下原来的代码,最终跟踪到Client#``convertAndSend

for (String field : request.headers().keySet()) { if (field.equalsIgnoreCase("Accept")) { hasAcceptHeader = true; } for (String value : request.headers().get(field)) { if (field.equals(CONTENT_LENGTH)) { if (!gzipEncodedRequest && !deflateEncodedRequest) { contentLength = Integer.valueOf(value); connection.addRequestProperty(field, value); } } else { // 这里面进行了一些受限header的屏蔽 connection.addRequestProperty(field, value); } } }

public synchronized void addRequestProperty(String var1, String var2) { if (!this.connected && !this.connecting) { if (var1 == null) { throw new NullPointerException("key is null"); } else { // 判断是否允许的外部扩展头 if (this.isExternalMessageHeaderAllowed(var1, var2)) { this.requests.add(var1, var2); if (!var1.equalsIgnoreCase("Content-Type")) { this.userHeaders.add(var1, var2); } } } } else { throw new IllegalStateException("Already connected"); } }

private static final String[] restrictedHeaders = new String[]{"Access-Control-Request-Headers", "Access-Control-Request-Method", "Connection", "Content-Length", "Content-Transfer-Encoding", "Host", "Keep-Alive", "Origin", "Trailer", "Transfer-Encoding", "Upgrade", "Via"}; private boolean isRestrictedHeader(String var1, String var2) { if (allowRestrictedHeaders) { return false; } else { var1 = var1.toLowerCase(); // 包含了content-length if (restrictedHeaderSet.contains(var1)) { return !var1.equals("connection") || !var2.equalsIgnoreCase("close"); } else { return var1.startsWith("sec-"); } } }

至此所有疑团消失。完结撒花!

本文共计523个文字,预计阅读时间需要3分钟。

Feign调用500错误如何有效记录一次?

前言+最近某个应用在服务期间使用Feign时直接调用500+status返回,严重影响公司业务进行。+报错如下:+分析思路:找到问题原因+跟踪了feign源码发现报错是在response中返回的,然后查看返回

前言

最近某个应用在服务间使用Feign时一直报500 status reading,严重影响到公司业务进行。

报错如下:

分析思路 找到问题原因

首先跟踪了feign源码发现报错是在response中返回的,然后查看被调用方无任何日志信息。此时判断非业务异常返回。

再确认非业务异常后,通过tcpdump将tcp信息导出得到以下信息

拿到报文后,显示自己调用该接口来测试是否报错,但无论如何都调用成功,在经过一段时间折腾后发现host与tcp的请求地址不一致,为什么会出现这种情况?

Feign调用500错误如何有效记录一次?

johnfeng.github.io/blog/2015/06/30/okhttp-updates-post-wouldnt-be-allowed-to-have-null-body/ inputBody = new byte[0]; } } RequestBody body = inputBody != null ? RequestBody.create(mediaType, inputBody) : null; requestBuilder.method(input.httpMethod().name(), body); return requestBuilder.build(); }

此时还有一个以为为何原来的不报错呢?同样跟踪下原来的代码,最终跟踪到Client#``convertAndSend

for (String field : request.headers().keySet()) { if (field.equalsIgnoreCase("Accept")) { hasAcceptHeader = true; } for (String value : request.headers().get(field)) { if (field.equals(CONTENT_LENGTH)) { if (!gzipEncodedRequest && !deflateEncodedRequest) { contentLength = Integer.valueOf(value); connection.addRequestProperty(field, value); } } else { // 这里面进行了一些受限header的屏蔽 connection.addRequestProperty(field, value); } } }

public synchronized void addRequestProperty(String var1, String var2) { if (!this.connected && !this.connecting) { if (var1 == null) { throw new NullPointerException("key is null"); } else { // 判断是否允许的外部扩展头 if (this.isExternalMessageHeaderAllowed(var1, var2)) { this.requests.add(var1, var2); if (!var1.equalsIgnoreCase("Content-Type")) { this.userHeaders.add(var1, var2); } } } } else { throw new IllegalStateException("Already connected"); } }

private static final String[] restrictedHeaders = new String[]{"Access-Control-Request-Headers", "Access-Control-Request-Method", "Connection", "Content-Length", "Content-Transfer-Encoding", "Host", "Keep-Alive", "Origin", "Trailer", "Transfer-Encoding", "Upgrade", "Via"}; private boolean isRestrictedHeader(String var1, String var2) { if (allowRestrictedHeaders) { return false; } else { var1 = var1.toLowerCase(); // 包含了content-length if (restrictedHeaderSet.contains(var1)) { return !var1.equals("connection") || !var2.equalsIgnoreCase("close"); } else { return var1.startsWith("sec-"); } } }

至此所有疑团消失。完结撒花!