SpringCloud的熔断机制Hystrix的实现

SpringCloud的熔断机制Hystrix的实现

容错保护 Hystrix

分析:

       在微服务架构中,存在着众多的服务单元 ,若一个单元出现故障,就会因为依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样的架构相较于传统的架构更加不稳定,因此为了解决这样的问题,产生了断路器等一系列的服务保护机制。

       其中,Spring Cloud Hystrix实现了断路器、线程隔离等一系列服务保护功能,也是基于Netflix的开源框架Hystrix实现的,该框架的目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供强大的容错能力。Hystrix具备服务降级、服务熔断、线程、信号隔离、请求缓存、请求合并以及服务监控等强大的功能。

雪崩效应

  • 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。
  • 如果下图所示:A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了。

SpringCloud的熔断机制Hystrix的实现_第1张图片

Hystrix简介

SpringCloud的熔断机制Hystrix的实现_第2张图片

SpringCloud的熔断机制Hystrix的实现_第3张图片

实现原理

SpringCloud的熔断机制Hystrix的实现_第4张图片

快速入门

1、导入依赖

在服务消费方


        
        
            org.springframework.boot
            spring-boot-starter-actuator
        
        
        
            org.springframework.cloud
            spring-cloud-starter-hystrix-dashboard
        
        
            com.netflix.hystrix
            hystrix-javanica
            1.5.12
        

2、在启动类添加@EnableHystrix注解

有两种方式:

1、服务间利用RestTemplate进行通信

2、利用Feign通信(Feign整合了负载均衡和Eureka)

1、RestTemplate

在需要容错处理的方法添加@HystrixCommand注解,并指定一个容错方法,即fallbackMethod。

这里是自己本地的方法,前一个是执行sayHello()方法调用服务提供者接口进行测试,后一个是容错方法,也就是fallbackMethod指定的方法,注意容错方法参数个数类型要和原方法一致。

配置好后执行服务注册中心跟服务提供者和消费者,正常使用消费接口,数据显示正常。关闭服务提供者,再使用消费接口就会执行容错方法,返回容错信息。


    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    //  要做容错处理的方法上加@HystrixCommand注解,并指定一个容错方法,即fallbackMethod
    //  如果调用没有做Hytrix容错的方法,则直接返回异常信息
    @HystrixCommand(fallbackMethod = "demoFallbackMethod")
    public String sayHello(String name){
        return helloService.sayHello(name);
    }

/**
     * 请求失败执行的方法
     * fallbackMethod的方法参数个数类型要和原方法一致
     * 利用feign的话可以统一使用错误回调方法 不用在方法使用@HystrixCommand
     * @return
     */
    public String demoFallbackMethod(String name){
        System.out.println("这里调用了容错Hystrix机制");
        return "你好" + name + ":服务出错";
    }

2、利用Feign

使用feign之前需要先了解一下feign,此处需要有一定的基础知识。

导入feign依赖,并且创建一个feign客户端,用于当作通信接口。

启动类中需要添加@EnableFeignClients 。

虽然使用了Ribbon和Hystrix可以实现负载均衡和容错处理,但是这个编码在实现大量业务时会显得太过于冗余。

使用feign可以设置统一的hystrix fallback,也就是将同错方法进行统一的管理,减少代码的冗余。

流程分析:

1、由于我们在入口程序使用了@EnableFeignClients注解,Spring启动后会扫描标注了@FeignClient注解的接口,然后生成代理类。
2、我们在@FeignClient接口中指定了value,其实就是指定了在Eureka中的服务名称。
3、在FeignClient中的定义方法以及使用了SpringMVC的注解,Feign就会根据注解中的内容生成对应的URL,然后基于Ribbon的负载均衡去调用REST服务。

一般在实际开发中fallback 方法不会直接写在接口方法所在类里,那样太杂乱

value:服务提供者名称,fallback:指定的容错方法统一实现类

@Component
@EnableFeignClients
// fallback显示指定使用的容错类
@FeignClient(value = "spring-cloud-client-1",fallback = TestHelloServiceFallback.class) //注册在服务中心的application name//用于与该服务进行通信
public interface HelloService {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    String sayHello(@RequestParam(value = "name") String name);
}

设置统一的hystrix fallback接口

新建一个fallback类,实现feign通信接口(这里是实现HelloService)。

之所以要实现通信接口,也是为了保证与原方法一致(参数列表,名称)。

通过@Component注解将其注入spring中。

/**
 * 使用feign后统一的服务降级,该类一般要实现调用远程服务的接口(这样保证方法名一致)
 * 也就是统一的容错方法
 */
@Component
public class TestHelloServiceFallback implements HelloService {
    @Override
    public String sayHello(String name) {
        return "服务出错";
    }
}

最后在yml文件中配置开启feign熔断。

配置好后,可以不用不在方法上使用@HystrixCommand注解。

# 开启feign的容错方式
feign:
  hystrix:
    enabled: true # 开启Feign熔断

最后,重启服务,在关闭服务提供方后,会调用容错方法返回容错信息。

没有配置hystrix熔断的普通方法的话会直接返回错误信息。

---END---   简单记录!

 

 

 

 

 

 

 

 

你可能感兴趣的:(java,spring,spring,boot)