传统服务中当用户在请求c时 c请求b b请求a时 当多个用户(线程)同时请求c此时由于a迟迟不响应造成线程大面积堵塞 此时a就会发生雪崩(一台机器出现问题导致与其关联的机器也出现问题),同时影响cb
ribbon实现熔断器功能
基于ribbon项目进行搭建
1.引入Hystrix maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.将启动类加入@EnableHystrix注解
3.在server层需要熔断保护机制的方法加上 @HystrixCommand(fallbackMethod = “ErrorHandler”) 定义好回退方法 编写回退方法 此时我们需要注意两点
- 1.指定处理回退逻辑的方法。回退方法应该在HystrixCommand所在的同一个类中定义
- 2.回退方法应该具有和hystrix命令调用的方法相同的签名(参数返回值相同)
@Service
public class RibbonServuceImpl implements RibbonService {
@Autowired
private RestTemplate restTemplate;
/**
* 1.指定处理回退逻辑的方法。回退方法应该在HystrixCommand所在的同一个类中定义
* 2.回退方法应该具有和hystrix命令调用的方法相同的签名(参数返回值相同)
* @return
*/
@Override
@HystrixCommand(fallbackMethod = "ErrorHandler") //定义回退方法
public String info() {
//我们在微服务调用时不在显式指定其服务ip地址只需要要指定client的服务名称和返回类型即可。
return this.restTemplate.getForObject("http://eureka-client/info ", String.class);
}
@Override
public String ErrorHandler() {
return "Server Error";
}
}
此时依次启动 server client ribbon项目 访问
http://localhost:8888/info
当我们关闭了client项目之后重新访问
hystrix断路器有自我检测功能默认是1秒钟请求
我们可以通过改造模拟出来对应功能
我们可以将server的方法改造成
@GetMapping("info")
public String info() {
//生成1200以下的随机数
int random = new Random().nextInt(1200);
System.out.println("randomInt: " + random);
try {
Thread.sleep(random);
} catch (InterruptedException e) {
e.printStackTrace();
}
String result = "welcome:" + this.address + ",your address is " + this.address;
return result;
}
当睡眠时间超过一秒(默认熔断超时时间是1S)就会发生熔断机制 由此我们可以看出Hystrix可以自我修复
当1秒内又恢复正常
我们也可以通过修改HystrixCommand的属性来设置默认超时时间
feign实现熔断器
基于feign项目
feign自带对hystrix的支持 所有无需导包
第一种方法使用fallback 属性
1.编写一个回退类必须实现类中Feign接口的所有方法
@Component
public class EurekaClientFeignHystrix implements EurekaClientFeign {
@Override
public String infoByFeign() {
return "This is Feign with Hystrix";
}
@Override
public Student getStudentByFeign(String name, String address) {
return null;
}
@Override
public Student postStudentByFeign(Parent parent) {
return null;
}
}
@FeignClient 的fallback 属性 指定改接口的实现类
/**
* 指定的外部客户端接口的回退类。fallback类必须实现由这个注解注释的接口,
* 并且是一个有效的springbean。
*/
Class<?> fallback() default void.class;
此时默认Feign的hystrix 是关闭的
我们需要再yml文件中进行配置
feign:
hystrix:
enabled: true
此时我们访问
http://localhost:8889/infoByFeign
client打印了两次数据 feign断路由在加载超过1S中之后会返回结果的同时还会再去重新加载一次
ribbon 启动仪表盘
maven引入该注解
<!-- 仪表盘 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
启动类修改如下
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix //启动熔断器
@EnableHystrixDashboard //启动仪表盘
public class SpringCloudRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudRibbonApplication.class, args);
}
@Bean
public ServletRegistrationBean getServlet() {
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
}
此时依次启动server client ribbon
访问http://localhost:8888/hystrix.stream 图如下
此时我们访问开启了断路由的方法
此时数据就得到了监控此时由于全是json字符串 需要转换成图形界面
访问 http://localhost:8888/hystrix/
填写完毕进入
重新访问接口此时监控界面会出现以下内容