您的位置:首页 > 文旅 > 旅游 > 网店运营管理与营销推广_免费企业建站系统排名_郑州今日重大新闻_哈尔滨seo关键词

网店运营管理与营销推广_免费企业建站系统排名_郑州今日重大新闻_哈尔滨seo关键词

2024/10/31 11:12:57 来源:https://blog.csdn.net/2302_76363587/article/details/143224878  浏览:    关键词:网店运营管理与营销推广_免费企业建站系统排名_郑州今日重大新闻_哈尔滨seo关键词
网店运营管理与营销推广_免费企业建站系统排名_郑州今日重大新闻_哈尔滨seo关键词

1.微服务容错方案介绍

  • 限流
  • 漏斗:不管流量多大,均匀的流入容器,令牌桶算法,漏桶算法
  • 熔断:保险丝,熔断服务,为了防止整个系统故障,包含当前和下游服务
  • 降级:抛弃一些非核心的接口和数据,返回兜底数据
  • 隔离:服务和资源互相隔离,比如网络资源、机器资源、线程资源等,不会因为某个服务的资源不足而抢占其他服务的资源
  • 熔断和降级差异点
    • 相同点
      • 从可用性和可靠性出发,为了防止系统崩溃
      • 最终让用户体验到的是某些功能暂时不能用
    • 不同点
      • 服务熔断一般是下游服务故障导致的,而服务降级一般是从整体系统负荷考虑,由调用方控制
  • 想进行微服务的容错,业界目前有Sentinel、Hystrix,相对于AlibabaCloud而言,Sentinel是最好的搭配

2.Sentinel简介

  • 什么是Sentinel

    • 阿里巴巴开源的分布式系统流控工具
    • 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性
    • 丰富的应用场景:消息削峰填谷、集群流量控制、实时熔断下游不可用应用等
    • 完备的实时监控:Sentinel同时提供实时的监控功能
    • 提供开箱即用的与其它开源框架/库的整合模块,例如与Spring Cloud、Dubbo、gRPC的整合
  • 官网:介绍 · alibaba/Sentinel Wiki · GitHub

  • 核心概念:

    • 资源:是Sentinel中的核心概念之一,可以是Java程序中的任何内容,可以是服务或者方法甚至代码,总结起来就是我们要保护的东西
    • 规则:围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。通俗来讲就是定义怎样的方式保护资源。
  • Sentinel分为两个部分

    • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
    • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

3.微服务整合Sentinel

  • 先搭建一个Sentinel控制台,Linux(推荐)或Windows皆可

  • 控制台包含如下功能:

    • 查看机器列表以及健康情况:收集Sentinel客户端发送的心跳包,用于判断机器是否在线
    • 监控(单机和集群聚合):通过Sentinel客户端暴露的监控API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控
    • 规则管理和推送:统一管理推送规则
    • 鉴权:生产环境中鉴权非常重要。这里每个开发者需要根据自己的实际情况进行定制
    • 注意:Sentinel控制台目前仅支持单机部署
  • 引入依赖

    <!--sentinel-->
    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    
  • 配置文件

    spring:cloud:# sentinel配置sentinel:transport:# 控制台dashboard: 127.0.0.1:8080# 本地启动的端口,随机选个不被占用的,与dashboard进行数据交互,会在应用对应的机器上启动一个http server,该server会与Sentinel控制台做交互,若被占用,则开始+1依次扫描port: 9998
    
  • 微服务注册上去后,由于Sentinel是懒加载模式,所以需要访问微服务后才会在控制台出现

4.Sentinel流控规则

  • 流量控制(flow control)

    • 原理是监控应用流量的QPS或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性
  • 两种规则

    • 基于统计并发线程数的流量控制
      • 并发数控制用于保护业务线程池不被慢调用耗尽
      • Sentinel并发控制不负责创建和管理线程池,而是简单统计当前请求上下文的线程数目(正在执行的调用数目)
      • 如果超出阈值,新的请求会被立即拒绝,效果类似于信号量隔离
    • 基于统计QPS的流量控制
      • 当QPS超过某个阈值的时候,则采取措施进行流量控制
  • 控制面板介绍

    • 资源名:默认是请求路径,可自定义

    • 针对开源:对哪个微服务进行限流,默认是不区分来源全部限流,这个是针对区分上游服务进行限流,比如用户服务被订单服务、视频服务调用,就可以针对来源进行限流

    • 流控效果:

      • 直接拒绝:默认的流控方式,当QPS超过规则的阈值后,新的请求就会被立即拒绝

      • Warm Up:冷启动/预热,如果系统在此之前长期处于空闲的状态,我们希望处理请求的数量是缓步的增多,经过预期的时间以后,到达系统处理请求个数的最大值

      • 匀速排队:严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法,主要用于处理间隔性突发的流量,如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求

        • 注意

          • 匀速排队等待策略是Leaky Bucket算法结合虚拟队列等待机制实现的
          • 匀速排队模式暂时不支持QPS>1000的场景
            在这里插入图片描述

          在这里插入图片描述

  • 流控规则会下发到微服务,微服务如果重启,则流控规则会消失,可以持久化配置

5.Sentinel熔断规则

  • 熔断降级(虽然是两个概念,基本都是互相配合)

    • 对调用链路中不稳定的资源进行熔断降级,也是保障高可用的重要措施之一
    • 对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩
    • 熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置
  • Sentinel熔断策略

    • 慢调用比例(响应时间):选择以慢调用比例作为阈值,需要设置允许的慢调用RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用

    • 异常比例:当单位统计时长内异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断

    • 异常数:当单位统计时长内的异常数目超过阈值之后会自动进行熔断

      在这里插入图片描述

  • 服务熔断一般有三种状态

    • 熔断关闭(Closed)

      • 服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制
    • 熔断开启(Open)

      • 后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法
    • 半熔断(Half-Open)

      • 所谓半熔断就是尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率

        在这里插入图片描述

  • 熔断恢复

    • 经过熔断时长后熔断器会进入探测恢复状态(Half-Open状态)尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率
    • 如果成功率达到预期,则说明服务已恢复,进入熔断关闭状态;如果成功率仍然很低,则重新进入熔断状态

6.Sentinel自定义异常数据开发

  • 异常种类

    • FlowException:限流异常
    • DegradeException:降级异常
    • ParamFlowException:参数限流异常
    • SystemBlockException:系统负载异常
    • AuthorityException:授权异常
  • 异常处理器代码

    package com.gen.exception;import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
    import com.alibaba.csp.sentinel.slots.block.BlockException;
    import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
    import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
    import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
    import com.gen.enums.BizCodeEnum;
    import com.gen.util.ResponseJsonUtil;
    import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;/*** Sentinel限流异常处理器*/
    @Component
    public class SentinelBlockHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {if (e instanceof FlowException) {ResponseJsonUtil.responseJson(response, BizCodeEnum.CONTROL_FLOW);} else if (e instanceof DegradeException) {ResponseJsonUtil.responseJson(response, BizCodeEnum.CONTROL_DEGRADE);} else if (e instanceof AuthorityException) {ResponseJsonUtil.responseJson(response, BizCodeEnum.CONTROL_AUTH);}}
    }
    

7.Sentinel整合OpenFeign兜底数据配置

  • 添加依赖

    <!--sentinel-->
    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    
  • 配置文件开启Feign对Sentinel的支持

    # 开启Feign对Sentinel的支持
    feign:sentinel:enabled: true
    
  • 创建容错类,实现对应的服务接口,记得加注解

    package com.gen.feign;import com.gen.enums.JsonData;
    import org.springframework.stereotype.Service;/*** 订单服务异常时返回的兜底数据*/
    @Service
    public class OrderFeignServiceFallback implements OrderFeignService {@Overridepublic JsonData rpcQueryOrderState(String outTradeNo) {return JsonData.buildSuccess("rpcQueryOrderState-兜底数据");}
    }
    
  • 配置Feign容错类配置

    package com.gen.feign;import com.gen.enums.JsonData;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;@FeignClient(name = "gen-order-service", fallback = OrderFeignServiceFallback.class)
    public interface OrderFeignService {/*** 查询订单状态** @param outTradeNo* @return*/@GetMapping("api/v1/order/rpcQueryOrderState")JsonData rpcQueryOrderState(@RequestParam("outTradeNo") String outTradeNo);
    }
    

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com