前言
最近笔者在对微服务架构进行学习,参考了各种项目的技术文章、框架文档以及视频网站,最终选择使用Nacos+Dubbo+Gateway+Sentinel来搭建一个项目练手。其中Nacos作为服务的注册发现中心兼配置中心,Dubbo作为RPC通讯框架来实现服务间的接口调用,而Gateway则作为网关,进行客户端请求的转发,熔断服务则使用Sentinel框架。后续会加入ElasticSearch+SpringSession,进行数据的缓存分级,链路追踪则使用Sleuth,其中还会组合分布式事务框架Seata,有兴趣的朋友可以关注一下,项目地址:https://github.com/peachl/cloud-demo/tree/master#readme,长期更新。
由于发现很多读者对Sentinel比较感兴趣,所以这次单独针对Sentinel做个详细的讲解,使用的例子还是之前的Demo
官网文档和资料
Sentinel在github上面有着相当详细的文档,关于Spring-Cloud集成Sentinel的官方文档。点击相关的启动器可查阅详细文档
初始化项目配置
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
在需要被限流的consumer模块下的yml配置中增加相关Sentinel配置
spring:
cloud:
sentinel:
transport:
#访问端口
dashboard: localhost:8080
#交互端口
port: 8719
下载对应的SentinelJar包,笔者这里使用的版本号为1.7.1,如果需要测试的话,尽量让Demo和Sentinel的版本保持一致
接下来访问之前项目中consumer模块下的getMsg接口,然后进入控制台,Sentinel默认的项目地址为localhost:8080/sentinel,账号密码默认都是sentinel,Sentinel控制台效果图如下:
Sentinel控制台常用设置
流控
点击流控按钮,资源名为名称,针对来源默认default为不针对任何来源,阈值类型QPS指每秒访问总量,而线程数表示最大同时访问的线程。单机阈值是每秒请求数,是否集群中的单机均摊是指每台机器按照均摊阈值设置,而总体阈值指的是该请求所有服务的请求数量为上方设定的均摊阈值。高级选项中的流控模式分为直接、关联和链路,直接是指单个接口访问;关联指的是将两个互相调用的服务关联在一起,当某一个服务被限流时与之关联的服务也会遭到限制;链路指的是当多个服务分别调用该接口时,设置各种不同的入口限流,只有设置了入口的请求才会进入限流。流控效果也有快速失败、Warm Up和排队等待,快速失败指的是直接抛出异常,Warm Up是预热缓慢的将大流量放行出去,排队等待是等待超时事件进行执行。Sentinel中的配置是存入内存的,如果重启机器之后它的相关流控规则会失效需要重新配置,详细文档说明
然后继续快速连续的访问我们的getMsg接口,效果如下图:
设置自定义回调信息
由于流控中的回调信息太过简陋,所以在项目中需要自定义返回信息,但是Sentinel1.7.1中的升级未向下兼容,所以无法找到之前的WebCallbackManager.setUrlBlockHandler方法,它从com.alibaba.csp.sentinel.adapter.spring.servlet升级成为了com.alibaba.csp.sentinel.adapter.spring.webmvc,查看github上面相关的Issue,说是建议用ControllerAdvice来捕获BlockException并返回自定义信息,在此不做详细操作,如果需要自定义的话建议查一下ControllerAdvice注解的用法,在此引用一下github上的相关解释:https://user-images.githubusercontent.com/40854898/99412494-be6dca00-292f-11eb-8cc1-eb96e2e8f51f.png