简介

服务降级是一种增强用户体验的方式。当用户的请求由于各种原因被拒后,系统返回-一个事先设定好的、用户可以接受的,但又令用户并不满意的结果。这种请求处理方式称为服务降级。

Sentinel方法级降级

  1. 导入依赖
        <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  1. contreller层写法
    /**
* 根据id查询部门
*/
@SentinelResource(fallback = "getFallBack")
@GetMapping("/get/{id}")
public Depart get(@PathVariable Long id) {
return restTemplate.getForObject(PROVIDER_URL + "/get/" + id, Depart.class);
} /**
* 服务降级使用的方法
*/
public Depart getFallBack(Long id, Throwable t) {
log.info("id = " + id);
log.info("throwable = " + t.getMessage());
Depart depart = new Depart();
depart.setId(id);
depart.setName("no this depart");
return depart;
}

在调用get(@PathVariable Long id) 出错的情况下会调用降级的getFallBack(Long id) 方法。

3.验证

get(@PathVariable Long id)不能被访问。

日志

2023-12-01T19:50:26.401+08:00  INFO 17500 --- [nio-8080-exec-2] com.zjw.controller.DepartController      : id = 1
2023-12-01T19:50:26.401+08:00 INFO 17500 --- [nio-8080-exec-2] com.zjw.controller.DepartController : throwable = No instances available for depart-provider

Sentinel类级降级

  1. 定义降级使用的类

方法需要是static声明

package com.zjw.controller.fallback;

import com.zjw.domain.Depart;
import lombok.extern.slf4j.Slf4j; import java.util.List; /**
* DepartControllerFallBack
* @since 2023/12/01 19:56
*/
@Slf4j
public class DepartControllerFallBack {
/**
* 服务降级使用的方法
*/
public static Depart getFallBack(Long id, Throwable t) {
log.info("id = " + id);
log.info("throwable = " + t.getMessage());
Depart depart = new Depart();
depart.setId(id);
depart.setName("no this depart");
return depart;
} /**
* 服务降级使用的方法
*/
public static List<Depart> listFallBack(Throwable t) {
log.info("listFallBack");
log.info("throwable = " + t.getMessage());
Depart depart = new Depart();
depart.setName("no this depart");
return List.of(depart);
}
}
  1. Controller层

在需要降级的方法上标注上降级使用的方法和类

package com.zjw.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.zjw.controller.fallback.DepartControllerFallBack;
import com.zjw.domain.Depart;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate; import java.util.List; /**
* <p>
* 部门表 前端控制器
* </p>
*
* @since 2023-11-20
*/
@RestController
@RequestMapping("/depart")
@Slf4j
public class DepartController { @Resource
private RestTemplate restTemplate; private static final String PROVIDER_URL = "http://depart-provider/depart"; /**
* 根据id查询部门
*/
@SentinelResource(fallback = "getFallBack" , fallbackClass = DepartControllerFallBack.class)
@GetMapping("/get/{id}")
public Depart get(@PathVariable Long id) {
return restTemplate.getForObject(PROVIDER_URL + "/get/" + id, Depart.class);
} /**
* 查询所有部门
*/
@SuppressWarnings("unchecked")
@SentinelResource(fallback = "listFallBack" , fallbackClass = DepartControllerFallBack.class)
@GetMapping("/list")
public List<Depart> list() {
return (List<Depart>)restTemplate.getForObject(PROVIDER_URL + "/list", List.class);
}
}
  1. 验证

OpenFeign类级降级

导入依赖

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zjw</groupId>
<artifactId>sc-06-consumer-sentinel-degrade-openfeign-8080</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sc-06-consumer-sentinel-degrade-openfeign-8080</name>
<description>sc-06-consumer-sentinel-degrade-openfeign-8080</description>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2022.0.0</spring-cloud.version>
<spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<builder>paketobuildpacks/builder-jammy-base:latest</builder>
</image>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build> </project>

开打sentinel对openfeign支持

server:
port: 8080 spring:
application:
name: depart-consumer # 微服务名称
cloud:
nacos:
discovery:
server-addr: nacos-local:8848 # nacos注册中心地址
username: nacos # 用户名密码
password: nacos
openfeign:
client:
config:
default: # 这是一个map,设置默认配置
connect-timeout: 5000 # 连接超时时间
read-timeout: 5000 # 响应超时时间
depart-provider: # 指定服务的设置
connect-timeout: 4000 # 连接超时时间
read-timeout: 4000 # 响应超时时间 feign: # 打开 sentinel 对 feign 的支持
sentinel:
enabled: true

编写sentinel类

注意@RequestMapping("/fallback/depart")

package com.zjw.service;

import com.zjw.domain.Depart;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; /**
* @since 2023/12/01 21:11
*/
@Component
@Slf4j
@RequestMapping("/fallback/depart")
public class DepartServiceFallBack implements IDepartService{ @Override
public boolean save(Depart depart) {
log.info("save..fallback");
return false;
} @Override
public boolean remove(Long id) {
log.info("remove..fallback");
return false;
} @Override
public boolean update(Depart depart) {
log.info("update..fallback");
return false;
} @Override
public Depart get(Long id) {
log.info("get..fallback");
return null;
} @Override
public List<Depart> list() {
log.info("list..fallback");
return null;
} @Override
public List<String> discovery() {
log.info("discovery..fallback");
return null;
}
}

在接口上标注使用的fallback类

@FeignClient(value = "depart-provider", path = "/depart", fallback = DepartServiceFallBack.class)
public interface IDepartService {
....
}

Sentinel——服务降级的更多相关文章

  1. 学习一下 SpringCloud (四)-- 服务降级、熔断 Hystrix、Sentinel

    (1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...

  2. Spring Cloud Alibaba | Sentinel: 服务限流基础篇

    目录 Spring Cloud Alibaba | Sentinel: 服务限流基础篇 1. 简介 2. 定义资源 2.1 主流框架的默认适配 2.2 抛出异常的方式定义资源 2.3 返回布尔值方式定 ...

  3. Spring Cloud Alibaba | Sentinel: 服务限流高级篇

    目录 Spring Cloud Alibaba | Sentinel: 服务限流高级篇 1. 熔断降级 1.1 降级策略 2. 热点参数限流 2.1 项目依赖 2.2 热点参数规则 3. 系统自适应限 ...

  4. Spring Cloud 系列之 Alibaba Sentinel 服务哨兵

    前文中我们提到 Netflix 中多项开源产品已进入维护阶段,不再开发新的版本,就目前来看是没有什么问题的.但是从长远角度出发,我们还是需要考虑是否有可替代产品使用.比如本文中要介绍的 Alibaba ...

  5. 微服务调用之feign负载均衡及服务降级

    一,负载均衡: feign已经集成了ribbon,将service1,service2在不同端口启动多个实例可以自动负载均衡 idea: application.yml中server.port: ${ ...

  6. 五. SpringCloud服务降级和熔断

    1. Hystrix断路器概述 1.1 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败.这就造成有可能会发生服务雪崩.那么什么是服务雪崩呢 ...

  7. SpringCloud实战-Hystrix请求熔断与服务降级

    我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...

  8. SpringCloud系列七:Hystrix 熔断机制(Hystrix基本配置、服务降级、HystrixDashboard服务监控、Turbine聚合监控)

    1.概念:Hystrix 熔断机制 2.具体内容 所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝会自动烧断,以保护我们的电器, 那么如果换到了程序之中呢? 当现在服务的 ...

  9. SpringCloud系列八:Zuul 路由访问(Zuul 的基本使用、Zuul 路由功能、zuul 过滤访问、Zuul 服务降级)

    1.概念:Zuul 路由访问 2.具体内容 在现在为止所有的微服务都是通过 Eureka 找到的,但是在很多的开发之中为了规范微服务的使用,提供有一个路由的处理控制组件:Zuul,也就是说 Zuul ...

  10. 8.Hystrix-Feign配置服务降级

    项目中用到Feign调用服务端方法并做服务降级处理 1.application.properties配置: feign.hystrix.enabled=true 2.pom: <!--feign ...

随机推荐

  1. 7.1 闲话-Erdős–Gallai 定理和哈基米算法

    Erdős–Gallai 定理 前几天考试有一个建出最大流模型,转为最小割,然后模拟最小割的套路. 这一个套路并不是少见的.在 Gale-Ryser 定理和 Erdős–Gallai 定理的证明都体现 ...

  2. 深入剖析Base64加解密中遇到的坑点

    前言 最近开发过程中遇到了关于使用base64加密传输遇到的神奇问题.需求就是用户的id在链接上露出时需要加密处理,于是后端把下发的用户id改成了base64加密处理后下发了,前端只需要把加密后的用户 ...

  3. windows jdk环境变量配置

    新建环境变量[classpath]变量值为[.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar] 新建环境变量[JAVA_HOME]变量值为jdk的安装目录 如:[ ...

  4. keycloak~认证与校验使用说明

    主要内容 密码认证 授权码认证 哪个client申请的code,使用哪个client获取token 客户端认证 在kc开通了服务端帐号之后,可通过client_id和client_secret来获取t ...

  5. php如何处理表单和数据库字段不匹配

    // 假设从表单接收到的数据 $formData = [ 'first_name' => $_POST['first_name'], 'last_name' => $_POST['last ...

  6. 使用Express对mysql进行增改查操作(完全代码版本)

    使用Express对mysql进行增改查操作(完全代码版本) 今天发的是Express对mysql进行增删改操作的所有代码,这个代码还没有完善好,都是一些基础的增删改查操作,有一些地方也写上了注释方便 ...

  7. Ctfhub-SSRF部分做题记录

    Ctfhub-SSRF部分做题记录 上传文件 提示:这次需要上传一个文件到flag.php了.祝你好运 进入flag.php 发现没有提交按钮 修改源代码,加个提交按钮 抓包 修改host为127.0 ...

  8. 多智能体粒子环境(Multi-Agent Particle Env)食用指南--从入门到入土

    0.项目地址: 原地址:openai/multiagent-particle-envs: Code for a multi-agent particle environment used in the ...

  9. 解决PyCharm提示Error: Please select a valid Python interpreter

    前言 Pycharm运行Python3.7.8的程序时发现源程序运行报错(非语法错误) Error:please select a valid Python interpreter 解决 第一步:打开 ...

  10. Joker 全栈低代码智能开发平台:开启高效开发新时代

    低代码开发技术凭借其独特优势,正逐渐成为软件开发领域的关键力量.Gartner 预测,到 2025 年,全球 70% 的新应用将采用低代码 / 无代码技术.Forrester 报告显示,中国低代码市场 ...