https://my.oschina.net/u/3729778/blog/1973901
Sentinel 承接阿里巴巴近10年双十一大促流量的核心场景,以流量为切入点,从流量控制,熔断降级,系统负载保护等多个维度保护服务的稳定点。其提供丰富的应用场景支持,完备的监控能力,易用的拓展点。
Note: 中文文档请见此处。
热点问题:
1,Q: dashboared 不展示监控问题如何排查?
dashboared是一个单独启动的控制台,引入sentinel的应用是一个客户端,他们各自有自己的通信端口,dashboared端口可以通过启动参数-Dsever.port=xxxx进行配置,引入Sentinel的应用默认端口是8719.俩者都启动后,sentinel客户端在首次进入资源时会初始化并给dashboard发送心跳,之后dashboared控制台会通过客户端提供的端口对sentinel客户端进行访问。基于此,以下事情是需要做的:
1,客户端应该引入2者进行通信的基础jar包
com.alibaba.csp
sentinel-transport-simple-http
1.5.2
2,客户端启动时加入jvm参数:
应用名称:
-Dproject.name=xxxx
客户端访问dashboard的参数
-Dcsp.sentinel.dashboard.server=dashboard的IP: dashboard的启动端口
客户端提供给dashboared访问或者查看sentinel的运动访问的参数:
-Dcsp.sentinel.api.port=xxxx(默认是8719)
注意: Sentinel会子啊客户端首次调用 的时候进行初始化,开始向控制台发送心跳包。确保客户端有访问量,才能在dashboared上看到监控数据。另外,还是期待大家养成看日志的好习惯,详见日志
- 控制台推送规则的日志在 :${user.home}/logs/csp/sentinel-dashboard.log 中,
- 客户端接收规则日志在 ${user.home}/logs/csp/record.log 中
3,常用排查问题列表:
确认dashboared和客户端均正常工作
客户端发送心跳包是否正常
客户端是否正常上报给dashboared信息
客户端的启动参数是否配置正确
5,fastjson 和sentinel保持一致目前为1..49
6,curl IP: port/getRules?type=flow 等命令查看结果
7 发传送到客户端的规则格式是否正确,例如确认一下降级规则的表单是否填写完整
8,某些不能访问互联网的环境比如堡垒机可能导致前端文件无法下载也可能导致图出不来调式查看
- 2,关于规则存储与datasource的问题?
-
- Sentinel 目前的规则是存在客户端应用内存中的,重启之后设置的规则消失
2.规则可以从dashboared侧调用客户端暴露的控制接口,也可以从不同的扩展数据源读取。
3,关于推送规则的数据流转: 在控制台配置完之后,数据推送到客户机,更新到客户机内存
-
- 关于DataSource 的持久化定制
DataSource的持久化定制可以参考动态扩展文档
- 关于DataSource 的持久化定制
5,关于持久化的一些建议,总体来说就是DataSource 用来接收规则,如果用来改变规则,则仅仅对本机生效。
1,不建议客户端去修改zk,因为若干个客户端千户修改同一个zk的值,这样复杂度很高,如果客户端要修改规则,仅仅对本机生效,比如:fileDatasource
2,zk 可以用来获取推送过来的规则,即接收规则。
3,对于有配置中心的集群来说,就是配置中心->zk-Sentinel的DataSource,客户端监听到rule更新以后更新策略。
4,无配置中心的情况下,可以dashboard->zk->Sentinel的DataSource,即将zk等配置中心的UI集成到dashboard中
5,如果哦需要每台机器自己保存规则;应该是dashboard->Sentinel的DataSource->应用内存-> 本机存储
1,Q:关于配置参数的指定问题?
A: 有几中方式:
- 可以通过JVM -D参数指定。除project.name之外,* 其余参数还可通过properties文件指定,路径为 {project.name}.properties 详见启动项配置
- 也可以放在加载比较早的静态代码块中,从配置文件中读取,这里包括project.name
2, Q: 关于Sentinel的性能?
A:根据我们以前做过的测试,单机25w qps 以下基本没啥影响 超过了这个值会有一个比较明显的5%-10%的下降
3, Q: dashboared重启一下应用后就不出监控了?
A: 客户机10秒心跳,另外服务器只保留100605这么长时间,如果客户机有请求,稍等一会刷新下,界面应该会出来
4,Q: Sentinel 监控数据能保留多久?
A: Sentinel 对数据监控的做法是定时罗盘在客户端,然后Sentinel 提供接口取查询日志文件。所以Sentinel在监控数据上理论上是最少存储一天以上的数据;然而作为dashboared展示,聚合数据的,则只展示聚合几分钟以内统计的数据。我们可以改写dashboared来存储拉取的监控信息,包括实时的和历史的,如果你需要长期保存数据,可以借鉴dashboard的拉取聚合方式落库。
5,Q: Sentinel的集群限流功能:
A:会在我们的RodeMap里面,详见这里RodeMap
6,Q: Sentinel关于集群熔断?
A: 一般用并行的线程数来杜绝这种情况,保证自己不会被下游拖死
7、Q:0.1.0版本客户端获取更新规则的server端口设置是不是有点问题?不显示设置都是8719
A:0.1.0 版本多个客户端的话需要显式设置端口,否则上报会有问题。0.1.1版本修复了这个问题
8,Q: 降级规则,除开自动返回还可以配置其他的规则吗?
A;需要自己catch block exception 然后自定义降级之后的处理逻辑
9,Q:资源名可以是整个包吗?因为很多服务,规则配置和流量监控的区别是什么?
A: 整个包不行,建议规则不需要一开始就定的,只需要确认你埋好点就行,如果真的要整个包都埋点,可以写个通用包名的拦截器规则:
- dubbo 等是默认埋点的,可以任何时候需要的时候在制定规则
- 我们的建议是: 不需要把所有的方法都配置好规则,一下额重要的方法都配置规则,一个包里所有的方法都配置上限流规则
- 流量监控和规则没关系,配不配规则监控都看得到
10 Q:服务端的默认api 8719端口可以修改吗?
A: 可以通过csp: sentinel.api.port配置项进行指定
11 Q: 可以对url参数限流吗?可以对ip做限流吗?
A:url参数限流在下个版本中会有,时间点可以看看roadmap。如果你的参数不多可以用自定义方法
12 Q: 集群机器数的限制?500个是? 怎么横向扩容?
A: 因为dashboard是一个示范作用,他的聚合监控的能力非常有限,搜易我们着只支持500台机器以下的应用。但是客户端没有这个歌限制,如果想用监控 还有规则推送,有2个建议:
1, 规则配送上:用一个靠谱的推送机制 例如zk apollo nacos 这个的适配,我们已经提供
2,监控上:完全可以用多台机器来拉去数据,这个横向扩展不成问题,然后考虑下监控数据落盘。
具体可以看动态规则扩展
13 Q; 同一台机器起相同的端口不报错?
A: 默认 8719 被占用以后会自动选择下一个端口,直到有端口为止,选择端口时间会比较长,本地如果起多个应用建议自己设置端口;
14 Q: Sentinel控制台有登陆功能或者说权限控制吗?否则生产机岂不是任意人都能修改规则来?
A; 没有,dashboard 不提供登陆的工具,这种的需要自己设置。
15,Q: 请问dubbo适配之后,dashboared簇点链路的资源名如何自定义?
A: 可以自定义埋点就可以来,参考wiki: 无论是自动适配还是手动埋点,控制台都能看到对应的资源名
16,Q: 使用Sentinel做全局监控,接口监控,接口+角色监控,接口+用户ID流控 分别如何实现?
接口+角色流控实例: VIP客户一分钟调用600次,一天调用10w次,普通用户60/1w
全局监控,其实刘可义在系统里面,通过配置整体入口qps,来达到这个目的
2,接口流控,相当于定义一个资源;
如果你的角色不多,10种以下,那么可以通过规则里面的调用源来实现
如果角色/id很多,并且粒度非常细,可以把用户id作为参数,用这种维度来限流
17 Q1为什么使用netty自己做了一些解析http请求的代码,使用目前开源的框架接收不行吗,这样设计的初衷是什么?
A: netty-transport 和simple-transport 这个jar包,这个jar包的功能目前是一样的,即目前的simple-transport基本上可以实现开放的功能了,我们还引入netty-transport这个jar包是为了日后的扩展。如果没有这个需要,引入simple-transport就可以
18 Q: 监控页面的簇点链路的核心是流控还是降级,请问跟踪链路问题发现以及跟踪,这块未来有考虑吗?
A : Sentinel 主要用于:熔断降级,流量控制,不是适合分布式的跟踪,即夸机器的跟踪,也不是sentinel的重点如果需要,可以参考引入dapper,pinpoint,dapper,maple 很多这样的理论。
19 Q; 怎么对特定端限流?
A:流控应用如果使用了Sentinel Dubbo Adapter,同时Dubbo的消费者也引入了Sentinel Dubbo Adapter(消费侧用于透传dubboApplication这个参数)则填调用者的appName就好,消费端引入adapter就会自动透传,否则需要自己传 appName
20 Q: dashboared中资源名称为什么会有重复的?
A:最顶层的是context名:用于区分不同调用链路
21 Q:关于maven仓库,依赖包无法下载的问题?
A: 请检查maven的setting.xml配置默认的,阿里云的库都可以下的下来,有些事公司的库,不一定有这些jar
22, Q:所有的资源默认错误率达到多少自动降级,有特殊需求的资源另外设置,一个个设置管理成本较高?
A: 一般来讲,对于不同的资源,限流降级的策略,阈值都是不同的,对于这种全局的,我们可以评估,目前不支持。
- Q: web端的资源目前都是根据uri限流,有没有根据前缀匹配限流?
A:
- 可以自己实现一个UrlCleanner,处理对应的URI(提取前缀之类的操作)。
- 使用UrlCleaner 的话,对应的资源名称都会归到clean后的资源
- Sentinel 不区分拦截点和展示点,只有资源的概念。
- UrlCleaner实现URL前缀匹配只是个trick,他会把对应的资源也给归一掉。直接子资源名粒度上实现模式匹配还是有很多顾虑问题的?
24 Q:目前信息抓取和uri 指的是?各个requestcommandhandle是可以扩展达到,监控的web这边的信息抓取和uri目前不支持动态扩展?
A; 这些目前都是绑定的APi,后续可以考虑支持扩展
25,Q; sentinel的core和阿里内部用的代码有什么关系?
A: sentinel 和core 和阿里内部用的是同一套,只哟功能的摘取
26 Q:心跳包是拦截到第一次调用才开始发送的?初始化大概多长时间?
A: 心跳包是启动客户端以后就会发送的,不过初始化需要一定的时候,不会很长时间,如果一直没法心跳,record.log 里有相关日志,看看有什么异常。目前初始化逻辑其实就是起客户端的Server然后初始化任务发心跳,没初始化完成是不是不能发送心跳包,Spring 应用可以在bean里面init.
27, Q: csp.sentinel.flow.cold.factor 这个参数是什么意思?
A: warmup的参数,warmup 有阀值和时长。还有一个就是这个参数,一共3个参数,这个代表qps的令牌桶中令牌产生的速度
28 Q; 规则;里面limitApp(流控应用)作用是什么?
A; limitapp主要是针对调用方的流量控制,比如你提供了一个服务,分别被A,B,C几种不同的服务调用。你想分别对a,b,c来做限流,即可以
29 Q; 实时运行数据如何查看?
A:实时运行数据 可以通过查看里面提到的方法来实时查看
30、Q:请问limitApp的埋点情况?
A:如下:
- 如果消费方引用了dubbo-adapter,这个其实对dubbo是自动有效的
- 如果是http那么需要从request头里面拿到
- 对于其它的框架 需要自己去埋点,主要是在ContextUtil.enter(),这里把调用者拿到,contextUtil.enter(resourceName, origin)这里的origin就是调用者
- limitApp这个属性除了系统保护其它的都可以用
31、Q:refreshfile每隔三秒扫描加载有点耗资源在加载前判断下文件是否修改比较合适?
A:可以!最好这个可以做成配置项,例如我们常说的启动参数,可以放到properties里面
32、Q:关于LeapArray中的sampleCount?
A:如下:
- 我们初始化用了两个格子,
- 格子越多越平滑,但是损害越多;格子越少,其实不平滑但是精确。不同场景用不同的大小,例如秒杀这种,格子越少越好;但是如果是长期高流量,格子10比较好
- 在datasource的扩展属性中可以动态调节
33、Q:很多开发通过错误码来处理流程,而非通过异常,这种情况特别多见于历史遗留系统。这种写法,导致哨兵不容易拦截到错误,无法触发降级。对于这种情况,有没有什么好的处置方法呀?
A:实际上Sentinel是通过 Trace.trace(e)来统计异常的,可以这样实现:
- 你在接入的时候只要收到错误码就调用这个函数来统计异常,那么error code就一样能够作为异常被统计到。熔断降级也生效了
- 自定一个Default 的fallback handler来统一处理
34、Q:限流的冷启动模式中计算 Token 的时候有一个coolDownTokens() 函数,能解释一下吗?
A:这个是冷启动的时候最低的速率比
35、Q:请教一下,限流冷启动模式 WarmUpController 中的canPass()函数里有计算 previousQps,这个previousQps 是表示什么意思呢?
A:其实是一个启动过程 每一秒允许通过的qps和上一秒通过的wps算出来的,其实这个算法脱胎guava但又和guava不一样,但是思路是类似的
36、Q:测试发现,同一个线程的flow rule有效,异步调用的跨线程控制无效,应该怎么操作呢?
A:目前我们不支持异步,异步要下个版本
37、Q:比如说,冷启动这个限流场景,超过的流量就被拒掉了(抛异常),consumer侧触发重试,根据rr策略,流量调度到另一个机器,是这样的吗?
A:调度这个高级功能还没有,现在只能拒绝或者排队
38、Q:不同的slot执行的先后顺序是固定的吗?
A:详见:com.alibaba.csp.sentinel.slots.DefaultSlotsChainBuilder这个类
39、Q:Sentinel跟hystrix相比优势是啥?两者都提供了流控降级以及dashboard
A:Sentinel 与 Hystrix 的对比
40、Q:InitExecutor.doInit();是否需要在初始化时手工调用
A:不需要,sentinel-core包的Env类通过static块调用了; demo工程中的InitExecutor.doInit();是为了不让进程退出。
41、Q:InitExecutor.doInit();已调用,但通过http访问规则失败
A:检查是否缺少sentinel-transport-simple-http依赖,InitExecutor.doInit()中的ServiceLoader.load(InitFunc.class)加载需要。