跨服务调用的熔断器使用Hystrix简单使用
熔断器概述:
1.熔断器就是给服务调用提供的一种基于保护服务的一种判断是否需要断路处理的机制。
2.我们在使用分布式服务或者多个项目的跨项目http调用服务等都存在一种情况,即调用指向的服务报错或者宕机导致调用失败。
3.因为2中情况的存在,所以1才有存在的意义,如果我们对被调用者的返回不进行严格的逻辑判断处理,很可能会导致雪崩(底层向上层逐级报错),所以我们需要对返回结果进行判断处理。
4.简单比对,熔断器比较像 try-catch 运行机制。当 try 中的代码出现异常后不会向上层抛出而是自行在 catch 中处理。后面追加 finally 后则是否有异常并不会影响 finally 中代码执行。
5.虽然 try-catch 很常用,不过缺点也很明显,比如过于耗费服务器资源,降低效率,且无法对异步操作进行有效捕获。
正题前最后一点(熔断机制特点)
1.熔断器拥有默认的半智能判断机制:
当调用服务失败次数超过统计总数的 50% 时会进入自动返回机制,即所以相同服务调用均按失败返回(节省不必要的资源浪费),且会在固定时间内开启重试,即重新尝试发送请求如成功则重新统计,如失败则会继续断开等待下次重试。
2.熔断器有回调机制 fall-back
当调用失败,我们可以自定义返回结果(当然返回类要与正常调用的方法返回类保持一致)
如下
首先我们需要将熔断器开启(如下)
主配置文件 application.yml 中配置
然后需要在基础服务里调用crm服务中的某接口我们需要定义 client 接口(如下)
在 client 调用接口加上 @FeignClient 注解,并且注解需要指定调用的服务 serviceId 以及返回结果处理实现类 fallback。
返回结果实现类即实现 client 接口的实体类(实现了调用方法:当出现熔断时应该返回的内容),如图:
当方法 queryTableFields 调用超时等情况出现,则会进入实现类 CustomerFeignServiceFailure 中执行方法 queryTableFields 中内容。
关于服务的超时时间设置
1.熔断器默认的超时时间是1000ms即1秒,我们可以自定义默认超时时间,也可以指定不同的调用方法分别设置超时时间。
图中表示:在主配置文件 application.yml 中除默认的指定方法外其余方法仍然按着 default 的 6000ms 计算,特殊指定如 GetFileListClient 接口中 getFileList 方法设定了自己的超时时间为 400ms。
2.另外总结下我们在主配置文件中共需要配置一下三项:
(1).即上面说过的 application 中开启 hystrix 的 enable 项;
(2).1中说明的 application 中配置 command 项;
(3).需要注意的是我们还需要配置负载 ribbon 的超时时间(如果不配置或者 ribbon 超时时间短与 hystrix 超时时间则会导致 hystrix 超时设置失效 重试机制失效)
上面就是这次应用总结,很多没用到的地方也没有细说,如果有问题请大家指正。