sentinel-apollo拉模式

代码地址:https://github.com/zhaoyunxing92/spring-boot-learn-box/tree/master/spring-boot-sentinel/sentinel-apollo

使用apollo为sentinel做数据持久化,sentinel的使用可以看sentinel使用,本项目打算采用spring-cloud-alibaba跟sentinel整合

背景

我们的项目即将上线了,但是缺少一个流量防卫兵,这个很要命,于是一周前我就开始着手看sentinel

为什么是sentinel

正如你们所了解的市面上有很多服务降级方案,如我也用过的hystrix,但是它没有完善的持久方案和后台管理界面再加上我也看了一片sentinel作者宿何的一篇对比文章Sentinel-与-Hystrix-的对比,而且我们现在的技术不太适合使用spring cloud体系

参考文档

整合流程

pom.xml

  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
      <version>0.9.0.RELEASE</version>
  </dependency>
  <dependency>
      <groupId>com.alibaba.csp</groupId>
      <artifactId>sentinel-datasource-apollo</artifactId>
      <version>1.6.0</version>
  </dependency>

application.yml

spring:
  application:
    name: spring-boot-sentinel-apollo
  cloud:
    sentinel:
      transport:
        port: 8719 # 向sentinel-dashboard传输数据的端口 默认:8719
        dashboard: localhost:8100 # sentinel-dashboard
      log:
        dir: ./logs # 默认值${home}/logs/csp/
        switch-pid: true # 日志带上线程id
      datasource:
        flow: # 流控规则
          apollo:
            namespaceName: application
            flowRulesKey: flowRules
            rule-type: flow #flow,degrade,authority,system, param-flow
        degrade: # 熔断降级规则
          apollo:
            namespaceName: application
            flowRulesKey: degrades
            rule-type: degrade
        authority: # 授权规则  未验证,官方不推荐
          apollo:
            namespaceName: application
            flowRulesKey: authoritys
            rule-type: authority
        system: # 系统规则
          apollo:
            namespaceName: application
            flowRulesKey: systems
            rule-type: system
        param-flow: # 热点规则
          apollo:
            namespaceName: application
            flowRulesKey: paramflows
            rule-type: param-flow
app:
  id: ${spring.application.name}
apollo:
  meta: http://127.0.0.1:8080
  cacheDir: ./apolloconfig  # 缓存文件位置

java

@SpringBootApplication
@EnableApolloConfig // 开启apollo
public class SpringSentinelApolloServer {
    public static void main(String[] args) {
        SpringApplication.run(SpringSentinelApolloServer.class, args);
    }
}

jvm参数配置

-Denv=DEV

flow(流控规则)参数格式json

[
    {
        "resource": "/hello", 
        "limitApp": "default",
        "grade": 1,
        "count": 3,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]

flow(流控规则)参数规则说明

字段 描述 默认值
resource 资源名,即限流规则的作用对象
limitApp 流控针对的调用来源,若为 default 则不区分调用来源 default
grade 限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制 QPS 模式
count 限流阈值
strategy 调用关系限流策略
controlBehavior 流量控制效果(直接拒绝、Warm Up、匀速排队) 拒绝
clusterMode 是否为集群模式

system 系统规则参数格式,四个参数只能选择一个不能设置-1

[{"qps": 2}]

system参数列表

参数 说明
avgLoad 最大的 load
avgRt 所有入口流量的平均响应时间
maxThread 入口流量的最大并发数
qps 所有入口资源的 QPS

degrade 参数格式 json

[
    {
        "resource": "/rt",
        "count": 50,
        "timeWindow": 5,
        "grade": 0
    },
    {
        "resource": "/count",
        "count": 5,
        "timeWindow": 8,
        "grade": 2
    },
    {
        "resource": "/erro",
        "count": 0.5,
        "timeWindow": 5,
        "grade": 1
    }
]

degrade(熔断降级规则)参数规则说明

字段 描述 默认值
resource 资源名,即限流规则的作用对象
count 阈值
grade 降级模式,根据 RT (0)、异常数(2)、 异常比例(1) RT (0)
timeWindow 降级的时间,单位为 s

param-flow(热点规则) json

[
    {
        "resource": "/hello",
        "grade": 1,
        "paramIdx": 1,
        "count": 10,
        "paramFlowItemList": []
    }
]

param-flow(热点规则) 参数

字段 描述 默认值
resource 资源名,必填
grade 限流模式 qps(1)
paramIdx 热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置
count 限流阈值,必填
paramFlowItemList 参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。

apollo上配置

server.port = 7852
server.servlet.context-path = /sentinel
flowRules = [{"resource": "/hello","limitApp": "default","grade": 1,"count": 3,"strategy": 0,"controlBehavior": 0,"clusterMode": false}]
degrades = [{"resource": "/rt","count": 50,"timeWindow": 5,"grade": 0},{"resource": "/count","count": 5,"timeWindow": 8,"grade": 2},{"resource": "/erro","count": 0.5,"timeWindow": 5,"grade": 1}]
authoritys = [{"resource": "/hello","limitApp": "192.168.12.215","strategy": 1}]
paramflows = [{"resource": "/hello","grade": 1,"paramIdx": 1,"count": 10,"paramFlowItemList": []}]
systems = [{"qps": 20}]

拉去规则成功日志

  2019-05-14 09:26:46.072  INFO 10100 --- [           main] o.s.c.a.s.c.SentinelDataSourceHandler    : [Sentinel Starter] DataSource authority-sentinel-apollo-datasource load 1 AuthorityRule
  2019-05-14 09:26:46.090  INFO 10100 --- [           main] o.s.c.a.s.c.SentinelDataSourceHandler    : [Sentinel Starter] DataSource degrade-sentinel-apollo-datasource load 3 DegradeRule
  2019-05-14 09:26:46.099  INFO 10100 --- [           main] o.s.c.a.s.c.SentinelDataSourceHandler    : [Sentinel Starter] DataSource flow-sentinel-apollo-datasource load 1 FlowRule
  2019-05-14 09:26:46.115  INFO 10100 --- [           main] o.s.c.a.s.c.SentinelDataSourceHandler    : [Sentinel Starter] DataSource param-flow-sentinel-apollo-datasource load 1 ParamFlowRule
  2019-05-14 09:26:46.122  INFO 10100 --- [           main] o.s.c.a.s.c.SentinelDataSourceHandler    : [Sentinel Starter] DataSource system-sentinel-apollo-datasource load 1 SystemRule

测试接口

http://localhost:7852/sentinel/hello

最终效果图

sentinel-dashboard
apollo-dashboard

结尾

相信坚持看完的同学已经崩溃了,拉模式的配置太头疼了.的确为了完成这篇文章,里面的参数都是我在浏览器里面抓取过来的耗费了我大量的时间,巧的是sentinel官方也意识到了这点他们提供了推模式只不过需要修改sentinel-dashboard
的源码,后面我会把真理好的代码提交在sentinel-dashboard-apollo仓库,已经需改了一点,有兴趣的可以先去看

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

推荐阅读更多精彩内容