前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Sentinel

Sentinel

作者头像
收心
发布2022-08-24 16:56:11
5590
发布2022-08-24 16:56:11
举报
文章被收录于专栏:Java实战博客

官网:https://github.com/alibaba/Sentinelhttps://sentinelguard.io/zh-cn/

流量控制

隔离、降级

授权规则

服务雪崩

服务A依赖于服务B、服务B依赖于服务C,如果服务B执行比较缓慢、阻塞,Tomcat资源就被占用了,导致所有依赖于服务B的服务都被牵制!

解决方案:

超时处理:超时就返回错误信息,不会无休止等待

舱壁模式:限定每个业务使用的线程数,避免tomcat资源被消耗,实现线程隔离

熔断降级:由断路器统计业务执行异常比例,如果超过限定值,就会拦截,不允许访问

流量控制:限制业务访问QPS,避免业务因流量突增而故障

上面都是服务保护的解决方案,

我们主要是使用Sentinel,Hystrix

去官网下载Sentinel- dashboard.jar 使用java -jar 即可,默认端口是8080 ,默认账号、密码都是sentienl

代码语言:javascript
复制
# 自行修改即可
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar XXXX.jar复制

访问 127.0.0.1:8080 输入账号密码即可

微服务整合Sentinel

参考URL:https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel

项目引入Sentinel依赖(如果你准备网关接入,请引用其他网关-Sentinel的依赖)

代码语言:javascript
复制
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>复制

项目配置文件添加配置信息

代码语言:javascript
复制
# 配置控制台地址,必须访问过我们当前服务才能触发sentinel的监控
spring.cloud.sentinel.transport.dashboard=localhost:9090复制

必须要去访问一下我们的任意一个接口才能触发Sentinel监控

以后我们就可以通过Sentinel实现服务的熔断了。

流控模式

直接:对当前资源进行限流

关联:高级优先级资源出发阈值,对低优先级资源限流

链路:阈值统计时,只统计A资源进入当前资源的请求,对来源A资源进行限流,其他资源访问当前资源就不受到限制

流控效果

快速失败:达到流控模式的规则,直接失败,抛出异常,拒绝请求。

Warm Up:冷启动(设置warm up时要求设置个预热时长),在项目启动的预热时长内,最大qps逐步增加。项目初始时最高qps=流控模式设定最大的qps/3,然后在预热时间内,逐步提高最大qps,直到最大设定的qps。避免了项目刚启动来了大量并发导致服务宕机。如果达到当时的最大qps也是抛出异常,拒绝请求。

排队等待:超过qps,快速失败与warm ip会抛出异常,但排队等待会将请求放入一个队列中,针对阈值允许的时间间隔一次执行。后来的请求必须等前面完成,如果请求预期的时间超过最大时长(设置排队等待时,要求输入一个超时时间),则会被拒绝

模拟限流

Sentinel应用实际开发解决方案

登陆服务需要查询账号是否存在,注册服务也要查询账号是否存在,那么查询账号是否存在的方法我们就无法进行流量控制,因为请求入口都是从Controller进入的。但我们要限流的是方法,我们就需要修改一些配置以实现对方法对控制

Sentinel默认会标记Controller中的方法作context上下文整合,就会导致链路模式失效,我们可以在配置文件关闭配置即可,同时针对我们的Service的方法加入注解

代码语言:javascript
复制
# 关闭context整合spring.cloud.sentinel.web-context-unify=false复制

方法加入注解

代码语言:javascript
复制
    @SentinelResource("checkAccountExist")
    public String checkAccountExist() {
        return "Server执行中...";
    }复制

我们自己触发一下相关Login、Register接口,我们就可以在Sentinel看到此配置了

这样就可以实现对Login、Register调用Checking方法进行限流!

热点规则

场景:我们有一个高并发的秒杀功能,我们对不同额度优惠券的领取有不同的限制,比如3元优惠券,我们可以放行到每秒10个。优惠券10元的,每秒1个。我们优惠券种类通过id来区分。我们可以针对领取优惠券接口进行限流。

注意热点规则对默认SpringMVC资源无效,我们通过加入注解实现@SentinelResource

代码语言:javascript
复制
    @SentinelResource("hot")
    @RequestMapping("/register")
    public String hello(long id) { 
        System.out.println("Server执行中...");
        return "Server执行中...";
    }复制

添加热点规则

从找到DashBoard,热点规则,点击 新增热点规则。(如果你从簇点链路- 热点创建的,创建完成后,点击热点规则才能设定参数例外项)

隔离与降级

FeignClient整合Sentinel

配置文件开启

代码语言:javascript
复制
feign.sentinel.enabled=true复制

编写Feign因调用失败的降级逻辑

  • FallbackClass 无法对远程调用的异常作处理
  • FallbackFactory 可以对远程调用的异常作处理,我们使用这个

使用需要注入Bean

然后在@FeignClient注解内部指定fallbackFactory

线程隔离

熔断降级

特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 服务雪崩
  • 微服务整合Sentinel
  • 流控模式
  • 流控效果
  • 模拟限流
  • Sentinel应用实际开发解决方案
  • 热点规则
  • 隔离与降级
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档