【问题标题】:Why is returning a Springboot ResponseEntitty so slow?为什么返回 Spring Boot ResponseEntity 这么慢?
【发布时间】:2019-01-24 10:38:57
【问题描述】:

所以我在 API 中构建了这个 springboot REST 消费者。 API 请求依赖于不同的 API。

用户可以向我的 API 发出请求,而我的 API 向另一个服务发出请求以使用户登录。

在构建它时,我得出的结论是,返回 ResponseEntity 比仅在请求正文中返回结果要慢得多。

这是我的快速代码,响应时间不到一秒:

@PostMapping("/adminLogin")
fun adminLogin(@RequestBody credentials: Credentials): AuthResponse {
    return RestTemplate().getForEntity(
            "$authenticatorURL/adminLogin?userName=${credentials.username}&passWord=${credentials.password}",
            AuthResponse::class.java).body
} 

当这样做时,需要花费很多秒来响应:

@PostMapping("/adminLogin")
fun adminLogin(@RequestBody credentials: Credentials): ResponseEntity<AuthResponse> {
    return RestTemplate().getForEntity(
            "$authenticatorURL/adminLogin?userName=${credentials.username}&passWord=${credentials.password}",
            AuthResponse::class.java)
}

有人可以向我解释为什么一种方法比另一种方法更快的区别是什么。

【问题讨论】:

  • 你怎么知道你的函数的返回类型对性能有这么大的影响?也许是第三方服务调用?
  • 这就是我的想法,该服务在我的机器上本地运行。当邮递员直接拨打服务电话时,速度非常快。我知道删除 Response 类型会如何影响性能。
  • 我认为,最终AuthResponse 对象仍然被包裹在ResponseEntity 下面,但这是我的猜测。无论如何,我会为我的好奇心进行一些测试。
  • 看看:pastebin.com/5pE9Dbrs。我创建了简单的 rest api 和一个控制器。两种方法,一种返回String,一种返回ResponseEntity&lt;String&gt;。不是那些是纳米,所以差异很小。
  • 我不确定,但我想,当你不添加 ResponseEntity&lt;type&gt; 时,Spring 无论如何都会添加它,因为你不仅得到了对象,而且你获取响应状态、标头等。

标签: performance spring-boot kotlin


【解决方案1】:

我昨天遇到了同样的问题。问题如下:想象我使用的 API 正在发送这样的 json:

{"id": "12"}

我所做的是将它放入一个 ResponseEntity 中,然后 IdDTO 将 id 字段存储为一个整数。当我将此 ResponseEntity 作为对我的请求的响应返回时,它会返回:

{"id": 12}// notice the absence of string quotes around 12

问题如下:我使用的API发送的Content-Length头等于12,但是经过我的DTO转换后它变成了10。 Spring 不会重新计算内容长度,客户端正在读取您发送的 10 个字符,然后等待其他 2 个字符。它永远不会收到任何内容,并且 Spring 在 1 分钟后关闭连接(这是连接的默认超时)。

如果您创建一个新的响应实体并将数据放入其中,Spring 将计算新的内容长度,它会与您提到的第一个案例一样快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 2019-01-17
    • 2016-11-02
    • 2020-05-02
    • 2018-03-14
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    相关资源
    最近更新 更多