当前位置: 首页 > 知识库问答 >
问题:

在HTTP 503上重新建立传输控制协议

何向荣
2023-03-14

我们在部署在k8s集群上的Java应用程序中使用okhttp。我们的源应用程序没有启用istio,并通过特使sidecar连接到目的地。连接链如下所示:

SRC--------

因此,实际上SRC应用程序并不是直接与DST应用程序建立连接,而是与它前面的代理建立连接。当DST应用程序关闭时,它会终止DST和特使之间的所有连接,但SRC和特使之间的连接保持打开状态。这就是为什么SRC应用程序开始收到503个错误。从SRC到DST的另一条消息也得到503,因为我们一直在重用在okhttp的连接池中建立的空闲连接。这个问题的解决方案是重新建立新的TCP连接,而不是使用连接池中的一个空闲连接。是否可以根据收到的单个HTTP 503将okhttp配置为终止整个TCP连接?

共有1个答案

沈高峻
2023-03-14

这样的办法应该行得通

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()
}
 类似资料:
  • 我正在尝试创建一个bukkit插件,当事件触发时,它将连接到tcp服务器并发送消息。 我已经掌握了基础知识,但我错过了一些东西,我不知道从这里开始。我可以看到该插件与服务器建立了连接,但随后抛出错误并且没有发送任何消息。 我正在尝试理解当事件发生时如何向tcp客户端发送字符串。为了测试,我使用了玩家移动事件。 当我启动时,我在craftbukkit服务器日志中看到以下内容: 当我与我的世界客户端连

  • 以下是我试图实现的目标:我有一个TCP客户端,需要连接到我们的服务器应用程序,但我需要通过HTTPS进行通信。据我所知,这可以通过反向(或正向?)代理如下: 我使用以下vhost配置成功创建了一个不带SSL的代理: (我不确定这些参数中是否有任何一个是不必要的tbh) 使用该vhost,我可以像这样启动与服务器的tcp连接: 一旦我添加SSL并使用端口443,我就无法再连接了: 如果我尝试连接到此

  • Git 可以通过两种主要的方式在版本库之间传输数据:“哑(dumb)”协议和“智能(smart)”协议。 本节将会带你快速浏览这两种协议的运作方式。 哑协议 如果你正在架设一个基于 HTTP 协议的只读版本库,一般而言这种情况下使用的就是哑协议。 这个协议之所以被称为“哑”协议,是因为在传输过程中,服务端不需要有针对 Git 特有的代码;抓取过程是一系列 HTTP 的 GET 请求,这种情况下,客

  • Hprose 远程过程调用(RPC)通讯可以在任何底层网络协议上传输。例如 HTTP,TCP 或 UNIX socket。 HTTP 绑定 当 hprose 远程过程调用(RPC)工作于 HTTP 之上时,hprose 远程过程调用(RPC)的数据作为 POST 请求的 body 部分发送,以响应的 body 部分返回。 Hprose 远程过程调用(RPC) 对 HTTP 的头部(head)没有任

  • 问题内容: 对于急躁的人: 如何改变的价值在Linux中单个连接,使用,或者这样,或者是这可能吗? 较长的脱毛: 我正在开发一个使用长时间轮询HTTP请求的应用程序。在服务器端,需要知道客户端何时关闭连接。精度并不严格,但肯定不能为15分钟。接近一分钟就可以了。 对于不熟悉此概念的用户,长轮询HTTP请求的工作方式如下: 客户端发送请求 服务器使用HTTP标头进行响应,但响应保持打开状态。使用分块

  • 1. Homebase over TCP 1.1. 通讯协议 1.2. 连接过程 1.3. 指令 1.3.1. method:list 1.3.2. method:execute 1.3.3. method:command 1.1. 通讯协议 通讯基于 JSON-RPC 2.0,使用 TCP 短连接 成功返回 jsonrpc {string} 必须为"2.0" id {string} 必须与请求对