【Sentinel】sentinel 集成 apollo 最佳实践

【Sentinel】sentinel 集成 apollo 最佳实践

前言

??在 sentinel 的控制台设置的规则信息默认都是存在内存当中的。所以无论你是重启了 sentinel 的客户端还是 sentinel 的控制台。你所设置的规则都会丢失。如果想要 sentinel 在线上环境使用,要么花钱用阿里云上的付费版本,要么自己去实现规则的持久化,如果你或你所在的公司不差钱,那么关掉这篇文章,直接用付费版吧,省掉了一大堆坑要踩。或者你是一个特立独行的人,那么我们接着往下说。
??首先说一下写这篇文章的原因,因为真得在与 apllo 集成时,踩坑踩到怀疑人生。另一点是,找了一大堆关于集成的 apollo 的文章,都清一色的都是仿照官方给的限流规则的 DEMO 做的。 但是 sentinel 规则还有熔断规则、参数限流、系统限流、黑白名单等很多规则,每个规则还有细节上的不一致,这些都没有提,还有一些客户端的坑就更没有了。踩了这么多坑,有了一点心得与体会,梳理与此,希望能帮助到读者。

拉取 sentinel 控制台源码进行修改

??因为修改内容过多,本文不会详述,下面的截图是所有修改内容,并且因为写这篇文章时,1.7版本在 master 开发,有大量快照版本。所以是切到当前稳定的 1.6 分支进行修改的。我已经 fork sentinel 到我的 github,下面是修改的内容 地址

修改点1:实现所有规则的拉取与推送接口

??添加与实现了所有的规则的 Provider 与 Publisher 的配置拉取的与推送。

修改点2:修改控制台使用的规则操作 api

规则在控制台的操作 controller 进行大量改造。

修改点3:修改 xxEntity

??最后一点也是最坑的修改了大量的 xxEntity 类,这些类是规则的实体类,本身没什么,源码是直接 json 化保存的,但是用于客户端集成的 spring-cloud-alibaba 使用了 json 校验,如果 apollo 保存的 json 与客户端的实体类有一丁点不一样就报 convert 0 rules but there are 1 rules from datasource . RuleCLass: FlowRule 。 是不是觉得很摸不着头脑,这报错跟 json 格式转换错误有什么,下面是 spring-cloud-alibaba json 转换的代码。

??写这段代码的老哥,把这个异常吃了,并补上了一个 // won‘t be happen 的注释,你能理解我当时被这个报错坑的死去活来,后来发现是这里的问题吗?后来在 github 上找到两个同样的问题问题1问题2,按照方法把 xxEntity 中用不到的字段全部加上 @JSONField(serialize = false) 解决。

修改点4:抽离配置使得可以在启动的时传入

??添加的配置在下面

使用修改的控制台版本

  1. 你可以fork sentinel 官方代码按上述的自行修改,然后打包
  2. 你可以拉取我 fork 的 sentinel 代码下来直接打包
  3. 你可以使用我已经打好的包 地址

自定义配置

配置名称 是否必填 默认值 作用
env DEV 指定 apollo 使用的环境
app.id sentinel-apollo 指定保存 sentinel 规则的 apollo 应用 ID
cluster.name default 指定保存 sentinel 使用的 apollo 集群
namespace.name application 指定保存 sentinel 使用的 apollo 命名空间
modify.user apollo 控制台显示的修改人账号,此账号务必要有此应用的权限
modify.comment modify by sentinel-dashboard apollo 控制台显示的修改备注
release.user apollo 控制台显示的发布人账号,此账号务必要有此应用的权限
release.comment release by sentinel-dashboard apollo 控制台显示的发布备注
apollo.portal.url ?apollo 控制台的地址
apollo.application.token 指定保存 sentinel 规则的 apollo 应用 openapi 的 token
authority.key.suffix authority 认证规则保存在 apollo 中的 key 的后缀
degrade.key.suffix degrade 熔断规则保存在 apollo 中的 key 的后缀
flow.key.suffix flow 限流规则保存在 apollo 中的 key 的后缀
param.key.suffix param_flow 参数限流规则保存在 apollo 中的 key 的后缀
system.key.suffix system 系统限流规则保存在 apollo 中的 key 的后缀
auth.username sentinel sentinel 控制台的登录用户名
auth.password sentinel sentinel 控制台的登录密码
server.port 8080 sentinel 控制台的启动端口

Apollo 配置

创建用于保存 sentinel 的项目

  1. 点击创建项目按钮
  2. 输入项目信息

    1. 应用 ID 对应 上面表格中的 app.id
    2. 应用负责人 对应 上面表格中的 modify.userrelease.user
  3. 创建一个公共命名空间
    1. 点击右下角添加 Namespace 按钮
    2. 创建 Namespace

      1. 名称对应上面表格中的 namespace.name,注意名称是要包含部门名的,这里脱敏了
      2. 类型一定要选择 public ,原因后面会说
  4. 发布 Namespace

    1. 私有的空间是不能被继承的,application 没有用,可以删除

      1. 这里的用意是我们独立出一个单独的用于保存规则的 apollo 应用,因为是公共的,所以其它apollo 应用可以继承,这样对于已经集成 apollo 的项目来说,改动最小
      2. 注意红色的提示,我们建的公共空间要首先发布一次,否则 api 无法访问到
  5. 创建此项目的开放平台授权
    1. 点击右上角的开放平台授权管理
    2. 创建应用

      1. 第三方应用 ID 就是你上面创建的项目的 appId
      2. 第三方应用名称 随便写
    3. 赋权

      1. token 你点击创建应用后自动生成的
      2. 被管理的 Appid 就是你上面创建的项目的 appId
      3. 授权类型 一定要选 App

spring boot 集成 sentinel

源码地址

引入依赖

        <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.5.2</version>
        </dependency>

测试 controller

package cn.coder4j.study.example.sentinel;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author buhao
 * @version TestController.java, v 0.1 2019-09-19 20:53 buhao
 */
@RequestMapping("/test")
@Controller
public class TestController {

    /**
     * 没有注解通过自适应的限流
     * @return
     */
    @GetMapping("/flowRule")
    @ResponseBody
    public String flowRule(){
        return "success";
    }

    /**
     * 通过手动注解的限流
     * @return
     */
    @GetMapping("/flowRuleWithAnno")
    @ResponseBody
    @SentinelResource("flowRuleWithAnno")
    public String flowRuleWithAnno(){
        return "success";
    }

    /**
     * 参数限流规则测试
     * @param param
     * @return
     */
    @GetMapping("/paramFlowRule")
    @ResponseBody
    @SentinelResource("paramFlowRule")
    public String paramFlowRule(String param){
        return "success";
    }

    /**
     * 熔断规则测试
     * @return
     */
    @GetMapping("/degradeRule")
    @ResponseBody
    @SentinelResource("degradeRule")
    public String degradeRule(){
        throw new RuntimeException("服务器异常");
    }
}

配置 application.yml

apollo:
  bootstrap:
    enabled: true # 开启 apollo
  meta: xxx       # 指定 apollo 注册地址
app:
  id: sentinel-apollo  # 指定规则项目在 apollo 的app.id,要与 sentinel 控制台启动参数一致
spring:
  application:
    name: study-sentinel-example  # 应用名称,不同项目要唯一,会把他做为规则 Key 的前缀
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8989  # sentinel 控制台的地址
      datasource:
        ds1:
          apollo:
            namespace-name: {部门名}.sentinel-rule  # 保存规则的 apollo 应用的公共 namespace, 要与 sentinel 控制台启动参数一致
            rule-type: flow   # 指定该数据源是限流规则
            flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds1.apollo.rule-type} # 指定该规则在 apollo 应用中 key 名称
        ds2:
          apollo:
            namespace-name: {部门名}.sentinel-rule
            rule-type: degrade # 指定该数据源是熔断规则
            flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds2.apollo.rule-type} # 指定该规则在 apollo 应用中 key 名称
        ds3:
          apollo:
            namespace-name: {部门名}.sentinel-rule
            rule-type: param_flow # 指定该数据源是参数限流规则
            flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds3.apollo.rule-type} # 指定该规则在 apollo 应用中 key 名称
        ds4:
          apollo:
            namespace-name: {部门名}.sentinel-rule
            rule-type: system  # 指定该数据源是系统限流规则
            flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds4.apollo.rule-type} # 指定该规则在 apollo 应用中 key 名称
        ds5:
          apollo:
            namespace-name: {部门名}.sentinel-rule
            rule-type: authority # 指定该数据源是认证限流(黑白名单)规则
            flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds5.apollo.rule-type} # 指定该规则在 apollo 应用中 key 名称

sentinel 控制台配置

  1. 第一次启动时 sentinel 是没有应用数据,只要请求几次你应用的接口就可以了
  2. 请求之后可以看到我们的应用在右侧列表了
  3. 首先点击簇点监控,如果是空白的话说明,接口还没有被请求过,通过上面提供的 jmeter 脚本,可以快速访问所有接口,访问后如下图所示

    1. 可以看到除了我们手动通过注解定义的资源名,还多了一些是通过我们的 controller 路径的资源名,这些都是我们客户端集成 spring-cloud-starter-alibaba-sentinel 包后,自动适配的。这两种其实在使用上有区别的

      1. 自动适配的限流后会返回 Blocked by Sentinel (flow limiting)
      2. 通过注解的是会抛出 UndeclaredThrowableException 异常,我们可以通过 文章 说的方法转成我们想的限流异常处理。
    2. 右边的操作就是添加各种规则,这里修改后会实时同步到客户端并同步保存到 apollo

jmeter 配置

??jmeter 是用于测试与验证规则使用的,因为可以设置线程数,所以可以很好的测试限流情况。测试脚本下载

  1. 线程组要把线程设置成 100,方便后面的统计,另外为了在一秒内执行完,Ramp-Up 时间设为0
  2. 请求默认值就是填写你本地的启的测试项目的地址
  3. xx 规则填写测试接口地址,参数限流因为要做对照实验所以写了两个
  4. 查看结果树可以看到你每次请求的内容与结果
  5. 可以看到上张图片内有红色的有绿色的,红色说明断言失败,绿色说明断言成功,断言的内容就是包含 success
  6. 聚合统计,这个可以统计出100个线程请求后的总体结果,我们只要看 Error% 的失败率就可以了。图中可以看到除了熔断限流,其它限流失败率是 0

测试步骤

  1. 在簇点链路中找到 /test/flowRule,并点击流控按钮
  2. 单机阈值填入 10,点击新增
  3. 新增后会跳转到流程规则页面
  4. 运行jemter,可以看到失败率为90%,这代表你的限流成功了

    1. 上面说了失败是因为断言没有成功,也就是说没有返回 success,那他现在返回的是什么呢?
    2. 察看结果树,随便找一条红包的记录,看响应数量
    3. 可以看到返回的是 "Blocked by Sentinel (flow limiting)",这个就是集成后配置的限流页面的返回值,可以通过 spring.cloud.sentinel.servlet.block-page 指定成你自己的页面
  5. 另外打开 apollo 可以看到,多了一个规则,这就是你刚刚添加的限流规则

欢迎关注我的公众号「KIWI的碎碎念」,也可以收藏 我的博客

原文地址:https://www.cnblogs.com/kiwifly/p/11569190.html

时间: 2024-10-02 23:11:45

【Sentinel】sentinel 集成 apollo 最佳实践的相关文章

IBM ODM规则服务集成的最佳实践

企业IT架构中,我们通常会将规则引擎作为一个独立的服务,供企业中的不同应用消费,这也和当前一切皆服务的SOA思想吻合.那么问题来了,规则服务以什么形式部署呢?怎样和应用交互集成呢?Webservice? 好吧,这是一个标准答案,并且也是一个差不多正确的答案,但我们还有更多需要考虑的东西. 我曾在一个保险行业客户处看到这样一个设计:客户设计了一个webservice,用于定义核保的输入输出,然后定义了一个EJB服务来包装规则服务,供webservice调用,在该EJB的实现中,再调用ODM自带的E

Elasticsearch集成Hadoop最佳实践.pdf(内含目录)

Elasticsearch服务器开发(第2版) 介绍: ElasticSearch是一个开源的分布式搜索引擎,具有高可靠性,支持非常多的企业级搜索用例.ElasticsearchHadoop作为一个完美的工具,用来连接Elasticsearch和Hadoop的生态系统.通过Kibana技术,ElasticsearchHadoop很容易从Hadoop生态系统中获得大数据分析的结果. 本书全面介绍ElasticsearchHadoop技术用于大数据分析以及数据可视化的方法.内容共分7章,包括Hado

Abp集成Swagger的最佳实践

1.在项目中添加nuget包 Abp.Web.Api.SwaggerTool 2.在项目Abp模块的DependsOn添加AbpWebApiSwaggerToolModule Run It,启动项目,访问/swagger/ui/index 就打开熟悉的swagger-ui界面,项目中webapi和动态Api的接口都出现了. Abp.Web.Api.SwaggerTool作为swagger的增强包,内部实现了很多有用的功能并提供了一些最佳实践,用户无需在意Swagger的集成问题. 项目源码htt

开涛spring3(7.5) - 对JDBC的支持 之 7.5 集成Spring JDBC及最佳实践

7.5 集成Spring JDBC及最佳实践 大多数情况下Spring JDBC都是与IOC容器一起使用.通过配置方式使用Spring JDBC. 而且大部分时间都是使用JdbcTemplate类(或SimpleJdbcTemplate和NamedParameterJdbcTemplate)进行开发,即可能80%时间使用JdbcTemplate类,而只有20%时间使用其他类开发,符合80/20法则.   Spring JDBC通过实现DaoSupport来支持一致的数据库访问. Spring J

大数据管理:数据集成的技术、方法与最佳实践 读书笔记三

7.1 什么是数据仓库 数据仓库是基于特定的数据结构(以及有关应用程序)所构建的数据的中央存储库,以便为分析和报表提供 一致的数据源.面向整个组织创建的企业数据仓库(Enterprise Data Warehouse,EDW)用于对整个组织的信息 进行分析.大多数情况下,超大型组织中会有多个企业级数据仓库,每个都拥有组织中某个很大组成部分的数 据,如某个区域,或者很大的功能域.批处理数据集成方案通常用于将数据置入或者移出数据仓库.数据仓库架 构的设计要达到以下目的:为整个组织的分析提供一致可用的

个推持续集成最佳实践

软件开发过程中,开发成员经常需要把自己工作集成到项目中,通常每个成员每天至少集成一次.如果项目较小,对外部的依赖较小,那么软件集成可能不会是什么问题.但是目前很多软件项目特别是互联网项目面临着需求不明确,系统架构复杂,任务分配混乱等一系列问题,从而给持续集成带来许多麻烦.也给整个项目带来不必要的风险.因此一个有效的持续集成系统越来越重要.个推平台是一个极其复杂的分布式系统,整个系统包含了 RPC 调用,高速缓存,集群同步等各种复杂的场景.整个团队只有二十来个人却维护了近百个模块的开发和测试工作,

Spring Cloud Alibaba基础教程:Sentinel Dashboard同步Apollo存储规则

在之前的两篇教程中我们分别介绍了如何将Sentinel的限流规则存储到Nacos和Apollo中.同时,在文末的思考中,我都指出了这两套整合方案都存在一个不足之处:不论采用什么配置中心,限流规则都只能通过Nacos界面或Apollo界面来完成修改才能得到持久化存储,而在Sentinel Dashboard中修改限流规则虽然可以生效,但是不会被持久化到配置中心.而在这两个配置中心里存储的数据是一个Json格式,当存储的规则越来越多,对该Json配置的可读性与可维护性会变的越来越差.所以,下面我们就

ASP.NET跨平台最佳实践

前言 八年的坚持敌不过领导的固执,最终还是不得不阔别已经成为我第二语言的C#,转战Java阵营.有过短暂的失落和迷茫,但技术转型真的没有想象中那么难.回头审视,其实单从语言本身来看,C#确实比Java更优秀(并非C#天生丽质,而是它站在了巨人的肩膀上). 本文并非为.NET正名而来,而仅仅是分享作者近几年在ASP.NET跨平台方面的研究与实践经验,算是对八年的.NET之路作一个阶段性的总结. .NET技术自诞生以来,便一直因其跨平台能力差而广受诟病.这里面有微软有意为之,也有别有用心之人在混淆视

毫秒必争,前端网页性能最佳实践

你愿意为打开一个网页等待多长时间?我一秒也不愿意等.但是事实上大多数网站在响应速度方面都让人失望.现在越来越多的人开始建立自己的网站,博客,你的网页响应速度如何呢?在这篇文章中我们来介绍一下提高网页性能的最佳实践,以及相应的问题解决方案,让站长或者即将要成为站长的朋友了解如何去测试和提高网站响应速度,对自己的网站更有信心. 最佳实践 最佳实践我们引用的来自yahoo前端性能团队总结的35条黄金定律.原文猛击这里.下面我们分门别类将每条的关键点总结一下. 网页内容 减少http请求次数 减少DNS