java 在HTTP 503上重新建立TCP连接

tf7tbtn2  于 2022-12-25  发布在  Java
关注(0)|答案(2)|浏览(155)

我们在部署在k8s集群上的Java应用中使用okhttp。我们的源应用没有启用istio,并使用envoy sidecar连接到目的地。连接链如下所示:
SRC -------〉特使-〉DST
因此,实际上SRC应用程序并不直接与DST应用程序建立连接,而是与其前面的Envoy代理建立连接。当DST应用程序关闭时,它会终止DST与Envoy之间的所有连接。但SRC和Envoy之间的连接仍然打开。这就是SRC应用程序开始收到503错误的原因。SRC发送到DST的另一条消息也收到503,因为我们一直在重用okhttp连接池中建立的空闲连接。这个问题的解决方案是重新建立新的TCP连接,而不是使用连接池中的一个空闲连接。是否可以配置okhttp根据接收到的单个HTTP 503终止整个TCP连接?

afdcj2ne

afdcj2ne1#

像这样的东西应该管用

import okhttp3.OkHttpClient
import okhttp3.Request

fun main() {
  val client = OkHttpClient.Builder()
    .eventListenerFactory(LoggingEventListener.Factory())
    .addNetworkInterceptor { chain ->
      chain.proceed(chain.request()).also { response ->
        println(response.code)
        if (response.code == 503) {
          println("closing")
          chain.connection()?.socket()?.close()
        }
      }
    }
    .build()

  val response1 = client.newCall(Request.Builder().url("https://httpbin.org/get").build()).execute()

  val response2 = client.newCall(Request.Builder().url("https://httpbin.org/status/503").build()).execute()

  val response3 = client.newCall(Request.Builder().url("https://httpbin.org/get").build()).execute()
}
flseospp

flseospp2#

下面是我在Java 17中使用的代码

private final OkHttpClient client = new OkHttpClient.Builder().addNetworkInterceptor(c -> {
    var response = c.proceed(c.request());
    if (response.code() == 503) {
        c.connection().socket().close();
    }
    return response;
}).build();

相关问题