Resilience4j是用来替代Hystrix的一个开源组件。

引入依赖:

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
    <version>1.3.1</version>
    <exclusions>
        <exclusion>
            <groupId>io.github.resilience4j</groupId>
            <artifactId>resilience4j-circuitbreaker</artifactId>
        </exclusion>
        <exclusion>
            <groupId>io.github.resilience4j</groupId>
            <artifactId>resilience4j-timelimiter</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-circuitbreaker</artifactId>
    <version>1.3.1</version>
</dependency>
<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-timelimiter</artifactId>
    <version>1.3.1</version>
</dependency>

用Resilience4j实现重试:

1、用@Retry标注调用下游服务的接口方法,用name属性指定这个重试的名称。我们可以针对不同的调用下游服务制定不同的重试策略

@FeignClient(name = "spring-cloud-eureka-client-producer")
@Component
public interface MyInterface {
@Retry(name = "helloRetry")
@PostMapping(value = "/hello")
String hello(@RequestBody Person person);
}

2、在配置文件中添加

resilience4j.retry.retry-aspect-order=1
resilience4j.retry.backends.helloRetry.max-retry-attempts=3
resilience4j.retry.backends.helloRetry.wait-duration=2000
resilience4j.retry.backends.helloRetry.event-consumer-buffer-size=1
resilience4j.retry.backends.helloRetry.enable-exponential-backoff=false
resilience4j.retry.backends.helloRetry.exponential-backoff-multiplier=2
resilience4j.retry.backends.helloRetry.enable-randomized-wait=false
resilience4j.retry.backends.helloRetry.randomized-wait-factor=2
resilience4j.retry.backends.helloRetry.retry-exception-predicate=com.kou.springbooteurekaconsumerdemo.HelloRetryExceptionPredicate

retry-aspect-order指定重试优先级,max-retry-attempts指定最多执行多少次,wait-duration指定上次执行失败后多少毫秒后才重试,

3、新建步骤2中用到的HelloRetryExceptionPredicate类

public class HelloRetryExceptionPredicate implements Predicate<Throwable> {
@Override
public boolean test(Throwable throwable) {
if (throwable instanceof FeignException) {
FeignException e = (FeignException) throwable;
Throwable cause = e.getCause();
return cause instanceof IOException;
}
return false;
}
}

这个类指定了只有调下游服务抛IOException时才重试。当然,我们也可以指定404、50X时也重试。

如果不想为每一个调用都指定重试策略,而是想所有的调用都指定同一个重试策略,那么只需指定所有调用的@Retry注解的name属性值都相同就可以了。

如何实现fallback呢?

用Resilience4j实现断路器:

1、用@CircuitBreaker标注调用下游服务的接口方法,用name属性指定这个重试的名称。我们可以针对不同的调用下游服务制定不同的重试策略

Arrays类与Array类探究的更多相关文章

  1. Arcpy中Geometry类与Array类转换的陷阱

    1.现象说明 使用Arcpy.da.searchcursor得到Geometry,将Geometry转换成Array,再从Array转换回Geometry.若Geometry包含内环,这个过程可能导致 ...

  2. Java集合---Array类源码解析

    Java集合---Array类源码解析              ---转自:牛奶.不加糖 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Prim ...

  3. 使用Array类处理基本数组对象

    java里面的Arrays类有个asList方法,参数是1或多个Object对象,如果传入一个Object数组,则可以将该数组转化为List,但如果传入的是一个基本类型的数据(int,long,sho ...

  4. 数组的定义和使用,理解多维数组和Array类

    数组的作用 在执行程序的过程中,通常会需要存储大量数据.如果只有少量数据,那么通过声明变量,存储到变量中即可.但当我们的数据是20个.40个甚至是100以上时,就意味着需要声明很多变量,这是不现实的, ...

  5. 01 语言基础+高级:1-3 常用API第一部分_day08【String类、static、Arrays类、Math类】

    day08[String类.static.Arrays类.Math类] String类static关键字Arrays类Math类 教学目标能够使用String类的构造方法创建字符串对象能够明确Stri ...

  6. String类、static关键字、Arrays类、 Math类的一些学习心得

    String类 java.lang.String 类代表字符串.Java程序中所有的字符串文字(例如"abc" )都可以被看作是实现此类的实例. 类 String 中包括用于检查各 ...

  7. .NET中string[]数组和List<string>泛型的相互转换以及Array类的Sort()方法(转)

    从string[]转List<string>: " }; List<string> list = new List<string>(str); 从List ...

  8. javascript Array类

    Array类 toString()方法和valueOf()方法,返回特殊的字符串.该字符串是通过对每项调用toString()方法,然后用逗号把它们连接在一起构成的.例如,对具有项"red& ...

  9. C# - 系统类 - Array类

    Array类 ns:System Array是一个抽象类 表示数组 提供了创建.查找.删除.排序.修改等应用于数组的操作 此类没有公有的实例构造函数 可以使用静态方法CreateInstance创建A ...

随机推荐

  1. git三个区域详解

    一.可以将git简单的分为三个区域    1.工作区(working directory)    2.暂缓区(stage index)    3.历史记录区(history) 二.三个区域关系:工作区 ...

  2. hdu 5876 Sparse Graph icpc大连站网络赛 1009 补图最短路

    BFS+链表 代码改自某博客 #include<stdio.h> #include<iostream> #include<algorithm> #include&l ...

  3. swift中JSon数据的处理

    import UIKit class MainTabBarViewController: UITabBarController { override func viewDidLoad() { supe ...

  4. sftp配置多用户权限

    sftp配置多用户权限   工作需要,用户上传文件到目录下,用ftp不太安全,选择sftp.让用户在自己的home目录下活动,不能ssh到机器进行操作.   下面开始干活. 查看ssh版本 ssh - ...

  5. pickView不需要明确设置高度

    pickView不用设置高度,若设置了,在iOS8.4.1上不会被填充,会造成没有把pickView高度设置成你想要的,但是布局其他地方的时候却会从你设置的地方开始,就会造成布局不紧挨着或者遮盖着的效 ...

  6. mysql5.6 online ddl—索引

    尝试对mysiam表(1500万)删除索引失败 #uk表字段类型比较简单,都是int/tinyint/timestamp类型. CREATE TABLE `uk` (  `id` int(11) NO ...

  7. MyBatis 多表联合查询,字段重复的解决方法

    MyBatis 多表联合查询,两张表中字段重复时,在配置文件中,sql语句联合查询时使用字段别名,resultMap中对应的column属性使用相应的别名: <resultMap type=&q ...

  8. 正则表达式:reg.test is not a function

    正则中 比如 var reg = "/^[0-9]$/" 会报 reg.test is not a function 如果 var reg = /^[0-9]$/ 就不会有错 因为 ...

  9. 数组按时间(字符串->Date)排序

    不说了 ,直接上代码.Talk is cheap , show me the code. NSArray *stortedArray = [wkSelf.dataArray sortedArrayUs ...

  10. 第一次点击button, view视图出现;第二次点击button,view视图消失

    主要思想:点击一下按钮选中Yes,View出现,再点击一下选中为No  view消失