提问者:小点点

如何在spring为每个客户机配置和构建自定义RestTemplate?


我正在使用spring RestTemplate来执行来自我的应用程序的HTTP请求。 有几种服务我们需要调用,有的在互联网上调用,有的在内网调用,有的快,有的慢。 我已经被指示为每个服务配置自定义设置,基本上,连接超时,读取超时。

这些设置将非常具体例如,托管在intranet上的服务将有2-5秒的超时,而它们为99.9%的请求提供1000ms的SLA。 而其他第三方服务时间约为10-60秒。

由于这些参数只能在模板的工厂中设置,所以我创建了一些具有不同工厂的bean,仅在超时方面有所不同。 像这样的东西:

@Bean
RestTemplate restTemplate() {
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
    factory.setReadTimeout(20000);
    factory.setConnectTimeout(5000);
    RestTemplate restTemplate = new RestTemplate(factory);
}

这恐怕最终会制造一场维修噩梦。 能用更好的方法解决吗?

PS:应用程序是一个调用各种服务的整体。


共2个答案

匿名用户

您必须创建多个RESTTemplate并分配超时,连接池大小。 连接池将极大地提高性能

我已经硬编码了连接属性,您可以从application.properties文件中选择它

@Configuration
class RestTemplateConfigs {
    @Bean
    public HttpClient httpClient() {
        return HttpClientBuilder.create()
                .setMaxConnPerRoute(200)
                .setMaxConnTotal(50)
                .setConnectionTimeToLive(10L, TimeUnit.SECONDS)
                .build();
    }

    @Bean
    @Qualifier("restTemplate1")
    RestTemplate restTemplate() {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient());
        RestTemplate restTemplate = new RestTemplate(factory);
        return restTemplate;
    }
}

您可以创建,创建多个RestTemplates,并使用限定符name自动生成它。

匿名用户

免责声明:我的回答建议使用另一个Http客户机而不是Rest模板--如果您必须使用Rest模板,我的回答将是无关紧要的。

我处理了一个类似的设计问题,下面是我所做的。 我编写了自己的HttpClient类。 与大多数已知的Http客户端相比,它在使用上要简单得多。 这个类可以单独使用,也可以用作一组类(实现相同接口)的父类,其中每个类都是特定Rest服务的Http客户机。 在这个类上,您可以预先设置目标URL和所有参数(如读取和连接超时等)。 一旦预设了这个类,您所需要做的就是调用sendHttpRequestMethod()。 简单扩展一下--让我们假设您有一个带有CRUD API的用户Rest服务,该服务由使用不同HTTP方法的特定URL调用实现,并且可能是不同的URL。 (例如,除了位于http://www.myserver.com:8083/user的create(POST),update(PUT),read(GET)和delete(delete)方法之外,您还将在URL http://www.myserver.com:8083/user/activate/和http://www.myserver.com:8083/user/deactivate中拥有方法activate和deactivate(例如,都是GET)。 因此,在本例中,您的Http客户端将设置所有必需的超时和其他配置,并且它还将具有预先设置的目标URL Http://www.myserver.com:8083/user。 并且它将有六个方法,如上所述,其中每个方法将简单地调用父类方法sendHttpRequest()。 当然,对于activate和deactivate方法,您需要为预先设置的基本URL添加“activate”和“deactivate”后缀。 因此,对于每个REST服务,您可以用非常少的工作量创建一个专用的Http客户机,因为基类已经完成了大部分工作。 除此之外,我还为任何一组实现相同接口的类编写了一个自填充工厂。 使用该工厂,您所要做的就是编写额外的Http客户端,工厂将检测到它,并通过预定义的名称或类的名称(根据您的选择)使它自己可用。 所有这些对我来说都很有效,我将它打包到名为MgntUtils的开源库中,并将其发布在Maven和Github上(带有源代码和JavaDoc.JavaDoc在这里可以获得)。 关于自填充工厂的详细说明可以在这里的Javadoc中看到。 此外,关于库的一般文章可以在这里找到,关于自填充工厂的思想和实现的具体文章可以在这里找到。 源代码中的com.mgnt.lifecycle.management.example包包含一个工作示例。 我希望这能帮上忙。