当前位置: 首页 > news >正文

七、Spring Cloud Alibaba-Sentinel

一、引言

1、了解服务可用性问题,服务挂掉原因
缓存击穿、单点故障、流量激增、线程池爆满、CPU飙升、DB超时、缺乏容错机制或保护机制、负载不均、服务雪崩、异常没处理等。

服务雪崩效应:因服务提供者的不可用导致服务调用者的不可用,并将 不可用逐渐放大的过程。

2、常见容错机制

  • 超时机制。
  • 服务限流。
  • 隔离。服务线程访问数量隔离或信号隔离。
  • 服务熔断。远程服务不稳定或者网络抖动时暂时关闭,当依赖服务大量超时,没有必要再去请求,直接返回一个异常信息。单服务熔断后,需考虑服务降级处理。
  • 服务降级。有服务熔断,避让有服务降级,相当于兜底方案。当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源,最终产生雪崩的效果。客户端自己创建一个方案,比如备用接口、缓存、mock数据,让服务可用,需考虑业务场景。

主要为了解决因服务可用性的问题,引入Sentinel。高可用防护/容错机制,尤其是针对流量的防护。

二、Sentinel 介绍

Sentinel,分布式系统的流量防卫兵,阿里巴巴开源,面向分布式服务架构的高可用防护组件。 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

官方文档地址:
https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
https://github.com/alibaba/Sentinel/wiki
https://sentinelguard.io/zh-cn/

Sentinel和 Hystrix 对比:
Hystrix地址: https://github.com/Netflix/Hystrix
在这里插入图片描述

三、如何使用

sentinel 的使用可以分为两个部分:

  • 核心库(Java 客户端):不依赖任何框架/库,不依赖 Dashboard,但是结合 Dashboard 可以取得最好的效果。能够运行于Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。

核心库的使用,sentinel-core核心库在cloud中使用,可可在单独的springboot项目中使用。

主要是学习各种规则的定义和使用。
定于规则和流控资源等看官网有案例:
https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8

规则的种类:

  • 流量控制规则
  • 熔断降级规则
  • 系统保护规则
  • 访问控制规则
  • 热点规则

在这里插入图片描述

四、 springboot整合sentinel

以流控规则和熔断降级规则说明。

4.1 流控规则

我们先在一个单纯的springboot使用一下流控规则:
方案一:代码中写完成
1、首先添加依赖。

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><modelVersion>4.0.0</modelVersion><artifactId>sentinel-order</artifactId><dependencies><!--需依赖web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--sentinel核心库--><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version></dependency></dependencies></project>

2、创建一个hello接口,给一个对应的资源。然后给该资源设置一个流控的规则设置。

/*** @Description: 流控测试1*/
@RestController
@Slf4j
public class HelloController {//资源名称private static final String RESOURCE_NAME = "hello";/*** 进行sentinel 流控,* 对hello定义一个 RESOURCE_NAME 的资源名称进行流控* 通常资源名称会和接口名称保持一致**/@RequestMapping("/get")public  String hello(){Entry entry = null;// 务必保证 finally 会被执行try{//sentinel针对资源进行限制// 资源名可使用任意有业务语义的字符串,注意数目不能太多(超过 1K),超出几千请作为参数传入而不要直接作为资源名entry = SphU.entry(RESOURCE_NAME);log.info("业务逻辑-----");return "hello";} catch (BlockException e) {//资源访问阻止,被限流或被降级//进行相应的操作log.info("Block!!!!!");return "被流控了!!!";} catch (Exception ex) {// 若需要配置降级规则,需要通过这种方式记录业务异常Tracer.traceEntry(ex, entry);} finally {// 务必保证 exit,务必保证每个 entry 与 exit 配对if (entry != null) {entry.exit();}}return null;}/*** 定于规则。初始化时运行*/@PostConstructprivate static void initFlowRules(){//流控规则ArrayList<FlowRule> rules = new ArrayList<>();//流控FlowRule flowRule = new FlowRule();//设置保护的资源,对哪个资源进行流控规则flowRule.setResource(RESOURCE_NAME);//设置流控规则QPSflowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//设置受保护的资源阈值 set limit QPS to 20//1秒只能访问一次,如果超过就会进入上面的BlockException 中,返回被流控flowRule.setCount(1);rules.add(flowRule);//加载配置好的规则FlowRuleManager.loadRules(rules);}}

3、测试,超过一秒一次请求就会被流控
在这里插入图片描述

这样写如果流控资源太多,代码冗余使用注解的形式完成重复代码流控部分。
方案二:使用注解形式。
1、依赖新增sentinel-annotation-aspectj的依赖

<!--@SentinelResource注解,需依赖-->
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-annotation-aspectj</artifactId><version>1.8.0</version>
</dependency>

2、需配置支持该注解的Bean

@Component
public class SentinelResourceAspectConfig {@Beanpublic SentinelResourceAspect sentinelResourceAspect(){return new SentinelResourceAspect();}
}

3、重写一个接口来实现流控规则

/*** @Description: 流控测试2,注解形式*/
@RestController
@Slf4j
public class SentinelController {private static final String USER_RESOURCE_NAME = "sentinelApi";/*** @SentinelResource 改善之前hello接口的资源定于和被流控降级的处理方法* value 定于资源* blockHandler 设置流控降级后的方法(默认该方法必须声明在同一类中)。* 如果不想在同一类中,需添加一个参数指定类,比如 blockHandlerClass = User.class。但是blockHandler对应的方法需static修饰。fallback和这个一样* fallback 单接口出现异常,就可以交给fallback指定的方法进行处理。还可以* blockHandler和fallback如果同时指定,blockHandler优先级更高。* @return*/@GetMapping("/sentinelApi")@SentinelResource(value =USER_RESOURCE_NAME,//降级后的处理方法blockHandler = "blockHandlerBySentinelApi",//降级的方法不在同一类中可以用blockHandlerClass指定//blockHandlerClass = User.class,//异常执行的方法fallback = "fallbackBySentinelApi"//可以排除指定的异常不处理//exceptionsToIgnore = {ArithmeticException.class})public User getUserResourceName(Integer id){int i = 1 / id;return new User("tc");}/*** blockHandler 函数,原方法调用被限流/降级/系统保护的时候调用* 注意:* 1、一定要public* 2、入参的值和返回值一定要和源方法保持一致,源方法:设置SentinelResource中的blockHandler对应的calss* 3、可以在参数最后面添加BlockException* @param ex* @return*/public User blockHandlerBySentinelApi(Integer id,BlockException ex){ex.printStackTrace();return new User("哇哦,被流控了");}public User fallbackBySentinelApi(Integer id,Throwable e){return new User("异常了,执行异常方法");}/*** 定于规则。初始化时运行*/@PostConstructprivate static void initFlowRules(){//流控规则ArrayList<FlowRule> rules = new ArrayList<>();//流控FlowRule flowRule = new FlowRule();//设置保护的资源,对哪个资源进行流控规则flowRule.setResource(USER_RESOURCE_NAME);//设置流控规则QPSflowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//设置受保护的资源阈值 set limit QPS to 20//1秒只能访问一次,如果超过就会进入上面的BlockException 中,返回被流控flowRule.setCount(1);rules.add(flowRule);//加载配置好的规则FlowRuleManager.loadRules(rules);}
}

4、测试,传参非0或0测试。
在这里插入图片描述
在这里插入图片描述

4.2 熔断降级规则

先看一下流控和降级区别。
流控是根据规则直接排除,降级是根据规则进行降级方法处理。
流控:一般设置在服务提供方。
降级:一般设置在服务消费方。

熔断降级调用逻辑:
比如A调用B,B接口如果触发降级,一旦触发降级,就会进入时间窗口之内,如果A再去请求B,则会直接调用降级方法,而不是调用B接口中的代码。如果时间窗口期过了,就会调用B接口的代码,如果第一次就异常,则再次熔断流转。

/*** @Description: 降级测试*/
@RestController
@Slf4j
public class Sentinel2Controller {private static final String DEGREDE_RESOURCE_NAME = "degrade";/*** 熔断降级规则处理测试接口* @param id* @return* @throws InterruptedException*/@GetMapping("degrade")@SentinelResource(value = DEGREDE_RESOURCE_NAME,entryType = EntryType.IN,blockHandler = "blockHandlerForDg")public User degrade(Integer id ) throws InterruptedException{int i = 1 / id;return new User("熔断降级规则处理测试接口");}public User blockHandlerForDg(Integer id,BlockException ex){return new User("熔断降级处理");}/*** 定于规则。初始化时运行*/@PostConstructprivate static void initFlowRules(){
//        //流控规则
//        ArrayList<FlowRule> rules = new ArrayList<>();
//
//        //流控
//        FlowRule flowRule = new FlowRule();
//        //设置保护的资源,对哪个资源进行流控规则
//        flowRule.setResource(USER_RESOURCE_NAME);
//        //设置流控规则QPS
//        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
//        //设置受保护的资源阈值 set limit QPS to 20
//        //1秒只能访问一次,如果超过就会进入上面的BlockException 中,返回被流控
//        flowRule.setCount(1);
//        rules.add(flowRule);
//        //加载配置好的规则
//        FlowRuleManager.loadRules(rules);//降级规则ArrayList<DegradeRule> degradeRules = new ArrayList<>();DegradeRule degradeRule = new DegradeRule();degradeRule.setResource(DEGREDE_RESOURCE_NAME);//设置降级规则:异常数degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);//设置阈值 触发熔断异常数2。degradeRule.setCount(2);//触发熔断最小请求数 2。必须请求2次,2次都异常才触发degradeRule.setMinRequestAmount(2);//统计时长,多长时间内触发上面的异常次数,单位:msdegradeRule.setStatIntervalMs(60*1000);//三个设置结合就是://一分钟内,执行了2次,出现了2次异常,就会触发熔断。其实源码是>=,所有会多请求一次才熔断//熔断窗口期。单位s。进入熔断窗口后,则直接走降级方法。//过了熔断窗口期,第一次调用还异常,继续流转熔断降级处理。degradeRule.setTimeWindow(10);degradeRules.add(degradeRule);DegradeRuleManager.loadRules(degradeRules);}
}

测试:连续调用3次就会直接调用熔断降级处理,不再执行接口中方法。
在这里插入图片描述

五、sentinel 控制台

告别上面的代码设置规则,代码设置有助于了解API和帮助看源码,有些属性需通过代码设置。
学习地址:

https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0

1、下载Sentinel 控制台
获取 Sentinel 控制台地址:
https://github.com/alibaba/Sentinel/releases
根据springcloud下载对应版本,我们下载1.8.0版本。

2、启动
注意:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。

从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel。可以参考鉴权模块文档 配置用户名和密码。

注:若您的应用为 Spring Boot 或 Spring Cloud 应用,您可以通过 Spring 配置文件来指定配置,详情请参考

直接启动命令:

java -jar sentinel-dashboard-1.8.0.jar
默认8080端口。

用户可以通过如下参数进行配置(修改端口、账号和密码):

地址:https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0#%E9%89%B4%E6%9D%83
  • -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080;
  • -Dsentinel.dashboard.auth.username=sentinel 用于指定控制台的登录用户名为 sentinel;
  • -Dsentinel.dashboard.auth.password=123456 用于指定控制台的登录密码为 123456;如果省略这两个参数,默认用户和密码均为 sentinel;
  • -Dserver.servlet.session.timeout=7200 用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;
  • 同样也可以直接在 Spring properties 文件中进行配置。

为方便启动可以创建.bat文件:

java -Dserver.port=8858 -Dsentinel.dashboard.auth.username=tc -Dsentinel.dashboard.auth.password=123456 -jar sentinel-dashboard-1.8.0.jar
pause

访问页面:http://localhost:8080/ 。修改后端口8858.
账号和密码默认:sentinel。修改后账号tc,密码123456.

界面如图所示:
在这里插入图片描述
3、客户端接入控制台
3.1 引入依赖
刚刚的spring-boot案例引入依赖:

<!--整合控制台-->
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>1.8.0</version>
</dependency>

3.2 配置启动参数
启动时加入 JVM 参数 -Dcsp.sentinel.dashboard.server=consoleIp:port 指定控制台地址和端口。若启动多个应用,则需要通过 -Dcsp.sentinel.api.port=xxxx 指定客户端监控 API 的端口(默认是 8719)。
IDEA可以在configurations设置。
在这里插入图片描述

3.3 重启启动项目
访问一下项目接口才会注册到Sentinel 控制台,然后访问控制台就会发现注册了一个服务。
在这里插入图片描述

六、spring cloud Alibaba整合Sentinel

1、引入依赖

<!--sentinel启动器-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、添加yml配置,为微服务设置sentinel控制台地址。

spring:application:name: order-sentinelprofiles:# 环境配置active: devcloud:sentinel:transport:dashboard: 127.0.0.1:8858

3、访问一下接口让服务注册到sentinel,查看sentinel控制台。
在这里插入图片描述

七、控制台页面配置

1、实时监控

监控接口时间节点的QPS、响应时间等。

2、簇点链路

显示所有能够进行流控、降级的资源。

3、流控规则

流控规则—flow control,其原理是监控应用流量的QPS或并发线程等指标,单达到指定对的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保证应用的高可用性。
3.1 应用场景:

  • 应对洪峰流量:秒杀、大促、下单、订单回流处理。
  • 消息型场景:削峰填谷,冷热启动。
  • 付费系统:根据使用流量付费。 API GateWay:
  • 精准控制API流量。

在这里插入图片描述
3.2 流控模式

  • 直接:就是当前接口资源。
  • 关联: 可以设置一个关联资源,如果关联资源超过设定的限流,则当前设置的资源就会受到影响。比如:下单高峰,每次下单会触发查询订单接口。则查询订单进行限流,关联资源设置下单接口。可以通过JMeter工具进行测试。
    在这里插入图片描述
  • 链路:入口资源,当前接口进行限流,受到影响的是入口资源。
    比如test1和test2都调用了getUser,对test2进行限流。
@Autowired
OrderService orderService;//关联流控1
@RequestMapping("test1")
public String test1(){return orderService.getUser();
}//关联流控2
@RequestMapping("test2")
public String test2(){return orderService.getUser();
}public class OrderServiceImpl implements OrderService {@SentinelResource(value = "getUser",blockHandler = "getUserBlockHandler")public String getUser() {return null;}public String getUserBlockHandler(BlockException e) {return "流控getUser";}
}

在这里插入图片描述
测试会发现不生效,需在配置文件中新增web-context-unify,原因是默认调用的一个链路被收敛了,程序察觉不到调用结构。

  cloud:sentinel:transport:dashboard: 127.0.0.1:8858web-context-unify: false #默认将调用链路收敛了

配置后就会有这么一个调用链路:
在这里插入图片描述
然后请求test2超过次数就会被流控。

3.3 流控效果:

  • 快速失败:多余的流量直接决绝,上面我们默认的就是快速失败。
  • Warm Up:预热,可以设置一个预热时长,访问流量进来,默认开始访问为3,在预热时间内慢慢增大到阈值。场景:可以配合缓存使用,在缓存中慢慢补全之前没数据的缓存,补全后流量慢慢递增。
  • 排队等待:可以设置一个超时时间,在激增流量之下超过阈值,不会直接拒绝,会在超时时间内处理之前的流量,如果还有时间就去处理后续的流量。即把空余时间段充分利用起来,需根据接口压测然后配置。

3.4 统一的异常处理
上面我们都使用 @SentinelResource注解定义每个接口的异常处理,也可以使用统一的异常处理,只是所有接口都走这个,不是定制化,异常处理接口不用加 @SentinelResource注解。
后续接口都用这个全局处理进行测试。

/*** @Description: 统一的异常注解* @Date: 2023/5/14 21:23*/
@Component
public class myBlockExceptionHander  implements BlockExceptionHandler {public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {System.out.println("BlockExceptionHandler 规则的详细信息:"+e.getRule());Result r = null;if(e instanceof FlowException){r = Result.error(100,"接口限流了");}else if(e instanceof DegradeException){r = Result.error(101,"服务降级了");}else if(e instanceof ParamFlowException){r = Result.error(102,"热点参数限流了");}else if(e instanceof SystemBlockException){r = Result.error(103,"触发系统保护规则了");}else if(e instanceof AuthorityException){r = Result.error(104,"授权规则不通过");}httpServletResponse.setStatus(500);httpServletResponse.setCharacterEncoding("utf-8");httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);new ObjectMapper().writeValue(httpServletResponse.getWriter(),r);}
}

4、熔断降级策略

界面如下:
在这里插入图片描述
界面配置说明:
4.1 慢调用比例

  • 最大RT(毫秒):接口处理时长超过设置的时间,那就是慢调用。
  • 比例阈值(0-1):比如设置0.1,表示10次请求中有一次慢调用就会进行熔断。
  • 最小请求数:比如设置为5,表示至少要请求5次。根据比例阈值配置,比如比例为0.1,最小请求数配置5,表示请求5次有一次慢调用就熔断太草率了,建议配置10(调用10次有一次慢调用)。
  • 熔断时长(秒):当满足熔断条件进入熔断持续的时长,此时处于半开状态,即过了熔断的持续时长,第一次调用还是慢比例,继续进入熔断时长。

4.2 异常比例
需配置的参数比例阈值、最小请求数、熔断时长和上面含义一致。
接口中需有异常。

@RequestMapping("add")
public String add(){System.out.println("新增订单");int i = 1 / 0;return "新增订单";
}

4.3 异常比例
需配置的参数异常数(异常的数量)、最小请求数、熔断时长。。
最小请求数、熔断时长和第一个含义一致。

5、热点规则

热点:经常访问的数据,如热点商品。
使用场景:热点商品访问/操作、用户/IP限制。
实现原理:热点淘汰策略(LRU)+ token Bucket流控。
在这里插入图片描述
界面配置说明:
getById的资源,第一个参数,一秒钟访问10次进行热点异常处理。如果参数值=1,一秒2次以上进行热点异常处理。

界面参数说明:

  • 资源名:接口设置的对应的资源名称。
  • 参数索引:接口中对应的第几个参数,默认0开始。索引位。
  • 单机阈值:根据QPS设置访问的数量。比如10。
  • 统计窗口时长:几秒钟访问的QPS是多少个(上面10个)单机阈值。

参数例外项,常用于设置热点参数。

  • 参数类型:什么类型的值。
  • 限流阈值:比如设置为2.
  • 参数值:值是多少,热点的参数。比如设置1,请求id为1的值,请求2次就进行热点异常处理。

热点参数和普通参数也可以反着写,多数是热点参数则配上面进行热点处理,下面配置普通参数进行放流处理。

6、系统保护规则

系统保护规则基于容量评估不到位、机器Load、CPU飙升、负载均衡不均等引起系统雪崩,能够对系统全局起到一个兜底防护。
在界面系统规则中新增:
在这里插入图片描述

  • Load 自适应仅对Linux/unix-like机器生效):系统 Load1作为启发指标,进自适应系统保护,当系统Load1超过设定的启发值,且系统当前的并发线数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQPs * minRt 估算得出。设定参考值一般是CPU cores * 2.5。
    https://www.cnblogscom/gentlemanhai/p/8484839.html
  • CPU 使用率 (1.5.0+ 版本): 当系统 CPU 使用率超过阈值即触发系统保护 (取值范围 0.0-1.0),比较灵敏。
  • 平均 RT:当单台机器上所有入口流量的平均 RT达到阈值即触发系统保护,单位是毫秒。
  • 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口QPS:当单台机器上所有入口流量的 QPS达到阈值即触发系统保护。

7、规则持久化

以上规则都是存储在内存中的,重启后就没在了,需要重新配置,所有需要持久化。
推模式:结合配置中心(nacos、zookeeper)进行推送到sentinel。
1、引入依赖

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

2、nacos配置中心配置流控规则
相关参数说明:https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81

dataID: order-sentinel-flow-rule
配置相关的流控规则。


[{"resource": "getById","controlBehavior": 0,"count": 2,"grade": 1,"limitApp": "default","strategy": 0
}]

3、项目yml配置新增

spring:application:name: order-sentinelprofiles:# 环境配置active: devcloud:sentinel:transport:dashboard: 127.0.0.1:8858web-context-unify: false #默认将调用链路收敛了datasource:flow-rule: #可以自定义nacos:#配置到nacos进行持久化server-addr: 127.0.0.1:8848username: nacospassword: nacosdataId: order-sentinel-flow-rulerule-type: flow

可配置项可以点击配置参数跳转到源码查看,例如datasource中nacos相关配置项:
在这里插入图片描述

八、sentinel整合openFeign

主要是运用于服务提供者进行降级,比如A(调用者)调用B(服务提供者),B异常对B服务进行降级处理。
即将之前学习的openFeign项目加入sentinel依赖,再写降级的类。
1、依赖依赖

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloud-demo</artifactId><groupId>com.tc</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>order-openfeign-sentinel</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!--nacos的服务注册与发现,无需写版本,spring-cloud-alibaba-dependencies会自动维护--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--添加openfeign依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--sentinel启动器--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency></dependencies></project>

2、添加一个降级处理openFeign的实现类,实现调用的远程接口。openFeign的接口上需配置fallback = 实现类.class

@FeignClient(name = "stock-service",path = "/stock",//openFeign的接口上需配置fallback = 实现类.classfallback = StockFeignServiceFallback.class)
public interface StockFeignService {//声明需要调用的接口对应的方法@RequestMapping("/reduce")public  String reduce();
}//降级处理openFeign的实现类
@Component
public class StockFeignServiceFallback implements StockFeignService{@Overridepublic String reduce() {return "降级了";}
}@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate StockFeignService stockFeignService;@RequestMapping("/add")public String add(){System.out.println("新增订单");//扣减库存的远端接口,同样写个异常测试String reduce = stockFeignService.reduce();return "openFeign远程调用:"+reduce + "---";}}

3、配置文件新增下面的配置。然后重启项目测试即可。

feign:sentinel:#开启feign和sentinel的整合enabled: true

相关文章:

七、Spring Cloud Alibaba-Sentinel

一、引言 1、了解服务可用性问题&#xff0c;服务挂掉原因 缓存击穿、单点故障、流量激增、线程池爆满、CPU飙升、DB超时、缺乏容错机制或保护机制、负载不均、服务雪崩、异常没处理等。 服务雪崩效应&#xff1a;因服务提供者的不可用导致服务调用者的不可用&#xff0c;并将…...

机器学习与深度学习——通过knn算法分类鸢尾花数据集iris求出错误率并进行可视化

什么是knn算法&#xff1f; KNN算法是一种基于实例的机器学习算法&#xff0c;其全称为K-最近邻算法&#xff08;K-Nearest Neighbors Algorithm&#xff09;。它是一种简单但非常有效的分类和回归算法。 该算法的基本思想是&#xff1a;对于一个新的输入样本&#xff0c;通过…...

【MySQL】MySQL基础知识详解

文章目录 1. MySQL概述1.1 数据库相关概念1.1.1 数据库、数据库管理系统与SQL1.1.2 关系型数据库与数据模型 1.2 MySQL数据库1.2.1 MySQL的安装与配置1.2.2 MySQL服务的启动与停止1.2.3 连接MySQL服务端 2. SQL2.1 SQL简介2.2 DDL2.2.1 数据库操作2.2.2 表操作2.2.2.1 创建表2.…...

RabbitMQ日常使用小结

一、使用场景 削峰、解耦、异步。 基于AMQP(高级消息队列协议)协议来统一数据交互,通过channel(网络信道)传递信息。erlang语言开发&#xff0c;并发量12000&#xff0c;支持持久化&#xff0c;稳定性好&#xff0c;集群不支持动态扩展。 RabbitMQ的基本概念 二、组成及工作流…...

​​​​​​​博物馆文物馆藏环境空气质量无线监控系统方案

博物馆文物馆藏环境空气质量无线监控系统方案 博物馆无线环境测控系统 博物馆恒温恒湿消毒净化系统 现代化博物馆空气质量一体化3D可视化管控平台 博物馆温湿度在线监控系统 博物馆光照在线监控系统 博物馆二氧化碳在线监控系统 博物馆在线监控系统 博物馆紫外线在线监控…...

测试理论----Bug的严重程度(Severity)和优先级(Priority)的分类

【原文链接】测试理论----Bug的严重程度&#xff08;Severity&#xff09;和优先级&#xff08;Priority&#xff09;的分类 一、Bug的严重程度&#xff08;Severity&#xff09; Bug的Severity&#xff08;严重程度&#xff09;指的是一个Bug对软件系统功能影响的程度&#…...

斯坦福、Nautilus Chain等联合主办的 Hackathon 活动,现已接受报名

由 Stanford Blockchain Accelerator、Zebec Protocol、 Nautilus Chain、Rootz Lab 共同主办的黑客松活动&#xff0c;现已接受优秀项目提交参赛申请。 在加密行业发展早期&#xff0c;密码极客们就始终在对区块链世界基础设施&#xff0c;在发展方向的无限可能性进行探索。而…...

00后卷王,把我们这些老油条卷的辞职信都写好了........

现在的小年轻真的卷得过分了。 前段时间我们公司来了个00年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家…...

JavaEE(系列12) -- 常见锁策略

目录 1. 乐观锁和悲观锁 2. 轻量级锁与重量级锁 3. 自旋锁和挂起等待锁 4. 互斥锁和读写锁 5. 可重入锁与不可重入锁 6. 死锁 6.1 死锁的必要条件 6.2 如何避免死锁 7. 公平锁和非公平锁 8. Synchronized原理及加锁过程 8.1 Synchronized 小结 8.2 加锁工作过程 8.2.1 偏向锁…...

前端nginx接口跨域

前提&#xff1a;vue项目本地接口通过proxy都可使用&#xff0c;但是项目部署在服务器上后发现所有接口出现503如下状况 简而言之&#xff1a;页面部署在域名为https://aa.bb.cc.com/vehicle/#/下&#xff0c;但是我接口需访问的是https:// azz.qqv.com/permission/company/gro…...

【国产虚拟仪器】基于 ZYNQ 的电能质量系统高速数据采集系统设计

随着电网中非线性负荷用户的不断增加 &#xff0c; 电能质量问题日益严重 。 高精度数据采集系统能够为电能质 量分析提供准确的数据支持 &#xff0c; 是解决电能质量问题的关键依据 。 通过对比现有高速采集系统的设计方案 &#xff0c; 主 控电路多以 ARM 微控制器搭配…...

Java前缀和算法

一.什么是前缀和算法 通俗来讲&#xff0c;前缀和算法就是使用一个新数组来储存原数组中前n-1个元素的和&#xff08;如果新数组的当前元素的下标为n&#xff0c;计算当前元素的值为原数组中从0到n-1下标数组元素的和&#xff09;&#xff0c;可能这样讲起来有点抽象&#xff0…...

pico 的两个双核相关函数的延时问题

pico高级API函数中&#xff0c; multicore_fifo_pop_timeout_us 和 multicore_fifo_push_timeout_us 的延时参数&#xff0c; 如修改为500微秒以上时&#xff0c;其延时似乎远远超过设定值&#xff0c;其反馈速度似乎被主核的交互所左右 &#xff0c;而修改为200以下时&#x…...

Doxygen源码分析: QCString类依赖的qstr系列C函数浅析

2023-05-20 17:02:21 ChrisZZ imzhuofoxmailcom Hompage https://github.com/zchrissirhcz 文章目录 1. doxygen 版本2. QCString 类简介3. qstr 系列函数浅析qmemmove()qsnprintfqstrdup()qstrfree()qstrlen()qstrcpy()qstrncpy()qisempty()qstrcmp()qstrncmp()qisspace()qstr…...

华为OD机试之一种字符串压缩表示的解压(Java源码)

一种字符串压缩表示的解压 题目描述 有一种简易压缩算法&#xff1a;针对全部由小写英文字母组成的字符串&#xff0c;将其中连续超过两个相同字母的部分压缩为连续个数加该字母&#xff0c;其他部分保持原样不变。 例如&#xff1a;字符串“aaabbccccd”经过压缩成为字符串“…...

Microsoft Project Online部署方案

目录 一、前言 二、Microsoft Project Online简介 三、Microsoft Project Online的优势 1、云端部署 2、多设备支持...

飞浆AI studio人工智能课程学习(3)-在具体场景下优化Prompt

文章目录 在具体场景下优化Prompt营销场景办公效率场景日常生活场景海报背景图生成办公效率场景预设Prompt 生活场景中日常学习Prompt: 给写完的代码做文档 将优质Prompt模板化Prompt 1:Prompt 1:Prompt 2步骤文本过长而导致遗失信息的示例修改后 特殊示例 如何提升安全性主要目…...

企业工程行业管理系统源码-专业的工程管理软件-提供一站式服务

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…...

Ehcache 整合Spring 使用页面、对象缓存

Ehcache在很多项目中都出现过&#xff0c;用法也比较简单。一般的加些配置就可以了&#xff0c;而且Ehcache可以对页面、对象、数据进行缓存&#xff0c;同时支持集群/分布式缓存。如果整合Spring、Hibernate也非常的简单&#xff0c;Spring对Ehcache的支持也非常好。EHCache支…...

Spring Cloud中的服务路由与负载均衡

Spring Cloud中的服务路由与负载均衡 一、服务路由1. 服务发现2. 服务注册3. 服务消费4. 服务提供5. 服务路由实现 二、负载均衡1. 负载均衡的概念2. 负载均衡算法3. 负载均衡实现4. 负载均衡策略5. 使用Spring Cloud实现负载均衡 三、服务路由与负载均衡的集成1. 集成背景2. 集…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...