Hystrix是一个实现断路器模式的库。什么是断路器模式呢?就像我们家庭中的电闸一样,如果有那一处出现意外,那么电闸就会立刻跳闸来防止因为这一处意外而引起更大的事故,直到我们确认处理完那一处意外后才可以再打开电闸。而Hystrix的存在就是为了预防程序中出现这种问题而导致程序不可用的情况。

比如说我们有三个微服务 A、B、C,其中A依赖于B,B依赖于C,如果这时候C出现了问题,那么就导致B不可用,紧接着A也不可用,更有可能导致整个系统不可用。我们接下来就来看看如何利用Hystrix预防这种情况

创建项目

首先我们复制一份cloud-demo-consumer项目,改名为cloud-demo-consumer-hystrix

引入Hystrix的依赖

       <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

application.xml不用变

spring:
application:
name: consumer-demo-hystrix
server:
port: 8090
eureka:
client:
healthcheck:
enabled: true
serviceUrl:
defaultZone: http://root:root@localhost:8761/eureka
instance:
prefer-ip-address: true

CloudDemoConsumerApplication改名为CloudDemoConsumerHystrixApplication,并且它的注解应该是

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreake

上方我们不认识的这个@EnableCircuitBreake注解就是表示开启断路器模式的注解

然后我们看一下controller

@RestController
@RequestMapping("/user")
public class UserController { @Autowired
private RestTemplate restTemplate; @GetMapping("/getUser/{id}")
@HystrixCommand(fallbackMethod = "getUserFallback")
public User getUser(@PathVariable Long id){
return restTemplate.getForObject("http://provider-demo/user/getUser/"+id,User.class);
}
public User getUserFallback(Long id) {
User user = new User();
user.setName("王五");
return user;
}
}

它相比较于原先的controller仅仅是多了一个@HystrixCommand(fallbackMethod = "getUserFallback")注解和一个方法,这个注解呢就是指定Hystrix在此方法超时时调用的方法。

测试

首先启动我们代表Eureka服务的项目,然后启动cloud-demo-provider项目,紧接着启动我们现在的项目。

项目启动以后我们打开浏览器访问localhost:8088/user/getUser/2的时候发现一切正常,网页上返回了张三这个用户。如果我们没有引入Hystrix的时候如果这时候把服务提供者停掉的话在访问会出现什么情况呢,是不是会报错,或者超时呀。

但是现在不一样了,我们引入了Hystrix,所以我们现在停掉提供者访问的时候会发现程序走了注解指定的fallbackMethod,也就是方法getUserFallBack,这个时候我们浏览器得到的结果是王五。

Hystrix默认的超时时间是1秒,也就是说它在等待服务提供者1秒后如果得不到结果的话就会认为提供者挂了,紧接着调用fallbackMethod。

这个时间其实我们可以控制,只需要在yml文件中配置一个属性就可以自定义这个时间

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 1000 #1000毫秒

Feign的支持

接下来我们看一下Feign是怎么使用Hystrix,

这次我们改造cloud-demo-consumer-feign项目,项目名称改为cloud-demo-consumer-feign-hystrix,同样向上述 方式一样引入Hystrix的依赖,

接着 CloudDemoConsumerFeignApplication类名改为 CloudDemoConsumerFeignHystrixApplication,同样的加入@EnableCircuitBreaker注解

有一点不一样的地方是我们需要在yml文件中配置一下来开启Hystrix

feign.hystrix.enabled: true

这里controller中需要改造的不再是指定单个方法,而是指定接口的实现类

@FeignClient(name = "provider-demo", fallback = HystrixClientFallback.class)

来看一下这个实现类

@Component
public class HystrixClientFallback implements UserFeignClient {
@Override
public User getUser(Long id) {
User user = new User();
user.setName("王五");
return user;
}
}

这样的话如果接口中有多个方法的话我们就不必为每一个方法取指定了。

现在我们已经解决了服务提供者挂掉的事情了,但是有点不好的是,我们现在还不能知道服务提供者到底是咋挂的,要是能捕获到服务提供者

抛的异常就好了,其实Hystrix对这个是支持的,我们接下来看一下

fallbackFactory

UserFeignClient上方的注解需要变一下

@FeignClient(name = "provider-demo", fallbackFactory = HystrixClientFactory.class)

这次使用的是fallbackFactory这个属性,我们看一下它指定的这个类又是怎么实现的呢

@Component
public class HystrixClientFactory implements FallbackFactory<UserFeignClient> { private static final Logger LOGGER = LoggerFactory.getLogger(HystrixClientFactory.class); @Override
public UserFeignClient create(Throwable cause) {
HystrixClientFactory.LOGGER.info("the provider error is: {}", cause.getMessage());
return new UserFeignClient() {
@Override
public User getUser(Long id) {
User user = new User();
user.setName("王五");
return user;
}
};
}
}

我们可以看到,在这个create的工厂方法中,它的入参就是服务提供者的异常,得到了这个异常以后才会去做实现。这样是不是更加灵活了呢?

GitHub:https://github.com/shiyujun/spring-cloud-demo

如果对您有所帮助,请记得帮忙点一个star哦

本文出自https://zhixiang.org.cn,转载请保留。

每天学点SpringCloud(六):Hystrix使用的更多相关文章

  1. springcloud(六) Hystrix 熔断,限流

    Hystrix 熔断: 首先仍然启动Eureka,这里就不说了. OrderController.java: package com.tuling.cloud.study.user.controlle ...

  2. [SQL]SQL语言入门级教材_跟我学SQL(六)

    跟我学SQL:(一)数据查询 且不说你是否正在从事编程方面的工作或者不打算学习SQL,可事实上几乎每一位开发者最终都会遭遇它.你多半还用不着负责创建和维持某个,但你怎么着也该知道以下的一些有关的SQL ...

  3. [老老实实学WCF] 第六篇 元数据交换

    老老实实学WCF 第六篇 元数据交换 通过前两篇的学习,我们了解了WCF通信的一些基本原理,我们知道,WCF服务端和客户端通过共享元数据(包括服务协定.服务器终结点信息)在两个 终结点上建立通道从而进 ...

  4. 每天学点SpringCloud(五):如何使用高可用的Eureka

    前几篇文章我们讲了一下Eureka的基础使用,但是呢有一个很重要的问题,我们讲的都是单机版的情况,如果这个时候Eureka服务挂了的话,那么我们的服务提供者跟服务消费者岂不是都废了?服务提供者和消费者 ...

  5. 每天学点SpringCloud(四):Feign的使用及自定义配置

    Feign:SpringCloud的官网对它的定义是这样的: 是一个声明式的Web服务客户端.它支持Feign本身的注解.JAX-RS注解以及SpringMVC的注解.Spring Cloud集成Ri ...

  6. 每天学点SpringCloud(三):自定义Eureka集群负载均衡策略

    相信看了 每天学点SpringCloud(一):简单服务提供者消费者调用,每天学点SpringCloud(二):服务注册与发现Eureka这两篇的同学都了解到了我的套路,没错,本篇博客同样是为了解决上 ...

  7. 每天学点SpringCloud(二):服务注册与发现Eureka

    相信看过 每天学点SpringCloud(一):简单服务提供者消费者调用的同学都发现了,在最后消费者调用提供者的时候把提供者的地址硬编码在了代码中,这样的方式肯定是不行的,今天,我们就是要Eureka ...

  8. 一步一步学Vue(六)https://www.cnblogs.com/Johnzhang/p/7242640.html

    一步一步学Vue(六):https://www.cnblogs.com/Johnzhang/p/7237065.html  路由 一步一步学Vue(七):https://www.cnblogs.com ...

  9. 高并发场景-请求合并(一)SpringCloud中Hystrix请求合并

    背景 在互联网的高并发场景下,请求会非常多,但是数据库连接池比较少,或者说需要减少CPU压力,减少处理逻辑的,需要把单个查询,用某些手段,改为批量查询多个后返回. 如:支付宝中,查询"个人信 ...

随机推荐

  1. Vue的从入门到放弃

    此贴仅记录vue学习路程中遇见的大大小小,形形色色的问题 1.  vue自动打开浏览器配置: 当使用vue 脚手架搭建项目后启动npm run dev,会出现 但是不会自动打开浏览器的,这时候去con ...

  2. Busybox构建根文件系统和制作Ramdisk

      定制根文件系统的方法很多,最常用的是使用BusyBox来构建定制根文件系统.它集成压缩了Linux的许多工具和命令,可以使用户迅速方便地建立一套相对完整.功能丰富的文件系统,其中包括大量常用的应用 ...

  3. Purge and Seal Test on 09 GMC Yukon with Autel Maxisys Pro MS908P scanner

    Autel Maxisys Pro MS908P diagnostic scanner does a purge and seal test on 2009 GMC Yukon hybrid succ ...

  4. mysql操作数据表中的记录1

    一.插入记录INSERT ​ mysql> create TABLE users(    -> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMEN ...

  5. Java 字符编码(一)Unicode 字符编码

    Java 字符编码(一)Unicode 字符编码 Unicode(http://www.unicode.org/versions/#TUS_Latest_Version) 是一个编码方案,说白了希望给 ...

  6. Fair Candy Swap LT888

    Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy that Ali ...

  7. PHP中写定时任务

    1.写一个bat E:\Progra~1\wamp\php\php.exe -f "E:\service.php" 2.写接口文件 ignore_user_abort(); //即 ...

  8. 基于xposed实现android注册系统服务,解决跨进程共享数据问题

    昨花了点时间,参考github issues 总算实现了基于xposed的系统服务注入,本文目的是为了“解决应用之间hook后数据共享,任意app ServiceManager.getService就 ...

  9. 第三次scrum作业

    一.第三次冲刺任务 ! 在已有的基础上实现图书馆管理员对图书信息的查询以及对图书借阅情况的查询. 二.用户故事 本次的用户是图书馆的管理员 用户输入对应的管理员的账号和密码 用户选择图书查询,进入图书 ...

  10. 《Linux就该这么学》第十三天课程

    使用Apache服务部署静态网站 原创地址:https://www.linuxprobe.com/chapter-10.html 今天学了Apache,这只是RHCE课程的开始,估计后面越来越难 今天 ...