pays

Hystrix

什么是Hystrix

​ 在分布式环境中,许多服务依赖不可避免地会出现一些失败。Hystrix是一个库,通过添加延迟容忍和容错逻辑,可以帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止服务之间的级联故障并提供回退选项来实现这一点,所有这些都提高了系统的总体弹性。

hystrix发展史

​ Hystrix是从2011年Netflix API团队开始的弹性工程工作中发展出来的。2012年,Hystrix继续发展和成熟,Netflix的许多团队采用了它。如今,Netflix每天通过Hystrix执行数百亿次线程隔离调用和数千亿次信号隔离调用。这极大地提高了正常运行时间和弹性。

Hystrix是做什么的

hystrix设计的目的:

  • 为通过第三方客户端库访问依赖项(通常通过网络)带来的延迟和故障提供保护和控制。
  • 停止复杂分布式系统中的级联故障。
  • 快速失败,快速恢复。
  • 在可能的情况下,后退并优雅地降级。
  • 启用近实时监控、警报和操作控制。

Hystrix解决的了那些问题

复杂分布式体系结构中的应用程序有许多依赖项,每个依赖项在某些时候都不可避免地会失败。如果主机应用程序没有与这些外部故障隔离,那么它有可能被他们拖垮。

hystrix依赖

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

Hystrix 熔断

产生熔断的原因:

雪崩效应:是一个因服务提供者不可用,导致服务调用者不可用并且将不可用的过程不断放大的过程。

  • 1、服务提供者出现故障导致不可用 :短时间大量的用户请求;硬件故障:硬件损坏造成的服务器主机宕机, 网络硬件故障造成的服务提供者的不可访问;程序bug; 缓存击穿:缓存击穿一般发生在缓存应用重启, 所有缓存被清空时,以及短时间内大量缓存失效时. 大量的缓存不命中, 使请求直击后端,造成服务提供者超负荷运行,引起服务不可用;
  • 2、开启重试机制导致流量的增加;
  • 3、服务调用者不可用
  • 同步等待造成的资源耗尽:当服务调用者使用同步调用 时, 会产生大量的等待线程占用系统资源. 一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态, 于是服务雪崩效应产生了。

什么是熔断

服务熔断总的来说就是服务自身的一种自我保护机制。他有两个方面

服务熔断:当服务出现故障的时候,来访问我们的请求,我们会响应一个fail back给用户而不会让他一直等待这个请求响应。

@SpringBootApplication
@MapperScan(basePackages = "com.hh.mapper")
@EnableEurekaClient
@EnableDiscoveryClient 
@EnableHystrix //开启hystrix @EnableHystrix继承了@EnableCricuitBreaker 开启熔断器
public class DeptProviderHystrix {
    public static void main(String[] args) {

        SpringApplication.run(DeptProviderHystrix.class,args);
    }
}
@HystrixCommand(fallbackMethod="hystrixDept")//开启线程池隔离(开启后使用的是独立的线程池

服务降级:当某个服务器请求量比较大的时候,我们会根据当前业务及流量对一些服务进行有策略的降级处理,以此来释放一些服务器资源来保证核心任务能够正常的运行。

1、修改消费者服务接口的提供者项目(microservicecloud-api),让service接口实现一个FallbackFactory接口类DeptClientServiceFallbackFactory

import com.yufeng.springcloud.entities.Dept;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService>
{
    @Override
    public DeptClientService create(Throwable throwable)
    {
        return new DeptClientService() {
            @Override
            public boolean add(Dept dept)
            {
                return false;
            }

            @Override
            public Dept get(Long id)
            {
                Dept dept = new Dept();
                dept.setDeptno(id);
                dept.setDname("该ID:" + id + "没有对应的信息,Consumer客户端提供的信息,此服务Provider已关闭");
                dept.setDb_source("no this database in mysql");
                return dept;
            }

            @Override
            public List<Dept> list()
            {
                return null;
            }
        };
    }
}

2、修改提供服务的service熔断处理的机制

此处是在公共的service对某个service的方法访问出现异常后进行统一的fallback处理,即在 DeptClientService接口在注解@FeignClient 中添加 fallbackFactory 属性值,该属性赋值为实现FallbcakFactory接口的异常处理类

import com.yufeng.springcloud.entities.Dept;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.List;

@FeignClient(value = "microservicecloud-dept", fallbackFactory = DeptClientServiceFallbackFactory.class)
public interface DeptClientService
{
    @RequestMapping(value = "/dept/add", method = RequestMethod.POST)
    public boolean add(@RequestBody Dept dept);

    @RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
    public Dept get(@PathVariable("id") Long id);

    @RequestMapping(value = "/dept/get/list", method = RequestMethod.GET)
    public List<Dept> list();
}

3、在消费者工程(microservicecloud-consumer-dept-feign)的yml文件增加如下内容,开启feign中的hystrix

feign:
  hystrix:
    enabled: true

服务熔断和服务降级的区别

服务熔断 作用在服务端,服务降级总用在客户端。

  • 触发原因不太一样,服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑;
  • 管理目标的层次不太一样,熔断其实是一个框架级的处理,每个微服务都需要(无层级之分),而降级一般需要对业务有层级之分(比如降级一般是从最外围服务开始)
  • 实现方式不太一样;服务降级具有代码侵入性(由控制器完成/或自动降级),熔断一般称为自我熔断。

服务限流

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开;而有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀、抢购)、写服务(如评论、下单)、频繁的复杂查询(评论的最后几页),因此需有一种手段来限制这些场景的并发/请求量,即限流。

​ 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务(定向到错误页或告知资源没有了)、排队或等待(比如秒杀、评论、下单)、降级(返回兜底数据或默认数据,如商品详情页库存默认有货)。

​ 一般开发高并发系统常见的限流有:限制总并发数(比如数据库连接池、线程池)、限制瞬时并发数(如nginx的limit_conn模块,用来限制瞬时并发连接数)、限制时间窗口内的平均速率(如Guava的RateLimiter、nginx的limit_req模块,限制每秒的平均速率);其他还有如限制远程接口调用速率、限制MQ的消费速率。另外还可以根据网络连接数、网络流量、CPU或内存负载等来限流。

服务监控

监控中心就是 Hystrix 提供的一套可视化系统 Hystrix-Dashboard ,可以非常友好的看到当前环境中服务运行的状态。Hystrix-Dashboard 是一款针对 Hystrix 进行实时监控的工具,通过 Hystrix-Dashboard 我们可以直观地看到各 Hystrix Command 的请求响应时间,请求成功率等数据。

@SpringBootApplication
@EnableEurekaClient  //服务开启自动注册到Eureka里面去
@EnableHystrixDashboard//开启监控页面
public class dashboard {
        public static void main(String[] args) {
        SpringApplication.run(dashboard.class,args);
    }
    @Bean
    public ServletRegistrationBean hystrixMetricsStreamServlet(){
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
        registrationBean.addUrlMappings("/actuator/hystrix.stream");
        return registrationBean;
    }
}

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2021-10-23
  • 2021-06-17
  • 2021-05-19