【问题标题】:Re-establish TCP connection on HTTP 503在 HTTP 503 上重新建立 TCP 连接
【发布时间】:2021-02-18 04:15:09
【问题描述】:

我们在部署在 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 连接?

【问题讨论】:

    标签: java http okhttp istio


    【解决方案1】:

    这样的东西应该可以工作

    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()
    }
    

    【讨论】:

    • 我喜欢在 Kotlin 中回答 Java 问题!!!我非常喜欢 Kotlin。
    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 2014-08-30
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2016-01-16
    • 2021-04-21
    相关资源
    最近更新 更多