spring cloud
首发于spring cloud

Spring Cloud alibaba网关 sentinel zuul 四 限流熔断

spring cloud alibaba 集成了 他内部开源的 Sentinel 熔断限流框架


Sentinel 介绍


官方网址随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。


Sentinel 具有以下特征:



  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
    完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。


  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。


  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。



Sentinel 的主要特性:





Sentinel 的开源生态:





介绍一下 如果搭建。本次并不会一点点延伸更深层次的地方。只教大家快速使用。等spring cloud gateway更新完成之后会带大家更深层次的挖掘 Sentinel 的功能。


Sentinel的快速搭建


直接下载官网已经打好的jar包


release地址 github.com/alibaba/Sent


源码编译git clone github.com/alibaba/Sent


然后进入目录执行 mvn clean package


命令启动


java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar


如果需要docker 的话 可编写 docker Dockerfile


# 基于哪个镜像
FROM java:8
# 拷贝文件到容器,也可以直接写成ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar /app.jar
ADD ./*.jar app.jar
RUN mkdir -p /var/logs/Sentinel
RUN mkdir -p /var/logs/jvm
RUN mkdir -p /var/logs/dump
RUN bash -c 'touch /app.jar'
# 开放8080端口
EXPOSE 8080
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-XX:-PrintGCDetails","-XX:-PrintGCTimeStamps","-XX:-HeapDumpOnOutOfMemoryError","-XX:HeapDumpPath=/var/logs/dump/oom_dump.dump","-Xloggc:/var/logs/jvm/app.log","-Dfile.encoding=UTF8","-Duser.timezone=GMT+08","-XX:CMSInitiatingOccupancyFraction=90","-XX:MaxGCPauseMillis=200","-XX:StringTableSize=20000","-XX:+UseG1GC","-Xss256k","-Xmx1024m","-Xms512m","-jar","/app.jar"]


执行 docker 镜像制作


docker  build --tag sentinel:1.0 .


--tag projectname:version 注意写法






然后docker run 启动镜像。这里作者使用的docker镜像方式启动docker run -d -p9088:8080 304342c105e9


然后控制台输入 http://localhost:9088/ 用户名密码 sentinel/sentinel


登录参数配置:


从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel。可以参考 鉴权模块文档 配置用户名和密码。


  • Dsentinel.dashboard.auth.username=sentinel 用于指定控制台的登录用户名为 sentinel;


  • Dsentinel.dashboard.auth.password=123456 用于指定控制台的登录密码为 123456;如果省略这两个参数,默认用户和密码均为 sentinel;


  • Dserver.servlet.session.timeout=7200 用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;



输入密码登录


服务已启动我们在整合 网关zuul 服务于sentinel的整合。


pom 添加


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



操作添加俩个文件在resources下面


  • api.json



[
  {
    "apiName": "cloud-discovery-server",
    "predicateItems": [
      {
        "pattern": "/server/**"
      },
      {
        "pattern": "/server/server/**",
        "matchStrategy": 1
      },
      {
        "items": [
          {
            "pattern": "/server/**"
          }
        ]
      }
    ]
  },
  {
    "apiName": "cloud-discovery-client",
    "predicateItems": [
      {
        "pattern": "/client/**"
      }
    ]
  }
]


启动服务并进行之前的一次访问


  • gateway.json



[
  {
    "resource": "cloud-discovery-server",
    "count": 1
  },
  {
    "resource": "cloud-discovery-client",
    "count": 10,
    "intervalSec": 2,
    "controlBehavior": 1,
    "maxQueueingTimeoutMs": 200,
    "paramItem": {
      "parseStrategy": 3,
      "fieldName": "test"
    }
  }
]


多次请求 curl http://localhost:9083/server/server/hello?name=tom


然后在控制台



api.json 对应的是控制台 api 管理


用户自定义的 API 定义分组,可以看做是一些 URL 匹配的组合。比如我们可以定义一个 API 叫 myapi,请求 path 模式为 /foo/ 和 /baz/ 的都归到 myapi 这个 API 分组下面。限流的时候可以针对这个自定义的 API 分组维度进行限流。


gateway 对应的是控制台流控管理


  • resource:资源名称,可以是网关中的 route 名称或者用户自定义的API 分组名称。


  • resourceMode:规则是针对 API Gateway 的route(RESOURCEMODEROUTEID)还是用户在 Sentinel 中定义的API 分组(RESOURCEMODECUSTOMAPI_NAME),默认是route。


  • grade:限流指标维度,同限流规则的grade 字段。


  • count:限流阈值


  • intervalSec:统计时间窗口,单位是秒,默认是1 秒(目前仅对参数限流生效)。


  • controlBehavior:流量整形的控制效果,同限流规则的 controlBehavior 字段,目前支持快速失败和匀速排队两种模式,默认是快速失败。


  • burst:应对突发请求时额外允许的请求数目(目前仅对参数限流生效)。


  • maxQueueingTimeoutMs:匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效。


  • paramItem:参数限流配置。若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规则;否则会转换成热点规则。其中的字段:


  • parseStrategy:从请求中提取参数的策略,目前支持提取来源 IP(PARAMPARSESTRATEGYCLIENTIP)、


  • Host(PARAMPARSESTRATEGYHOST)、任意 Header(PARAMPARSESTRATEGYHEADER)和任意 URL 参数(PARAMPARSESTRATEGYURLPARAM)四种模式。


  • fieldName:若提取策略选择 Header 模式或 URL 参数模式,则需要指定对应的 header 名称或 URL 参数名称。


  • pattern 和 matchStrategy:为后续参数匹配特性预留,目前未实现。



其实在控制台上 可以看到请求链路、还有流量规则。编辑的位置,都能匹配这是各种的组合配置。因为Sentinel 是阿里巴巴开源的流控框架。非常简单实用。文档也非常全面,强烈推荐能自己去官网学习这些资料。我这里只是做一个简单的整合。


Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。




版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。转载请附带公众号二维码如何喜欢可以关注分享本公众号。

发布于 2019-11-04

文章被以下专栏收录

    spring cloud alibaba 学习和讨论。微服务当前这么火爆的程度,如果不能学会一种微服务框架技术。怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习。说没有时间?没有精力?要学俩个框架?而Spring Cloud alibaba只需要你学会一个就会拥有俩种微服务治理框架技术。何乐而不为呢?加油吧!骚猿年