sentinel(哨兵)

对微服务系统进行保护

代替hystrix
hystrix --> sentinel (服务降级,服务熔断,服务限流)
hystrix dashboard --> sentinel dashboard(仪表盘,状态查看,配置规则

hystrix:豪猪,全身是刺

sentienl wiki :介绍 · alibaba/Sentinel Wiki · GitHub

官网:home (sentinelguard.io)

sentinel两大概念:

资源(rest接口)
规则(流量、熔断、负载)

定位哪个资源,配置什么规则(使用sentinel dashboard)

好处:解耦,不想要规则直接删除即可,不需要动代码,使微服务的管理变得更加灵活

下载sentinel jar
Release v1.8.4 · alibaba/Sentinel · GitHub

java -jar -Dserver.port=8080 运行

访问localhost:8080

目前什么都没有

启动nacos

创建springboot应用,注册到nacos

# 应用名称
spring.application.name=sentinel-demo
# 应用服务 WEB 访问端口
server.port=8081
# Sentinel 控制台地址
spring.cloud.sentinel.transport.dashboard=localhost:8080
# 取消Sentinel控制台懒加载
# 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
# 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能
spring.cloud.sentinel.eager=true
# sentinel与dashboard通信端口,默认8719
spring.cloud.sentinel.transport.port=8719
# 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用
# spring.cloud.sentinel.transport.client-ip=
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

启动后,在nacos和sentinel dashboard可以看到服务

这时dashboard中的实时监控依然是没有数据的,因为还没有资源(接口)

创建一个接口

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }
}

访问几次,再次查看sentinel控制台,出现了hello接口的实时监控信息

QPS:Query Per Second,每秒的请求数
RT:Response Time,每个请求的响应时间

五大规则

流控规则:监控应用的流量QPS,达到指定阈值时对流量进行控制,避免被瞬时的流量高峰冲垮

熔断规则:监控应用的资源调用,达到指定的阈值时自动触发熔断降级(如设置某资源出现两次异常后就停用)

热点规则:热点即经常访问的数据,对其进行限流

系统规则:系统自适应限流,从整体维度对入口流量进行控制

授权规则:黑白名单控制

流控规则案例

对/hello添加流控规则(1s内只能处理2个请求)

这时,当1s内超过2次请求时,会出现如下页面

并发线程数:服务器处理请求的线程数,和请求数没有关系
通过并发线程数限流:当服务器创建的线程数超过指定的阈值时,对请求限流

注意区分QPS和并发线程数两种方式

显然,当设置并发线程数阈值为2时,限流将比设置QPS为2更松,因为当前业务很简单,线程处理请求的速度是非常快的,即大概率不会超过2个线程

流控模式

1s内10个请求只能处理2个,其他8个失败

1s内对/a的请求数超过两个,此时访问/hello直接失败(反向关联)

1s内对/hello的请求数超过两个,此时访问/b直接失败(正向关联)

流控效果(只对QPS类型有效)

快速失败:拒绝请求,抛出异常
Warm Up:冷启动、预热(慢慢处理,由少到多)
排队等待:始终匀速处理(固定1s多少个)

熔断规则

RT(响应时间)
异常比例
异常数

热点规则(热点参数限流)

访问资源中携带了指定参数时限流

如统计一段时间内最常购买的商品id进行限制
统计一段时间内频繁访问的用户id进行限制

注意
只能是QPS模式,因为热点参数包含在请求中
热点规则不能使用资源路径的形式,使用资源别名

使用sentinel别名:@SentinelResource

@RestController
public class HelloController {

    @GetMapping("/hello/{id}")
    @SentinelResource(value = "hello") //sentinel别名
    public String hello(@PathVariable("id") Integer id) {
        return "hello " + id;
    }
}

这时在簇点链路中可以看到hello资源
并且可以直接对hello资源增加规则(不用手动写/hello),这也是配置别名的好处

对hello资源新增热点规则

可以看到只有QPS模式

在1s内访问/hello(携带一个参数),并且超过1次,对其进行限流

当不带参数时,不会出现限流

携带一个参数,1s内访问超过1次,出现异常页面

注意这里是直接抛出异常

通过@SentinelResource(blockHander="")可以自定义返回信息

@GetMapping("/hello/{id}")
  @SentinelResource(value = "hello",blockHandler = "blockHandler")
    public String hello(@PathVariable("id") Integer id) {
        return "hello " + id;
    }

    public String blockHandler(Integer id, BlockException e){
        log.debug(e.getMessage());
        if(e instanceof FlowException){
            return "当前已被流控,请稍后再试";
        }else if(e instanceof DegradeException){
            return "当前已被熔断,请稍后再试";
        }else if(e instanceof ParamFlowException){
            return "热点参数限流";
        }
        return "出现异常,请稍后再试";
    }

这里演示的是发生ParamFlowException时的返回信息,其他异常同理


如果方法中出现业务异常(不是流控异常),可以通过@SentinelResource(fallback="")自定义返回结果

@GetMapping("/hello/{id}")
    @SentinelResource(value = "hello",blockHandler = "blockHandler",fallback = "helloFallback")
    public String hello(@PathVariable("id") Integer id) {
        if(id <0){
            throw new RuntimeException("id不能为负数");
        }
        return "hello " + id;
    }

    public String helloFallback(Integer id){
        return "hello-业务异常";
    }


通常热点数据不是很多,可以对热点限流再做细化

当第一个参数的值为12时,每秒只能允许一个请求,否则每秒可以允许10个请求

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容