ribbon个性化参数设置

本文探讨了如何通过RibbonRequestCustomizer接口来尝试实现Zuul API网关中针对特定URL的超时时间自定义设置,并提供了一个具体的实现案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当使用zuul作为api网关的时候,默认的ribbon的超时设置是针对整个service的,那么如果想针对某几个url单独设置超时,该怎么办呢?

RibbonRequestCustomizer

package org.springframework.cloud.netflix.ribbon.support;

import java.util.List;

/**
 * @author Spencer Gibb
 */
public interface RibbonRequestCustomizer<B> {
    boolean accepts(Class builderClass);
    void customize(B builder);

    class Runner {

        @SuppressWarnings("unchecked")
        public static void customize(List<RibbonRequestCustomizer> customizers, Object builder) {
            for (RibbonRequestCustomizer customizer : customizers) {
                if (customizer.accepts(builder.getClass())) {
                    customizer.customize(builder);
                }
            }
        }
    }
}

使用

@Bean
    @ConditionalOnClass(name = "org.apache.http.client.methods.RequestBuilder")
    public RibbonRequestCustomizer<RequestBuilder> apacheHttpRibbonRequestCustomizer() {
        return new ApacheHttpClientRibbonRequestCustomizer();
    }

ApacheHttpClientRibbonRequestCustomizer

public class ApacheHttpClientRibbonRequestCustomizer implements RibbonRequestCustomizer<RequestBuilder> {
    @Override
    public boolean accepts(Class builderClass) {
        return builderClass.equals(RequestBuilder.class);
    }

    @Override
    public void customize(RequestBuilder builder) {
        URI uri = builder.getUri();
        String path = uri.getPath(); //"/review/timeout"
        System.out.println("request customizer uri:"+path);
        RequestConfig.Builder configBuilder = builder.getConfig() == null ? RequestConfig.custom():RequestConfig.copy(builder.getConfig());

        if(path.equals("/review/timeout")){
            configBuilder.setConnectionRequestTimeout(30*1000);
            configBuilder.setConnectTimeout(30*1000);
            configBuilder.setSocketTimeout(30*1000);
            builder.setConfig(configBuilder.build());
        }
        //todo 这里设置没有用,最后还是会被重置
        //org/springframework/cloud/netflix/ribbon/apache/RibbonApacheHttpRequest.java 76
        //read config

    }
}

结论

这种方式目前还不能个性化timeout参数,因为最后在RibbonApacheHttpRequest会被重置回来,但是可以添加一些header之类的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值