Spring Cloud 数据流 - 休息客户端 - 覆盖 RestTemplate

Posted

技术标签:

【中文标题】Spring Cloud 数据流 - 休息客户端 - 覆盖 RestTemplate【英文标题】:Spring Cloud Data Flow - Rest Client - Override RestTemplate 【发布时间】:2021-09-10 04:30:17 【问题描述】:

我正在使用Spring Cloud Data Flow Task DSL 以编程方式在 Kubernetes 上启动 Spring Cloud Data Flow 任务。

查看spring-cloud-dataflow-rest-client 项目的源代码,我可以看到DataFlowClientAutoConfiguration 类包含一个RestTemplate 实例,它是Autowired。我想传入我自己的RestTemplate 实例,因为我想更改RestTemplate 获取的默认连接超时

为了实现这一点,我创建了自己的独立 Spring Boot 项目,该项目使用 spring-cloud-dataflow-rest-client 作为依赖项,并在我的上下文中创建了一个RestTempalte bean,如下所示:

@SpringBootApplication
public class SpringDataFlowRestClient 

    public static void main(String[] args) 
        SpringApplication.run(SpringDataFlowRestClient.class, args);
    


@Configuration
public class SpringDataFlowRestClientConfiguration 

    @Bean
    public RestTemplate restTemplate() 
        HttpComponentsClientHttpRequestFactory connectionFactory = new HttpComponentsClientHttpRequestFactory();
        connectionFactory.setConnectTimeout(300000);
        RestTemplate restTemplate = new RestTemplate(connectionFactory);
        return restTemplate;
    


我的假设是这会将RestTemplate 的连接超时时间增加到 5 分钟;但是,很明显,DataFlowClientAutoConfiguration 没有获取我的自定义 RestTemplate 实例,因为我看到许多请求在 30 秒内超时,因为我看到了 504 网关错误。 (这就是我一开始想增加超时的原因)

我看到 DataFlowTemplate.java 内部的 cmets 内容如下:

请注意,创建的 RestTemplate 将使用 JDK 的 默认超时值。 考虑传入一个自定义 @link 休息模板

问题那么,我究竟如何覆盖RestTemplate 中的Autowired 实例DataFlowClientAutoConfiguration??

注意:我尝试在我的配置中使用public RestTemplate restTemplate(RestTemplateBuilder builder) bean 方法,但没有帮助。我尝试设置spring.main.allow-bean-definition-overriding=true。我还尝试将@Primary 用于我的RestTemplate bean 方法。最后,我尝试将sun.net.client.defaultConnectTimeout=300000 作为环境变量传递。似乎没有任何效果。我相信我已经用尽了所有我能想到的选项。

【问题讨论】:

【参考方案1】:

我也有同样的情况。我认为这是一个设计缺陷。首先,因为它可以在不注意的情况下向应用程序的主要用途 restTemplate 添加副作用(即身份验证)。此外,可能内部 dataFlowOperations() 应该将所有依赖项作为参数包含在签名中,因此我们可以通过执行类似的操作来引入行为而无需复制所有代码

@Bean
public DataFlowOperations dataFlowOperations()
    return dataFlowClientAutoConfiguration.dataFlowOperations(myCustomRestTemplate(),..);

另一种选择是自动配置中的所有依赖项都是通过构造函数注入的,所以我们可以这样做

@Bean 
public DataflowOperations dataflowOperations()
    return new DataFlowClientAutoConfiguration(restTemplate,...).dataFlowOperations

我认为现在满足我们需求的唯一方法是在本地复制所有 DataFlowOperations autconfiguration,使用反射(我完全固执地批准),或者将特定 dataflowClientRestTemplate 的整个架构更改为 @Primary

【讨论】:

以上是关于Spring Cloud 数据流 - 休息客户端 - 覆盖 RestTemplate的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot在测试时嘲笑其他休息客户端

Spring Cloud Zuul 作为 API 网关

如何从Postman休息客户端发送spring csrf令牌?

简单了解 Spring Cloud 的微服务架构

来自 oauth2 安全休息 Web 服务的 Spring 休息服务 api 调用

在spring boot微服务中,休息调用的调度不工作。