SpringCloud-Hystrix断路器

hystrix的局部降级逻辑的处理方式

引入Hystrix依赖:

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

在service中对超时方法进行设置,访问超时调用超时方法

 /**
     超时访问的方法,添加@HystrixCommand注解
     */
    @HystrixCommand(fallbackMethod = "timeoutHandler",commandProperties = {
            //设置峰值,超过 3 秒,就会调用兜底方法,这个时间也可以由feign控制
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
    public String paymentInfo_Timeout(Integer id){
    	//设置超时调用时间
        int interTime = 5;
        //int i = 10/0;
        try{
            TimeUnit.SECONDS.sleep(interTime);
        }catch (Exception e){
            e.printStackTrace();
        }
        return "线程池:" + Thread.currentThread().getName() + "  ,paymentInfo_Timeout,id:" + id + "耗时" + interTime + "秒钟";
    }
   // 定义服务出现异常之后,兜底的方法
   //降级方法(逻辑)编写的原则是方法的形参和返回值必须要和被降级的方法保持一致。
    public String timeoutHandler(Integer id){
        return "服务异常,请重试......";
    }
}

在启动类上加上@EnableCircuitBreaker 作用:开启服务熔断
启动测试

全局降级处理方式

全局降级逻辑:
1.在消费方的启动类上面要加上一个@EnableCircuitBreaker
2.在消费方的controller里面,定义一个全局降级的方法。
3.在controller上面 添加一个注解@DefaultProperties(defaultFallback = “handleAll”)
4.在指定的被降级的方法上添加一个@HystrixCommand 注意:降级逻辑的优先级 局部的降级逻辑>全局的降级逻辑

什么是熔断? 熔断有哪几种状态 断路器的工作原理

1.熔断 当用户访问某个服务,达到了最大的访问量之后,直接拒绝用户访问。
2.熔断三种状态 打开状态(open)、2.断开状态(close)、3.半开状态(half open)
3. 断路器的工作原理 统计用户在指定的时间范围(默认10s)之内的请求总数达到指定的数量之后, 如果不健康的请求(超时、异常)占总请求数量的百分比(50%)
达到了指定的阈值之后,就会触发熔断。触发熔断,断路器就会打开(open),此时所有请求都不能通过。在5s之后,断路器
会恢复到半开状态(half open),会允许少量请求通过,如果这些请求都是健康的,那么断路器会回到关闭状态(close).如果
这些请求还是失败的请求,断路器还是恢复到打开的状态(open).

如何开启熔断?

熔断机制的注解是@HystrixCommand;
熔断机制是应对雪崩效应的一种【链路保护机制】,一般存在于服务端;
当扇出链路的某个服务出现故障或响应超时,会进行【服务降级】,进而【熔断该节点的服务调用】,快速返回“错误”的相应信息;
Hystrix的熔断存在阈值,缺省是5秒内20次调用失败就会触发;
-一般是某个服务故障或者异常引起,类似显示世界中的“保险丝”,当某个异常条件被触发,直接熔断整个服务,而不是一直等到此服务超时。

什么是网关? gateway 的核心概念

Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project
Reactor等技术开发的网关,Spring Cloud
Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring
Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
三大核心概念 Route(路由):路由是构建网关的基本模块,它由ID、目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
Predicate(断言):参考的是Java8的java.util.function.Predicate
开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
Filter(过滤):指的是Spring框架中GatewayFilyter的实例,使用过滤器,可以在请求被路由前或者之后进行修改
匹配方式就叫断言,实现这个匹配方式就叫filter,对外表现出来就是路由的功能。

如何简单使用gateway

创建model导入pom.xml

<dependencies>
    <!--gateway-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <!--eureka-client gateWay作为网关,也要注册进服务中心-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!-- gateway和web不能同时存在,即web相关jar包不能导入 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <groupId>com.krisswen.cloud</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>${project.version}</version>
    </dependency>
</dependencies>

编写yml配置文件

server:
  port: 9527
spring:
  application:
    name: cloud-gateway
  ## GateWay配置
  cloud:
    gateway:
      routes:
      - id: payment_routh  # 路由ID , 没有固定的规则但要求唯一,建议配合服务名
        uri: http://localhost:8001  # 匹配后提供服务的路由地址
        predicates:
        - Path=/payment/**  # 断言,路径相匹配的进行路由

      - id: payment_routh2  # 路由ID , 没有固定的规则但要求唯一,建议配合服务名
        uri: http://localhost:8001  # 匹配后提供服务的路由地址
        predicates:
        - Path=/payment/lb/**  # 断言,路径相匹配的进行路由

# 注册进 eureka Server
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
    register-with-eureka: true
    fetch-registry: true

编写启动类

@SpringBootApplication
@EnableEurekaClient
public class GatewayMain9527 {
    public static void main(String[] args) {
        SpringApplication.run(GatewayMain9527.class,args);
    }
}

总结:

1 降级逻辑优先级:局部降级>全局降级
2降级服务方法抽取注意点:
3消费方的启动类上面要加上一个@EnableCircuitBreaker
4配置文件中,开启Feign对Hystrix支持
5定义一个类,实现Feign客户端。重写里面的方法(编写降级处理方法)
6是用注解@FeignClient(name = “微服务名称”,fallback = Feign客户端的实现类.class)将客户端实现类绑定到Feign客户端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值