spring cloud微服务快速教程之(九) Spring Cloud Alibaba--sentinel-限流、熔断降级
0、前言
sentinel的限流、降级功能强大,可以在控制面板中任意制定规则,然后推送到微服务中;
可以根据URL单独制定规则,也可以根据资源名批量制定规则;
需要注意的地方是:1、GITHUB文件在国外的亚马逊服务器已经彻底被墙,无法下载,只能想法找国内的分享,自求多福
2、控制面板制定的规则只保存在内存中,重启就会消失,需要配合其他方式实现持久化存储规则,这点在生产环境中需要注意
1、运行sentinel
sentinel只是一个JAR包,下载下来后,直接命令运行该JAR就行,默认的端口是8080,可以自己制定其他端口运行,如下指定8849端口运行:
java -Dserver.port=8849 -jar sentinel-dashboard-1.6.3.jar
2、项目集成
这里需要先搞清楚:
限流:就是请求多了,对请求进行定制的快速响应处理,应用在服务提供者本身;
降级:就是熔断了,再简单点说就相当于服务断开了、服务不可用了,服务崩溃了,
所以降级逻辑应该应用在消费者(调用者)那里,加在服务提供者本身是毫无意义的,因为服务已经断开了
一般我们在项目中:
1、限流和熔断都可以直接在网关统一处理,不需要在微服务本身做限流处理,
2、但在微服务调用其他微服务时,还是需要增加熔断处理的,这其实是两个层级API调用的熔断;
3、所以,一般情况下,网关spring cloud gateway 中做限流和一级熔断,在微服务内部调用时hystrix做二级熔断;
4、不是项目比较庞大,需要控制比较细致的话,sentinel其实比较鸡肋,用处不大,用hystrix更方便更实用,如果是大型电商,要对每个API都就精确细致控制,那可以考虑sentinel,否则,个人还是不建议使用的,使用以上组合更贴合实际;
2-1、限流
2-1-1、添加依赖
<!-- 集成sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
2-1-2、添加配置
这里需要注意:项目集成sentinel,会占用一个端口开启http服务,用来发送心跳检测以检测健康状态,
sentinel控制台默认占用的是8719;集成的项目中,会在8719端口以后自动需找一个可用的端口,比如8720,8720不可用就会找8721,以此顺序往下找;
有些人直接在配置文件中指定该HTTP服务端口:如sentinel.port=8720;这种方式很不推荐,因为我们的系统包含很多服务,没个服务又会启动很多实例,如果要指定的话那那么多个实例都要一一配置,还要避免端口冲突,工作量大很繁琐,且容易混乱;
所以,不要认为指定该端口,让系统自动去找可用端口即可,并且我们在端口分配时,可以避开8700-8800这两个段的端口,应对大型集群,留给它预留好了,端口多的是
server:
port: 8761
spring:
application:
name: nacos-user
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 sentinel:
transport:
dashboard: localhost:8849
eager: true
2-1-3、controller中增加限流
在方法上增加@SentinelResource注解,
value是资源名称,对应sentinel中指定的一个规则,多个方法可以使用同一个名称,也就是批量应用规则
blockHandler是限流后执行的方法名;
@RequestMapping("/hello")
@SentinelResource(value = "userblock1",blockHandler = "BlockHello") //sentinel限流
public String Hello()
{
return ("hello world" +serviceUtil.getPort());
}
//-----------限流、降级的handler-----------------
public String BlockHello(BlockException exception) //1、限流
{
return ("少年,限流了 --Port:" +serviceUtil.getPort());
}
//---------------------------------------------
2-1-4、运行测试
1、运行程序,执行一次user/hello方法
2、在sentinel控制面板中,增加userblock1的限流规则,再次运行/user/hello,就可以看到效果:



2-2、熔断降级(feign的方式)
2-2-1、添加依赖
<!-- 集成sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.0.1.RELEASE</version>
</dependency> <!-- 集成feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2-2-2、增加配置
server:
port: 8765
spring:
application:
name: nacos-order
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
sentinel:
transport:
dashboard: localhost:8849
eager: true
feign:
sentinel:
enabled: true #打开sentinel对feign的支持
2-2-3、实现
增加feign接口
@FeignClient(name = "nacos-user",fallback = UserFallbackService.class)
public interface UserClient
{
@RequestMapping("/user/hello")
String hello();
}
增加实现类
@Component
public class UserFallbackService implements UserClient
{
@Override
public String hello()
{
String rt="";
rt="少年,服务被降级停用了,等等再来吧!!";
return rt;
}
}
controller注入使用
@Autowired
private UserClient userClient; @RequestMapping("/order2")
public String order2()
{
return userClient.hello();
}
2-2-4、运行测试
启动order,不启动user,运行order/order2,可以看到运行结果

sentinel就是这么简单灵活, 持久化和集群处理后续再来探讨
spring cloud微服务快速教程之(九) Spring Cloud Alibaba--sentinel-限流、熔断降级的更多相关文章
- spring cloud微服务快速教程之(七) Spring Cloud Alibaba--nacos(一)、服务注册发现
0.前言 什么是Spring Cloud Alibaba? Spring Cloud Alibaba 是阿里开源的,致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便 ...
- 0.9.0.RELEASE版本的spring cloud alibaba sentinel限流、降级处理实例
先看服务提供方的,我们在原来的sentinel实例(参见0.9.0.RELEASE版本的spring cloud alibaba sentinel实例)上加上限流.降级处理,三板斧只需在最后那一斧co ...
- spring cloud微服务快速教程之(四)熔断器(Hystrix)及其工具(Dashboard、Turbine)
0-为什么需要熔断器 在分布式系统中,各个服务相互调用相互依赖,如果某个服务挂了,很可能导致其他调用它的一连串服务也挂掉或者在不断等待中耗尽服务器资源,这种现象称之为雪崩效应: 未来防止系统雪崩,熔断 ...
- spring cloud微服务快速教程之(十一) Sleuth(zipkin) 服务链路追踪
0.前言 微服务架构上众多微服务通过REST调用,可能需要很多个服务协同才能完成一个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败.随着业务的不断扩张,服务之间互相调用 ...
- spring cloud微服务快速教程之(五) ZUUL API网关中心
0-前言 我们一个个微服务构建好了,外部的应用如何来访问内部各种各样的微服务呢?在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服务.当添加API网 ...
- spring cloud微服务快速教程之(十) gateway 服务网关
0.前言 gateway是spring的二代网关, 作为Netflix Zuul的替代者,是异步非阻塞网关 ,ZUUL2也是异步非阻塞的,但未纳入spring cloud整合计划 基于WebFlux ...
- spring cloud微服务快速教程之(八) Spring Cloud Alibaba--nacos(二)、配置中心
0-前言 上一篇我们介绍了nacos作为服务注册发现组件的功能,nacos还具有配置中心的功能,而且支持热加载: 在此之前,配置中心有Spring Cloud Config,实际上,用这个有很多风险和 ...
- spring cloud微服务快速教程之(三)声明式访问Feign、负载均衡Ribbon
0-前言 eureka实际上已经集成了负载均衡调度框架Ribbon: 我们有了各个微服务了,那怎么来调用他们呢,一种方法是可以使用 RestTemplate(如:String str= restTem ...
- spring cloud微服务快速教程之(六) 应用监控 spring boot admin
0-前言 当我们发布了微服务后,我们希望对各个应用的各个运行状况进行一个监控:这个时候spring boot admin,就出场了: spring boot admin:是一个监控和管理spring ...
随机推荐
- 运行MapReduce任务
1:运行MapReduce任务 1:原始数据准备 统计用户的登录次数: 源数据login_log.txt如下: 7whygb5m@linshiyouxiang.net nuahvuhuoia@qq.c ...
- Java 设计模式之抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...
- asp.net core 2.2升到3.1遇到的问题小记
趁着武汉疫情,在家研究原来2.2的框架升级到3.1的问题,在过程中遇到不少坑,好在放假有的是时间,一个一个解决,现做个简要记录,供大家参考.推荐认真看这篇文章 [https://docs.micros ...
- SSH(二)
SSH框架整合的系统架构,Action.Service.Dao.SessionFactory.DataSource都可以作为Spring的Bean组件管理 使用HibernateDaoSupport基 ...
- Windows API 教程(九) 网络编程
茵蒂克丝 基础概念 ip 地址 服务端与客户端 Socket 基础概念 头文件和库文件 常用函数 WSAStartup ( ) 函数 WSACleanup ( ) 函数 Socket ( ) 函数 c ...
- 《Python学习手册 第五版》 -第9章 元组、文件与其他核心类型
本章的主要内容是介绍了元组和文件的使用,同时作为介绍数据类型的最后一个章节,本章也总结和复习了前面所介绍的核心数据类型,总结的部分在此不多介绍,因为前面章节都有,在此就重点介绍以下两点内容 1.元组 ...
- 大话IDL编程之函数功能调用(envi_doit、ENVIRaster、ENVITask)
2020年2月1日.好长时间没更新博客,还真有点不习惯.受新型冠性病毒的影响,平时街上熙熙攘攘的人流了无踪影,2020的春节竟然来的如此冷清.为响应“呆在家里就是做贡献的号召”,在家一宅就是十多天.闲 ...
- 《N诺机试指南》(七)排版类问题
1.菱形问题: 解析: 主要通过打印空格和星形来打印整个图形,将整体分为=上三角形+下三角形 首先观察上三角形可以发现:第一行2个空格1个星.第二行1个空格3个星.第三行0个空格5个星 空格数 ...
- C++ map通过key获取value
c++的map中通过key获取value的方法 一般是value =map[key],或者另一种迭代器的方式 1.在map中,由key查找value时,首先要判断map中是否包含key. 2.如果不 ...
- NOIP幂次方
#include<stdio.h> ] = { ,,,,,,,,,,,,,,, };//由题意n最大为20000,所以最多会用到2的14次方 //为了防止mid+1出错,故写到15次方 i ...