【Spring Cloud Alibaba】9 - OpenFeign集成Sentinel实现服务降级

目录

  • 一、简介
    • Sentinel 是什么
    • 如何引入Sentinel
  • 二、服务搭建
    • 1.安装Sentinel控制台
      • 1.1 下载
      • 1.2 启动
      • 1.3 访问
    • 2.改造服务提供者cloud-provider服务
      • 2.1 引入依赖
      • 2.2 添加API
      • 2.3 添加配置文件
    • 3.改造cloud-consumer-feign服务
      • 3.1 引入依赖
      • 3.2 添加Feign接口
      • 3.3 添加服务降级类
      • 3.4 改造FeignService
      • 3.5 修改配置文件
  • 三、运行测试
    • 1.启动项目
      • 1.1 启动服务提供者
      • 1.2 启动服务消费者
    • 2.调用测试接口
      • 2.1 OpenFeign服务降级测试
      • 2.2 Sentinel流控规则测试

温馨提示:全套教程请查看 教程总览

一、简介

Sentinel 是什么

Sentinel是分布式系统的流量防卫兵。

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、流量路由、熔断降级、系统自适应过载保护、热点流量防护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。我们可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。我们只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供Java/Go/C++ 等多语言的原生实现。
  • 完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。我们可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

在这里插入图片描述
Sentinel 分为两个部分:

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

如何引入Sentinel

如果要在我们的项目中引入 Sentinel,使用 group ID 为 com.alibaba.cloud 和 artifact ID 为 spring-cloud-starter-alibaba-sentinel 的 starter。

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

参考文档 请查看 官网

二、服务搭建

1.安装Sentinel控制台

1.1 下载

Sentinel提供了多种安装方式,包括:

  • 下载源码通过Maven构建
  • 下载发行包解压安装

这里我们通过下载 最新稳定版本 发行包的方式安装。
在这里插入图片描述

1.2 启动

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

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080

1.3 访问

打开浏览器访问:http://localhost:8080/
默认用户名和密码都是 sentinel
在这里插入图片描述

2.改造服务提供者cloud-provider服务

有关 cloud-provider 服务的搭建过程,请参考之前的章节 基于Spring Boot 3.x 搭建教程

2.1 引入依赖

pom.xml 内容如下:

<?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"><modelVersion>4.0.0</modelVersion><parent><groupId>org.ash</groupId><artifactId>spring-cloud-alibaba-demo</artifactId><version>${revision}</version></parent><artifactId>cloud-provider</artifactId><description>服务提供者</description><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Nacos注册中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- Nacos配置中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- bootstrap配置 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><!--alibaba-sentinel--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><plugins><!-- 打包插件 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins><!-- 将源码中的xml文件打包到jar中 --><resources><resource><directory>src/main/java</directory><excludes><exclude>**/*.java</exclude></excludes></resource><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes></resource></resources></build>
</project>

2.2 添加API

新建 TestSentinelController.java,添加测试API,并且定义sentinel资源

Sentinel 提供了 @SentinelResource 注解用于定义资源,并提供了 AspectJ 的扩展用于自动定义资源、处理 BlockException 等。

  • value:资源名称,必需项(不能为空)
  • blockHandler / blockHandlerClassblockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockExceptionblockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

内容如下:

package org.ash.provider.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestSentinelController {@GetMapping("/provider/sentinel/test/{message}")@SentinelResource(value = "providerSentinelTest", blockHandler = "handlerBlockHandler")public String providerSentinelTest(@PathVariable("message") String message) {return "sentinel测试:" + message;}public String handlerBlockHandler(@PathVariable("message") String message, BlockException exception) {return "providerSentinelTest服务不可用," + "触发sentinel流控配置规则"+"\t"+"o(╥﹏╥)o";}
}

2.3 添加配置文件

resources目录下新建 application.yml 配置文件,内容如下:

spring:cloud:sentinel:transport:dashboard: localhost:8080 #配置Sentinel dashboard控制台服务地址port: 8719 #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口

3.改造cloud-consumer-feign服务

有关 cloud-consumer-feign 服务的搭建过程,请参考之前的章节 基于Spring Boot 3.x 搭建教程

3.1 引入依赖

pom.xml 内容如下:

<?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"><modelVersion>4.0.0</modelVersion><parent><groupId>org.ash</groupId><artifactId>spring-cloud-alibaba-demo</artifactId><version>${revision}</version></parent><artifactId>cloud-consumer-feign</artifactId><description>服务消费者-feign</description><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Nacos注册中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- loadbalancer负载均衡 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</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><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><plugins><!-- 打包插件 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins><!-- 将源码中的xml文件打包到jar中 --><resources><resource><directory>src/main/java</directory><excludes><exclude>**/*.java</exclude></excludes></resource><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes></resource></resources></build>
</project>

3.2 添加Feign接口

FeignService.java 中新增调用服务提供者接口
在这里插入图片描述
内容如下:

package org.ash.consumer.feign.service;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@FeignClient(value = "cloud-provider")
public interface FeignService {@GetMapping("/provider/test/{message}")public String getProviderTest(@PathVariable("message") String message);@GetMapping("/provider/sentinel/test/{message}")public String providerSentinelTest(@PathVariable("message") String message);
}

3.3 添加服务降级类

新建 FeignServiceFallback.java 服务降级类,实现 FeignService.java 并实现方法
在这里插入图片描述
内容如下:

package org.ash.consumer.feign.service.fallback;import org.ash.consumer.feign.service.FeignService;
import org.springframework.stereotype.Component;@Component
public class FeignServiceFallback implements FeignService {@Overridepublic String getProviderTest(String message) {return "对方服务不可用,开始服务降级处理";}@Overridepublic String providerSentinelTest(String message) {return "对方服务不可用,开始服务降级处理";}
}

3.4 改造FeignService

改造 FeignService.java@FeignClient 注解,添加 fallback 属性
内容如下:

package org.ash.consumer.feign.service;import org.ash.consumer.feign.service.fallback.FeignServiceFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@FeignClient(value = "cloud-provider", fallback = FeignServiceFallback.class)
public interface FeignService {@GetMapping("/provider/test/{message}")public String getProviderTest(@PathVariable("message") String message);@GetMapping("/provider/sentinel/test/{message}")public String providerSentinelTest(@PathVariable("message") String message);
}

3.5 修改配置文件

默认 sentinel 对 feign 的支持是关闭的,我们需要在配置文件中打开。
内容如下:

server:port: 9003spring:application:# 服务名称name: cloud-consumer-feigncloud:nacos:# nacos注册中心discovery:# 服务ip:portserver-addr: 127.0.0.1:8848openfeign:client:config:default:#连接超时时间connectTimeout: 5000#读取超时时间readTimeout: 5000# 开启feign集成sentinel服务降级
feign:sentinel:enabled: truemanagement:endpoints:web:exposure:include: '*'

三、运行测试

1.启动项目

1.1 启动服务提供者

在这里插入图片描述

1.2 启动服务消费者

在这里插入图片描述

2.调用测试接口

2.1 OpenFeign服务降级测试

打开浏览器调用我们之前写的测试接口 http://localhost:9003/consumer/feign/sentinel/test/sentinel,成功返回消息
在这里插入图片描述
这时我们停止服务提供者 cloud-provider 服务
在这里插入图片描述

然后再次通过浏览器调用测试接口 http://localhost:9003/consumer/feign/sentinel/test/sentinel,看到返回服务降级的信息,表示服务降级成功
在这里插入图片描述

2.2 Sentinel流控规则测试

重新启动 cloud-provider 服务提供者
在这里插入图片描述
再次通过浏览器调用测试接口 http://localhost:9003/consumer/feign/sentinel/test/sentinel,然后打开Sentinel 控制台,刷新页面,找到测试接口添加流控规则
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 流控规则 资源名 对应代码 @SentinelResourcevalue 值。
  • 流控规则 单机阈值1 表示1秒钟内请求1次就是正常,若超过1次,就会失败,执行服务提供者的 blockHandler

通过浏览器快速调用测试接口 http://localhost:9003/consumer/feign/sentinel/test/sentinel,查看是否返回流控配置规则消息,如果返回流控配置规则消息,则表示 Sentinel 流控规则配置成功。
在这里插入图片描述

至此,OpenFeign集成Sentinel实现服务降级成功!!!

温馨提示:全套教程请查看 教程总览

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/302441.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023.4.7 机器学习周报

目录 引言 Abstract 文献阅读 1、题目 2、引言 3、过去方案和Motivation 4、Segment Anything模型 5、创新点 6、实验过程 7、实验结果 1、评价绩效 2、检测评价 3、跟踪评价 8、 结论 总结 引言 本周阅读了一篇关于高效的任意分割模型的文献&#xff0c;用于自…

Splunk Attack Range:一款针对Splunk安全的模拟测试环境创建工具

关于Splunk Attack Range Splunk Attack Range是一款针对Splunk安全的模拟测试环境创建工具&#xff0c;该工具完全开源&#xff0c;目前由Splunk威胁研究团队负责维护。 该工具能够帮助广大研究人员构建模拟攻击测试所用的本地或云端环境&#xff0c;并将数据转发至Splunk实例…

Pytest插件pytest-selenium-让自动化测试更简洁

在现代Web应用的开发中&#xff0c;自动化测试成为确保网站质量的重要手段之一。而Pytest插件 pytest-selenium 则为开发者提供了简单而强大的工具&#xff0c;以便于使用Python进行Web应用的自动化测试。本文将深入介绍 pytest-selenium 插件的基本用法和实际案例&#xff0c;…

达梦数据库的V$DM_INI和V$PARAMETER系统视图

V$DM_INI和V$PARAMETER是达梦数据库中两个常用的系统视图&#xff0c;用于查看数据库的配置参数。这两个视图的主要区别在于它们展示参数的来源和用途。 V$DM_INI V$DM_INI视图主要用于展示数据库启动时加载的初始化参数信息。这些信息通常来自于数据库的初始化参数文件&…

VSCode+Cmake 调试时向目标传递参数

我有一个遍历文件层次结构的程序&#xff0c;程序根据传入的文件路径&#xff0c;对该路径下的所有文件进行遍历。这个程序生成一个名为 ftw 的可执行文件&#xff0c;如果我要遍历 /bin 目录&#xff0c;用法为&#xff1a; ftw /bin问题是&#xff0c;如果我想单步跟踪&…

docker + miniconda + python 环境安装与迁移(简化版)

本文主要列出从安装dockerpython环境到迁移环境的整体步骤。windows与linux之间进行测试。 详细版可以参考&#xff1a;docker miniconda python 环境安装与迁移&#xff08;详细版&#xff09;-CSDN博客 大概过程手绘了一下&#xff1a; 一、docker 安装 略过&#xff0c…

数据库之DQL操作(数据查询语言)

DQL英文全称是Data Query Language(数据查询语言)&#xff0c;数据查询语言&#xff0c;用来查询数据库中表的记录。查询关键字: SELECT。 本节介绍以下表为例&#xff1a; create table emp(id int comment 编号&#xff0c;workno varchar(10) comment 工号&#xff0c;nam…

Kafka参数介绍

官网参数介绍:Apache KafkaApache Kafka: A Distributed Streaming Platform.https://kafka.apache.org/documentation/#configuration

java中使用雪花算法(Snowflake)为分布式系统生成全局唯一ID

&#xff08;全局唯一ID的解决方案有很多种&#xff0c;这里主要是介绍和学习Snowflake算法&#xff09; 什么是雪花算法&#xff08;Snowflake&#xff09; 雪花算法&#xff08;Snowflake Algorithm&#xff09;是由Twitter公司在2010年左右提出的一种分布式ID生成算法&…

并查集-合并集合

#include<iostream> using namespace std; const int N 100010;int n, m; int p[N]; int find(int x)//返回x的祖宗节点路径压缩 {if (p[x] ! x)p[x] find(p[x]);return p[x]; } int main() {scanf("%d%d", &n, &m);for (int i 1; i < n; i)p[i]…

html写一个登录注册页面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册登录界面Ⅰ</title><link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.mi…

一闪论文靠谱吗 #媒体#笔记

一闪论文是一个以其高效、靠谱的特点而闻名的论文写作工具&#xff0c;它不仅可以帮助用户快速完成论文&#xff0c;还能够有效降低查重率&#xff0c;是许多学生和学者的首选。 首先&#xff0c;一闪论文的操作简单方便&#xff0c;用户只需上传论文内容&#xff0c;选择需要查…

linux上使用redis-cli登录以及操作redis

1、找到redis-cli 2、输入redis-cli回车 3、登录redis 输入auth密码 4、登录成功

基于Java+SpringBoot+Vue剧场管理系统(源码+文档+部署+讲解)

一.系统概述 二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针…

OSCP靶场--Nagoya

OSCP靶场–Nagoya 考点 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.214.21 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-02 08:52 EDT Nmap scan report for 192.168.214.21 Host is up (0.38s latency).…

OpenCV与AI深度学习 | 实战 | 使用OpenCV确定对象的方向(附源码)

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;实战 | 使用OpenCV确定对象的方向(附源码) 导读 本文将介绍如何使用OpenCV确定对象的方向(即旋转角度&#xff0c;以度为单位)。 1 先决条件…

数据库入门-----SQL基础知识

目录 &#x1f4d6;前言&#xff1a; &#x1f4d1;SQL概述&&通用语法&#xff1a; &#x1f433;DDL&#xff1a; &#x1f43b;操作数据库&#xff1a; &#x1f41e;数据类型&#xff1a; &#x1f989;操作表&#xff1a; &#x1f9a6;DML: 语法规则&#x…

xgo: golang基于-toolexec实现猴子补丁

注&#xff1a; 转载请注明出处&#xff0c; 原文链接。 概述 在这篇博客中&#xff0c;我将详细介绍 xgo 的实现细节。 如果你不知道&#xff0c;xgo 项目位于 https://github.com/xhd2015/xgo。 它的作用很简单&#xff0c;就是在每个 Go 函数的开头添加拦截器&#xff0…

吴恩达深度学习 (week1,2)

文章目录 1、神经网络监督学习2、深度学习兴起原因3、深度学习二元分类4、深度学习Logistic 回归5、Logistic 回归损失函数6、深度学习梯度下降法7、深度学习向量法8、Python 中的广播9、上述学习总结10、大作业实现:rocket::rocket:&#xff08;1&#xff09;训练初始数据&…

Android 关于apk反编译d2j-dex2jar classes.dex失败的几种方法

目录 确认路径正确直接定位到指定目录确定目录正确&#xff0c;按如下路径修改下面是未找到相关文件正确操作 确认路径正确 &#xff0c;即d2j-dex2jar和classes.dex是否都在一个文件夹里&#xff08;大部分的情况都是路径不正确&#xff09; 直接定位到指定目录 路径正确的…