Spring Cloud Hystrix熔断器:
微服务架构当中的熔断器就是当被调用方没有响应,调用方直接返回一个错误响应即可,而不是长时间的等待,这样避免调用时因为等待而线程一直得不到释放,避免故障在分布式系统当中蔓延。
Spring Cloud Hystrix 实现了熔断器、线程隔离等一系列服务保护功能。该功能也是基于 Netflix 的开源框架 Hystrix 实现的,该框架的目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix 具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能。
Hystrix 快速入门
SpringCLoud中使用Hystrix是比较简单和方便的,首先
1、添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
2、在入口类上使用@EnableCircuitBreaker 注解开启断路器功能,也可以使@SpringCloudApplication 的注解代替主类上的三个注解;@SpringBootApplication+@EnableEurekaClient+@EnableCircuitBreaker
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker //开启熔断器功能
//@SpringCloudApplication //此注解相当于以上三个注解 @EnableDiscoveryClient与@EnableEurekaClient前者支持多种链接后者针对eureka
public class ApplicationCustomer {
public static void main(String[] args) {
SpringApplication.run(ApplicationCustomer.class, args);
}
}
服务消费者 Hystrix 测试:
hystrix 默认超时时间是 1000 毫秒,如果你后端的响应超过此时间,就会触发断路器;
在消费者调用之前有个运行时异常也会触发熔断器;
//触发熔断之后调用下面对应error()方法,可设置超时时间默认是1000毫秒
@HystrixCommand(fallbackMethod = "error",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")})
@RequestMapping("/testHystrix")//熔断器调用不通回调error方法
public String testHystrix(){
// int a =10/0;
String body = restTemplate.getForEntity("http://01SPRINGCLOUDPROVIDER/getProviderSpringCloud", String.class).getBody();
return body;
}
public String error(){
return "error";
}
Hystrix服务的降级:
服务有了熔断之后就会有服务降级,就是当某个服务熔断之后,服务端提供的服务不能再被调用,此时由开发准备一个fallback回调,至于返回什么需要根据业务所需要进行设计。这种做法至少保证了服务的强可用性,比直接抛出异常或者服务宕掉要好点。
Hystrix 的异常处理
在调用微服务时,有可能会抛出异常,默认情况下方法抛异常会自动进行服务降级,交给服务降级当中的方法去处理;
发生异常之后,可以在服务降级方法当中加入Throwable类型的参数就可以获取到抛出异常类型和异常信息;
public String error(Throwable throwable){
System.out.println(throwable.getMessage());
System.out.println(throwable.getStackTrace());
return "hystrixError";
}
如果微服务有个别方法的异常我们不希望进入到服务降级方法中去处理,而是直接抛出给用户,可以在@HystrixCommand 注解中添加忽略异常:
@HystrixCommand(fallbackMethod = "error",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")},ignoreExceptions = Exception.class)
@RequestMapping("/testHystrix")//熔断器调用不通回调error方法
public String testHystrix(){
int a =10/0;
String body = restTemplate.getForEntity("http://01SPRINGCLOUDPROVIDER/getProviderSpringCloud", String.class).getBody();
return body;
}
自定义 Hystrix 请求的服务异常熔断处理
以自定义类继承自 HystrixCommand 来实现自定义的 Hystrix 请求,在 getFallback 方法中调用 getExecutionException 方法来获取服务抛出的异常;
public class MyHystrixCommand extends HystrixCommand {
private RestTemplate restTemplate;
public MyHystrixCommand(Setter setter,RestTemplate restTemplate){
super(setter);
this.restTemplate = restTemplate;
}
@Override
protected String run() throws Exception {
//调用远程方法
String body = restTemplate.getForEntity("http://01SPRINGCLOUDPROVIDER/getProviderSpringCloud", String.class).getBody();
return body;
}
/**
* 当远程服务超市、异常、不可用的情况时会触发熔断
* @return
*/
@Override
protected String getFallback() {
Throwable throwable = super.getExecutionException();
System.out.println(throwable.getMessage());
return "自定义ERROR!!!";
}
}
@RequestMapping("/testHystrix2")//熔断器调用不通回调error方法
public String testHystrix2() throws ExecutionException, InterruptedException {
String str = "";
MyHystrixCommand myHystrixCommand = new MyHystrixCommand(com.netflix.hystrix.HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")), restTemplate);
//同步调用方法(该方法执行后,会等待远程的返回结果,拿到远程的返回结果,该方法才返回然后继续向下执行)
//str = (String) myHystrixCommand.execute();
//System.out.println(str);
//异步调用(该方法执行后,不会马上有执行结果,将来会有)
Future<String> future = myHystrixCommand.queue();
str = future.get();
System.out.println(str);
return str;
}
Hystrix 仪表盘监控:
Hystrix 仪表盘(Hystrix Dashboard)主要用来监控Hystrix的实时运行状态,通过它我们可以看到Hystrix的各项指标信息,从而快速发现问题解决问题。
搭建一个Hystrix Dashboard 服务:
1、创建Spring Boot项目添加相关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
2、在入口类上添加开启仪表盘功能注解
@SpringBootApplication
@EnableHystrixDashboard //开启仪表盘功能
public class SpringCloudHystrixDashboardApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudHystrixDashboardApplication.class, args);
}
}
3、在application.properties当中配置端口
#hystrix的仪表盘服务的端口
server.port=3721
启动成功之后如下图所示:
仪表盘已经启动好了,现在需要一个微服务务提供一个路径为/actuator/hystrix.stream 接口,然后就可以使用 Hystrix 仪表盘来对该服务进行监控了。
提供一个消费者让其提供/actuator/hystrix.stream 接口:
1、消费者需要有的hystrix依赖和spring boot服务监控依赖
<!--Spring Cloud 熔断器起步依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
<!--spring boot的服务依赖坐标-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、application.properties配置文件需要配置spring boot监控断点的访问权限
#sping boot端点监控的访问权限
management.endpoints.web.exposure.include=*
#这个是用来暴露 endpoints 的,由于 endpoints 中会包含很多敏感信息,
#除了 health 和 info 两个支持直接访问外,其他的默认不能直接访问,所以我们让它都能访问,或者指定:
#或者指定访问权限
#management.endpoints.web.exposure.include=hystrix.stream
3、访问入口 http://localhost:8082/actuator/hystrix.stream
注意:这里有一个细节需要注意,要访问/hystrix.stream 接口,首先得访问问服务里面配置hystrix工程中的任意一个其他接口(http://localhost:8082/testHystrix),否则直接访问/hystrix.stream 接口时会输出出一连串的 ping: ping: …,先访问 微服务中的任意一个其他接口,然后再访问/hystrix.stream 接口即可
Hystrix 仪表盘监控数据解读:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/77248.html