Hytrix-豪猪

Hytrix是什么?


  在分布式缓存中,服务多了肯定会有一些服务会崩。Hystrix是一个库,可以添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互。通过隔离服务之间的访问点,停止级联失败和提供回退选项来实现这一点,可以提高整个系统的容错性。

Hytrix设计目标?


  1、对通过第三方客户端库访问的依赖项的延迟和故障进行保护和控制。(这种一般都是网络传输造成的)

  2、在复杂的分布式系统中阻止级联故障。

  3、快速失败、快速恢复

  4、回退,尽可能优雅地降级。

  5、启动近实时监控、警报和操作控制。

服务熔断最小案例


 开发流程:在product服务中进行

  1、引入依赖

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

  2、在启动类application加上注解,EnableCircuitBreaker

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker  //断路器
public class Product9997Application {

    public static void main(String[] args) {
        SpringApplication.run(Product9997Application.class, args);
    }
}

  3、在controller编写测试逻辑

    //如果觉得每个服务都配置同样的一个熔断方法太麻烦了
    //这里有个通用的方法可以进行替换
    //hystrixMethod注解中 fallbackMethod----替换--->defaultFallback=testFallbackMethod
    //将回调方法改成默认的


    //服务熔断
    @GetMapping("/product/break")   //服务访问路由
    @HystrixCommand(fallbackMethod="testFallbackMethod")   //如果发生服务异常  则服务熔断  执行注解内的方法
    public String testBreak(int id) {
        if(id>0) {
            System.out.println("ok!!!!");   //正常的逻辑
        }else {
            throw new RuntimeException("error------>num <=0!!!!!!");  //产生异常的逻辑
        }
        return "num:" + id;
    }

    //服务熔断的时候就会调用这个函数
    public String testFallbackMethod(int id) {
        return "数据不合法------>!" + id;
    }

  4、产生效果,访问的参数满足服务要求的逻辑值,但是如果该参数值低于1,程序内部就会抛出异常。

  当值小于1时,就会抛出异常,熔断器启动,调用熔断方法。如果失败请求满足一定阈值(比如10秒内20次请求),则断路器启动,访问正确的值都会显示数据不合法,直到再次访问回复正常。如果

服务降级最小案例


 开发流程:在user服务中进行

  1、添加依赖

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

  2、properties中开启服务降级配置

#开启服务降级   支持服务降级的技术openfeign
feign.hystrix.enabled=true

  3、加入访问后台接口,同时注入降级实现类

    //服务降级的路由
    @GetMapping("/product/break")
    public String testBreak(@RequestParam("id")int id);//user服务向product服务访问的接口

  4、创建服务降级实现类,继承productClient接口

package com.demo.user9998.fallback;

import com.demo.user9998.controller.client.ProductClient;
import com.demo.user9998.vo.ProductVo;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class ProductFallBack implements ProductClient {

    //只对这个服务进行服务降级
    @Override
    public String testBreak(int id) {
        return "这个只是测试内容,如果真需要服务降级,就在这里进行具体服务编写";
    }

    @Override
    public Map<String, Object> findPs() {
        return null;
    }

    @Override
    public String findById(String productId) {
        return null;
    }

    @Override
    public String persist(String name) {
        return null;
    }

    @Override
    public String save(ProductVo productVo) {
        return null;
    }

}

  5、关闭服务熔断注解,服务降级和服务熔断是两个hytrix两个服务处理方式

  6、在userController中编写服务降级测试

    //测试服务降级
    @GetMapping("/user/breakTest")
    public String breakTest(int id) {
        String result = productClients.testBreak(id);  //感知服务降级
        return result;
    }

  7、演示效果

  符合正常的传参

  异常传参

总结


  服务熔断是在被访问的服务上,例如product服务,当服务发生异常的时候,捕捉并且调用fallbackMethod方法,执行熔断方法。这个熔断器如果错误的请求发送一定次数到达阈值,当我们再次发送正确请求的时候,还是会报错。这个时候熔断器需要休息一下才能重新恢复访问。

  服务降级是在直接访问服务上,例如user服务,当product服务发生异常的时候,user就会关闭该服务,同时调用的productclient接口的实现类,内部有对该服务的处理方式。这个服务访问的时候是有路由名字的,查看路由对应的方法,找到productclient的方法,调用该实现类同名的方法。开发流程:添加依赖,properties开启服务降级,实现类调用。

原文地址:https://www.cnblogs.com/HelloM/p/14349600.html