Spring Cloud for Alibaba 之 Sentinel For 生产改造(5)

一笑奈何 提交于 2019-11-28 03:50:46

 

  在上一篇中 Spring Cloud for Alibaba 之 简单集成 Sentinel (4),我只是在Demo 里面,简单的引入了Sentinel组件,Dashboard控制台。

  这些数据都是保存在内存中,一旦应用重启,之前配置的规则、监控数据 都会重置。

  生产实践中,运用Sentinel ,要解决2个问题:1. 规则管理与推送 ,2. 监控数据的保存与展示。

  因为资源问题(个人没有机器部署kafaka 与elasticsearch集群),本次主要展示规则管理。

 

一、 规则推送模式

 官方推荐使用Push模式,将配置规则,存放在远程的配置中心,比如阿里的nacos,

 具体为使用建议见官方wiki: 在生产环境中使用 Sentinel

规则流向为:配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel  

如下图:

 

二、Sentinel 客户端改造

     sentinel 接入nacos 存储比较方便,在 可以参考官方的另外 wiki:动态规则扩展

1.  jar引入pom     

我采用简单一点的方式,直接引入 spring-cloud-starter-alibaba-sentinel  与sentinel-datasource-nacos 组件

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>${sentinel.version}</version>
        </dependency>

 

2. 新增配置 文件 

引入组件后,在bootstrap 配置文件(应该也可以将配置放入nacos,未实验),新增如下配置:

    #sentinel 配置
spring.cloud:
    sentinel:
        transport:
          port: 7083 #本地端口,用于dashboard 推送规则
          dashboard: 127.0.0.1:7070 # dashboard 控制台
        datasource.ds.nacos:
          server-addr: ${nacos.server-address}:${nacos.port}  #nacos地址,根据实际配置
          dataId: ${spring.application.name}-flow-rules  #规则配置 dataId 参见: dashboard 的 NacosConfigUtil.java 源码
          groupId: SENTINEL_GROUP   #规则的groupId  参见: dashboard 的 NacosConfigUtil.java 源码
          rule-type: flow    #规则类型

以上配置说明一下:

  dataId: 建议以 ${spring.application.name}-flow-rules 模式, 如果是flow规则,后缀用 -flow-rules ,不同的ruleType,用不同的后缀,这个是 dashboard推送规则的时候定死的,建议与dashboard一致。

  groupId: SENTINEL_GROUP  这个也是dashboard定的, 建议保持一致。  

  ruleType: 取值 可以见sentinel-datasource 的RuleType 枚举

每个ds 数据源只能配置一种规则, 如果多种规则,根据源码,应该是可以 配置多个ds,如ds1,ds2(这个后续用实际证实理论) 

 

 

3. nacos 新增规则配置

配置好之后,我们再打开nacos,添加配置信息,如下:

dataId: order-demo-flow-rules

groupId: SENTINEL_GROUP

配置内容:

[
  {
    "clusterMode": false,
    "controlBehavior": 0,
    "count": 2,
    "grade": 1,
    "resource": "/test/testProductByName/哈哈",
    "strategy": 0
 }
]

 

4. 启动 应用,dashboard查看结果

启动Sentinel 应用,访问几次后,刷新dashboard 控制台,可以看到规则出现在控制台里面:

 

可以多次调用资源,查看限流确实生效了,在控制台修改、删除规则,虽然能生效,但是nacos上面配置时没有变动的,Sentinel应用重启后,还是使用nacos上的配置。

以上 操作,完成了: 配置中心控制台 → 配置中心 → Sentinel 数据源 → Sentinel 的数据流向,

已基本可以用于生产,只是有1个问题,就是每次手工,可能会出错 ,因此生产最好是 接入图形界面操作。

  

三、 Dashboard 控制台改造

 目前Sentinel 的控制台,用于 生产还需要很多改造,官方对于改造的各种情况都提供了api 与范例,剩下的就是需要各位对开源做出贡献,去改造了!

 控制台的改造 参考官方wikii :Sentinel 控制台(集群流控管理)

 1. 下载源码,导入IDE

  控制台改造,需要修改源码示范,我们先从github 上面下载源码,导入ide:Sentinel源码 https://github.com/alibaba/Sentinel

 2. 修改pom,导入组件

  Dashboard 是自带了需要的组件,只是被放入测试包目录。 

  找到sentinel-dashboard 模块的pom, 将 sentinel-datasource-nacos 的引用范围改成compile ,去掉 test 即好。

      <!-- for Nacos rule publisher sample -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
           <!-- <scope>test</scope>-->
        </dependency>

3. 修改源码 

   源码有好几处地方需要修改: 

 a)  将 test 包下文件,剪贴至 java 目录。

   test 下package 路径:com.alibaba.csp.sentinel.dashboard.rule.nacos ,下面一共有 FlowRuleNacosProvider、FlowRuleNacosPublisher、NacosConfig、NacosConfigUtil 四个文件。

 b)如果nacos部署在本机,且端口号是默认的8848,则无需修改。否则需要根据实际,修改NacosConfig 代码

@Bean
    public ConfigService nacosConfigService() throws Exception {
        return ConfigFactory.createConfigService("localhost"); //如果不是本机,localhost可以修改为nacos地址,如:IP:端口
    }

 c) 修改 FlowControllerV2

  将  ruleProvider、rulePublisher ,修改为flowRuleNacosProvider、flowRuleNacosPublisher,如下:

    @Autowired
    @Qualifier("flowRuleNacosProvider")
    private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
    @Autowired
    @Qualifier("flowRuleNacosPublisher")
    private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;

d) 修改 sidebar.html

  将 dashboard.flowV1 改成dashboard.flow ,如下:

        <li ui-sref-active="active" ng-if="!entry.isGateway">
            <a ui-sref="dashboard.flow({app: entry.app})">
              <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控规则</a>
          </li>

做了以上改动后,重新编译源码, 启动。

4、 启动,测试 

   启动后,我们应该就能从流控规则里面,看到对应的规则。 

  现在我们修改 阀值为 3,点击保存,查看nacos上面的配置如下:

[{"app":"order-demo","clusterMode":false,"controlBehavior":0,"count":3.0,"gmtModified":1566381446083,"grade":1,"id":14,"limitApp":"default","resource":"/test/testProductByName/哈哈","strategy":0}]

 我们删除这个,然后重新建1个,再测试下:

 新增加的配置如下:

[
    {
        "app": "order-demo",
        "clusterConfig": {
            "fallbackToLocalWhenFail": true,
            "sampleCount": 10,
            "strategy": 0,
            "thresholdType": 0,
            "windowIntervalMs": 1000
        },
        "clusterMode": false,
        "controlBehavior": 0,
        "count": 1,
        "gmtCreate": 1566381613072,
        "gmtModified": 1566381613072,
        "grade": 1,
        "id": 15,
        "ip": "192.168.55.1",
        "limitApp": "default",
        "port": 7083,
        "resource": "/test/testProductById/123",
        "strategy": 0
    }
]

新增加的配置,比之前通过nacos控制台 手写的,是增加了不少内容。

修改后,通过访问资源,可以 看到相关请求是被拦截了的。

 

 四、 总结

     以上通过dashboard 修改nacos配置,进入的路径为 流控规则 菜单进入。 从  簇点链路 菜单,右边流控按钮新增,是无法进入的,这个按钮依然访问的是 v1/flow/rules 路径。

    对于降级、热点、授权、系统 等规则保存,可以参考上面的例子,自己去修改Dashboard 代码。

    对于 数据的存储与展示,存储需要结合各自公司的大数据框架,展示也有结合公司的运维平台,对于一般的小公司,感觉需求不是太紧迫,毕竟保障系统稳定运行时第一位的。 

    得益于Sentinel的精心设计, 核心的源码比较少, 主要包括:Context、Node组织,滑动窗口算法,各种降级规则触发都比较简单,围绕核心源码周围代码比较多,例如心跳、接收dashboard命令

 对于集群流量的Cluster 与Client 模式,感觉一般也用不到,目前还没遇到场景,需要对流量进行那么精确的控制,将需要精确控制的场景,用Sentinel 来实现,也不是一个好方案。 

 

 源码地址:https://github.com/xujianguo1/alicloud-demo  release-tag:Sentinel-Config

 欢迎评论,如有问题欢迎提出,一起探讨。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!