feign 调用报错(unexpected end of stream on xxx ... executing POST xxx)

1、错误还原

测试环境服务发布成功后,有一个页面是通过 feign 调用另一个服务的,
然后就环境报:
RuntimeException ex=unexpected end of stream on http://xxx:4004/… executing POST http://serverCode/xxxx/list

看到这个报错就去百度这个错误,然后给到的答案都是添加 Feign 拦截器

代码如下:

@Configuration
public class OkHttpConfiguration {
    @Bean
    public OkHttpClient okHttpClient() {
        return new OkHttpClient.Builder()
                //发送异常允许重试请求
                //1、有的人说是加这个好了
                .retryOnConnectionFailure(true)
                //2、有的人是加这里好了
                .addNetworkInterceptor(chain -> {
                    Request build = chain.request().newBuilder().addHeader("Connection", "close").build();
                    return chain.proceed(build);
                })
                .connectionPool(pool())
                //设置连接超时
                .connectTimeout(10000, TimeUnit.SECONDS)
                //设置读超时
                .readTimeout(10000, TimeUnit.SECONDS)
                //设置写超时
                .writeTimeout(10000, TimeUnit.SECONDS)
                .build();
    }
}

上面的 1、2 两点都不是我的问题,我都加了也没有解决问题。

2、解决问题方法追踪

试了各种方法都不行,然后就用 curl 命令直接去服务器访问了接口
访问接口后报了如下的错:
curl: (56) Recv failure: connection reset by peer
这一下子就有了思路了,可能我们这个端口的服务就没有启动。但是 docker 容器是启动的呀。然后就去看了一下端口,发现问题了,springcloud 工程中 bootstrap.yml 的端口配置是的 4009,但是映射的端口是 4004,那可不找不到吗

修改端口号,重启服务。解决问题

3、总结

这个端口号本来就是 4004,有一次调试,本地已经启动了 4004,临时改为 4009,但是后来代码提交测试没有改,所以就导致了这个错。还是要细心检测配置呀这些,尤其是环境的配置,之前有一哥们把测试环境的配置干到生产了,导致损失了几十万…

所以配置的内容要多检查一下,让发布更放心一点。

有遇到同样问题的,可以从 以上 3 点来检查。有的时候可能换一种思路,可能就不一样,比如我的这个,我一直纠结这个问题报错的字面内容,却没有想到是端口映射的问题。

在此记录一下,供有遇到同样问题的地铁参考。


版权声明:本文为yeyinzhu3211原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。