为Spring Cloud Ribbon/Zuul配置请求重试

以下配置基于spring boot版本1.4.5.RELEASE,spring cloud版本采用Camden.SR6。

工程环境如下:

Paste_Image.png

可以看到,compute-service服务包含了两个实例,实例1的端口号为2221、实例2的端口号2222。
通过http://localhost:3333/add访问的时候,如果使用的是实例1,返回30;如果使用的是实例2,返回150;通过重复刷新http://localhost:3333/add,交替返回30和150,可以发现,此时通过ribbon,已经实现了客户端负载均衡。

此时,关闭实例2,再次不断刷新http://localhost:3333/add,会交替返回30和“Whitelabel Error Page”的异常页面。可见,在访问到实例2的时候,直接返回了“Connection refused”的问题。

为了解决这个问题,需要加入重试机制,在访问到实例2的时候, 遇到“Connection refused”,能够向实例1发起重试请求,从而返回正确结果。

在ribbon工程的application.xml文件里面,加入如下配置:

# 重试机制
spring.cloud.loadbalancer.retry.enabled = true

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 10000

compute-service.ribbon.ConnectTimeout = 250
compute-service.ribbon.ReadTimeout = 1000

# 对所有操作请求都进行重试
compute-service.ribbon.OkToRetryOnAllOperations = true

# 切换实例的重试次数
compute-service.ribbon.MaxAutoRetriesNextServer = 2

# 对当前实例的重试次数
compute-service.ribbon.MaxAutoRetries = 1

按照之前的步骤测试,仍然交替返回30和“Whitelabel Error Page”的异常页面,可见重试机制并未起效。

此时,在pom文件加入spring-boot-starter-actuator模块

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

重启ribbon工程,观察http://localhost:3333/autoconfig,在negativeMatches下面,找到如下配置:

Paste_Image.png

可以看到,这里给出的提示是:RibbonAutoConfiguration.loadBalancedRetryPolicyFactory方法没有找到RetryTemplate的依赖。
通过观察RibbonAutoConfiguration类的源码,可以看到如下代码:

@Bean
@ConditionalOnClass(name = "org.springframework.retry.support.RetryTemplate")
public LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory(SpringClientFactory clientFactory) {
    return new RibbonLoadBalancedRetryPolicyFactory(clientFactory);
}

可见,在存在RetryTemplate依赖的前提下,才能获得有效的ribbon负载均衡重试策略工厂。
接下来,在pom文件,加入spring-retry的依赖:

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>

重启ribbon工程,重复刷新http://localhost:3333/add,在compute-service服务的实例1和实例2都正常的情况下,交替返回30和150;
此时,关闭实例2,再次重复刷新http://localhost:3333/add,会发现,一直返回30。只是,有时候会有1秒左右的延时,可见此时是在向实例2请求的时候,发生了“Connection refused”,然后再向实例1重试发送请求。
可见,重试机制已经生效。

此时,再观察http://localhost:3333/autoconfig,在negativeMatches下面,会看到如下配置:

Paste_Image.png

通过观察RibbonAutoConfiguration类的源码,可以看到如下代码:

@Bean
@ConditionalOnMissingClass(value = "org.springframework.retry.support.RetryTemplate")
public LoadBalancedRetryPolicyFactory neverRetryPolicyFactory() {
    return new LoadBalancedRetryPolicyFactory.NeverRetryFactory();
}

可见,要让重试机制不生效,需要去掉RetryTemplate的依赖。
继续跟踪LoadBalancedRetryPolicyFactory的源码

public interface LoadBalancedRetryPolicyFactory {

    public LoadBalancedRetryPolicy create(String serviceId, ServiceInstanceChooser serviceInstanceChooser);

    static class NeverRetryFactory implements LoadBalancedRetryPolicyFactory {

        @Override
        public LoadBalancedRetryPolicy create(String serviceId, ServiceInstanceChooser serviceInstanceChooser) {
            return null;
        }
    }
}

发现NeverRetryFactory的工厂方法直接返回了null,说明并未使用任何的重试策略机制。
可见,在不引入spring-retry的情况下,是不会让重试策略生效的。

为Zuul配置请求重试的方式,与Ribbon完全一致。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容