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 ...
随机推荐
- Mybatisplus代码生成器主类CodeGenerator配置
//代码自动生成public class CodeGenerator { /** * <p> * 读取控制台内容 * </p> */ public static String ...
- Ubuntu 入门笔记(1)
在阿里云上申请了一个云服务器,开始学习Linux.我选择的是Ubuntu 14.04 ,在登录时就绕了我好长时间,输入用户名是有显示的,但是输入密码就没有反应了,查找了之后才发现原来这是Ubuntu ...
- AcWing 786.第k个数
AcWing 786.第k个数 题目描述 给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列的第k小的数是多少. 输入格式 第一行包含两个整数 n 和 k. 第二行包含 n 个整数( ...
- ros之发布者和订阅者协同工作
前面的例子显示了单个发布者/单个订阅者的情况,但是一个节点也可以同时是一个发布者和订阅者,或者拥有多个订阅和发布. 实际上,ROS节点最常做的事情是传递消息,并在消息上进行运算. 例doubler.p ...
- This function or variable may be unsafe
1>------ Build started: Project: wintest, Configuration: Debug Win32 ------ 1> Source.cpp 1&g ...
- ncbi-blast 本地安装
详见:http://blog.shenwei.me/local-blast-installation/ Linux系统中NCBI BLAST+本地化教程 本文面向初学者(最好还是懂得基本的linux使 ...
- codeforces 540D Bad Luck Island (概率DP)
题意:会出石头.剪刀.布的人分别有r,s,p个,他们相互碰到的概率相同,输的人死掉,问最终活下去的人是三种类型的概率 设状态dp(i,j,k)为还有i个石头,j个剪刀,k个布时的概率,dp(r,s,p ...
- 纯JavaScript实现页面行为的录制
在网上有个开源的rrweb项目,该项目采用TypeScript编写(不了解该语言的可参考之前的<TypeScript躬行记>),分为三大部分:rrweb-snapshot.rrweb和rr ...
- JVM垃圾回收机制和常用算法
由于疫情的原因,所以目前一直在家远程办公,所以很多时间在刷面试题,发现2019大厂的面试虽然种类很多,但是总结了一下发现主要是这几点:算法和数据结构. JVM.集合.多线程.数据库这几点在面试的时候比 ...
- Tomcat安装教程及常见错误解决方法
目录 Tomcat安装教程及常见错误解决方法 一.安装前准备 ·熟悉自己电脑的操作系统版本(32位or64位) ·保证电脑上已经装好JDK,并且已经设置好环境变量. 二.Tomcat安装教程(以Tom ...