软件开发定制带你快速了解SpringCloud之Ribbon&Histrix(负载均衡和熔断器)

学习目标

  1. Ribbon
    1. 负载均衡
    2. Ribbon的使用
    3. Ribbon软件开发定制的负载均衡策略
    4. Ribbon的原理
  2. Hystrix
    1. 软件开发定制服务的可用性
    2. Hystrix的配置
    3. Hystrix软件开发定制的工作机制

软件开发定制因为请求量特别大的情况下,软件开发定制必须有多台服务来进行处理,配置集群。

软件开发定制集群中的机器可能出现软件开发定制忙闲不均的情况,软件开发定制就需要有一套机制,软件开发定制实现平均分配请求量到软件开发定制每台机器上——负载均衡

负载均衡分类

  • 硬件负载均衡 —— F5
  • 软件负载均衡

服务端负载均衡 如:Nginx

客户端负载均衡 如:Ribbon

的使用

  1. 引入依赖 neflix-ribbon

    eureka-client依赖中已经包含此依赖

  2. 配置RestTemplate的方法上加@LoadBalanced 注解

配置伪集群测试负载均衡

package com.example.productservice.controller;import com.example.productservice.entity.Product;import com.example.productservice.service.ProductService;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ProductController {    @Autowired    private ProductService productService;    @Value("${server.port}")    private Integer port;    @HystrixCommand(fallbackMethod = "findDefaultPro")    @GetMapping("product/{id}")    public ResponseEntity<Product> findProById(@PathVariable("id") Integer id){        Product product = productService.findProductById(id);        String name = product.getName()+ port;        product.setName(name);        return ResponseEntity.ok(product);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

Ribbon的负载均衡策略

所有的负载均衡策略实现IRule接口,可以自定义

系统提供了几种策略

内置负载均衡规则类规则描述
RoundRobinRule简单轮询服务列表来选择服务器。
AvailabilityFilteringRule对以下两种服务器进行忽略:(1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。注意:可以通过修改配置loadbalancer…connectionFailureCountThreshold来修改连接失败多少次之后被设置为短路状态。默认是3次。(2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上线,可以由客户端的…ActiveConnectionsLimit属性进行配置。
WeightedResponseTimeRule为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
ZoneAvoidanceRule以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。它是Ribbon默认的负载均衡规则,继承于RoundRobinRule。
BestAvailableRule忽略哪些短路的服务器,并选择并发数较低的服务器。
RandomRule随机选择一个可用的服务器。
RetryRule重试机制的选择逻辑

配置方法:

  1. 全局配置

    ribbon.NFLoadBalancerRuleClassName=策略名称

  2. 局部配置

    服务名.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.策略名称类名

Ribbon的负载均衡主要由拦截器实现

服务的可用性

服务能一直在线提供服务的时间

导致服务不可用的情况:

  • 流量激增,导致服务器等待或者宕机
  • 硬件问题,如:自然灾害、人为破坏
  • 软件bug,异常、死循环、死锁…
  • 缓存击穿,导致数据库宕机
  • 程序响应超时

解决方法:

  • 限流,限制到服务器上的流量
  • 服务器集群、多机房容灾、异地多活
  • 增强测试
  • 缓存保护机制
  • 熔断机制

服务的雪崩:

服务的调用是链式的,一个服务出现长时间阻塞,就会阻塞后面调用它的服务,导致整个服务链都不可用。用一个词来形容就是牵一发而动全身。

熔断:

被调用的服务一直没有响应,直接断开连接

降级:

服务熔断后,服务由正常降级为缺省,返回兜底数据(缺省数据)

的使用

Neflix提供的熔断器组件,当服务出现长时间等待或不可用情况,能实现熔断和降级处理

使用方法:

  1. 给服务引入依赖
   <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>            <version>2.2.10.RELEASE</version>        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 启动类加@EnableHystrix 或 @EnableCircuitBreaker
  2. 给被调用的方法加@HystrixCommand注解
  3. 在控制器类中添加方法,返回兜底数据
@HystrixCommand(fallbackMethod = "getDefaultProduct")    @GetMapping("/product/{id}")    public ResponseEntity<Product> findProductById(@PathVariable("id")Long id){        try {            int millis = new Random().nextInt(3000);            System.out.println("等待时间:" + millis);            Thread.sleep(millis);        } catch (InterruptedException e) {            e.printStackTrace();        }        //返回模拟数据        Product product = new Product(id,"测试商品" + port,99.98);        return ResponseEntity.ok(product);    }    /**     * 降级处理的方法     * @param id     * @return     */    public ResponseEntity<Product> getDefaultProduct(@PathVariable("id")Long id){        //返回模拟数据        Product product = new Product(id,"兜底数据---商品" ,0.0);        return ResponseEntity.ok(product);    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

自定义熔断时间
在配置文件中配置

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
  • 1

Hystrix的隔离机制

Hystrix为每个调用的方法配置了单独隔离的资源

隔离机制有

  • 线程池隔离

    为每个调用的方法单独分配线程池,每个方法的调用使用自己的线程池

    优点:

  1. 可以控制并发量,起到削峰的作用
  2. 对任务实现异步处理,任务多了可以在线程池排队慢慢处理

缺点:

  1. 系统资源的消耗比较大
  2. 控制比较复杂
  • 信号量隔离

为每个调用的方法设置阈值,每次调用会记录次数(信号量),信号量超过阈值后,直接放弃

缺点:

  1. 功能简单,超过阈值直接放弃

优点:

  1. 系统资源的消耗较少
  2. 控制比较简单
# 设置隔离策略 THREAD\SEMAPHOREhystrix.command.default.execution.isolation.strategy=THREAD
  • 1
  • 2
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发