SpringCloud 第六章:SpringCloud Hystrix

背景介绍

分布式系统面临的问题

复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将出现问题,不可调用、网络延迟堵塞等。

服务雪崩
  • 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”.
  • 对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。

Hystrix介绍

  • Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
  • “断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(Fall Back),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
  • 官网资料:https://github.com/Netflix/Hystrix/wiki/How-To-Use
  • 一句话:能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

Hystrix功能?

服务熔断
介绍

熔断机制是应对雪崩效应的一种微服务链路保护机制。
当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误"的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在Spring Cloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand

如何集成Hystrix实现服务熔断?
1、服务提供者中加入POM
   <!--  hystrix -->
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-hystrix</artifactId>
   </dependency>
    
2、服务提供者的Controller加入Hystrix异常接收器@HystrixCommand
    @RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
    //一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
    @HystrixCommand(fallbackMethod = "processHystrix_Get")
    public Dept get(@PathVariable("id") Long id){
    	Dept dept = this.service.get(id);
    	if (null == dept) {
        	throw new RuntimeException("该ID:" + id + "没有没有对应的信息");
   		}
    	return dept;
	}
	// 补救方法
	public Dept processHystrix_Get(@PathVariable("id") Long id){
		return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,null--@HystrixCommand")
				.setDb_source("no this database in MySQL");
	}
3、在服务提供者的启动器上加入开启Hystrix启动注解
   @EnableCircuitBreaker//对hystrixR熔断机制的支持
    
服务降级
介绍
  • 服务的降级是在客户端完成的,与服务端没有关系。
  • 当服务被熔断后可能直接down机了。无法进行调用了。就需要在客户端进行降级处理(异常通知),也就是Fall back回调,这样服务水平下降了,但是还可以用,比直接down机要强。
高耦合问题处理【实现服务降级】

在controller中在服务熔断的情况下需要给消费者提供一个补救的方法,当存在方法越来越多的时候,补救的方法也会跟随越来越多。也就是方法膨胀,而且与业务代码绑定到一起,存在高耦合。使用切面加异常通知即可解决

1、根据思想,实现应该在客户端进行降级,与服务端无关,修改公共项目的service接口
@FeignClient(value = "微服务名称",fallbackFactory=实现Hystrix的服务降级提示类.class)
    
2、在公共项目中将微服务熔断后的补救方法统一在一个类中进行编写,解决高耦合问题。
//当消费者通过Feign调用服务的生成者时,由于服务生产者被关闭,则由身为客户端的公共模块给接口返回指定的异常通知提示。
@Component // 不要忘记添加
public class DeptClientServiceFallbackFactory implements FallbackFactory<要给该微服务实现降级、熔断的Service>{
	@Override
	public DeptClientService create(Throwable throwable){
		return new DeptClientService() {
			@Override
			public Dept get(long id){
				return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭").setDb_source("no this database in MySQL");
			}
		};
	}
}
3、当在feign中使用FallbackFactory进行处理异常通知,则需要在feign的消费者上开启
   //开启feign支持断路器
   feign:
	hystrix:
	  enabled: true
          
5、此时已经做了降级处理,这时候如果生产者提供的微服务down机后,由消费者feign的客户端会对服务进行降级,直接返回给消费者的异常信息。不会一直请求服务器
6、注意:在API模块加上降级处理后,当微服务存在异常或者无法调用的情况下会调用API的本地Fallback。如果在微服务端存在@HystrixCommand注解,则优先返回微服务提供的Fallback方法
服务限流
接近实时的监控
  • 除了隔离依赖服务的调用以外,Hystrix还提供了准实时的调用监控(Hystrix Dashboard),Hystrix会持续地记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功,多少失败等。Netflix通过hystrix-metrics-event-stream项目实现了对以上指标的监控。
  • Spring Cloud也提供了Hystrix Dashboard的整合,对监控内容转化成可视化界面组件。
如何开启微服务监控?
1、在监控项目中添加pom文件
   <!-- hystrix和 hystrix-dashboard相关-->
   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-hystrix</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
   </dependency>
    
 2、在启动类上添加启动注解,开启监控
    @EnableHystrixDashboard
    
 3、在服务的生产者上修改POM文件,完成监控
   <!-- actuator监控信息完善 -->
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
   </dependency>
 4、启动后访问地址:地址:端口/hystrix。这个组件只可以单个微服务监控
     输入要监控的微服务地址:http://localhost:8761/hystrix.stream
如何使用hystrixDashboard监控?
  • Delay:该参数用来控制服务器上轮询监控信息的延迟时间,默认为2000毫秒,可以通过配置该属性来降低客户端的网络和CPU消耗。

  • Title:该参数对应了头部标题Hystrix Stream之后的内容,默认会使用具体监控实例的URL,可以通过配置该信息来展示更合适的标题。

  • 实心圆:共有两种含义。它通过颜色的变化代表了实例的健康程度,它的健康度从绿色<黄色<橙色<红色递减。
    该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越大。所以通过该实心圆的展示,就可以在大量的实例中快速的发现故障实例和高压力实例。

  • 曲线:用来记录2分钟内流量的相对变化,可以通过它来观察到流量的上升和下降趋势。

在这里插入图片描述
在这里插入图片描述

如何使用Hystrix监控多个微服务?

使用Turbine组件进行监控多微服务

1、创建Turbine模块,导入Turbine的POM。注意:因为是Hystrix的组件,所以也需要引入Hystrix的pom
<!--引入Hystrix多服务监控组件tunbine-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-turbine</artifactId>
</dependency>
2、加入启动注解:
@EnableTurbine
3、配置文件修改。注意:Turbine默认会注册到Eureka中
turbine:
  app-config: provider-dept      # 需要监控的应用名称,基本上与微服务名称对应
  cluster-name-expression: "'default'"
4、访问Dashboard服务,8087模块。
监控地址:http://127.0.0.1:8088/turbine.stream
根据查看host数量即可查看监控的集群数量 2

SpringCloud 系列代码开源地址:代码地址
SpringCloud 技术群聊地址:Q群地址


已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页