欢迎来嫖从零开始SpringCloud Alibaba电商系列:
Sentinel是分布式系统的流量防卫兵!
什么意思呢? 在分布式系统中,各个节点之间往往会存在调用关系。比如电商系统中,订单节点A需要调用库存节点B的减库存接口,但是在库存节点B挂掉了,或者库存节点B负载极高,短时间内无法response,就可能导致订单节点也跟着异常或停滞。
为了防止这种,节点B挂掉(或停滞)导致节点A挂掉(或停滞),又进一步导致其他节点一同发生连锁反应,Hystrix闪亮登场。
嗯……说好的Sentinel,Hystrix是个什么鬼?
在SpringCloud的家族里面,Netflix公司开源的Hystrix才是老牌选手,具有“熔断、服务降级、近实时服务监控”的能力。Sentinel则是随着新生代(SpringCloud Alibaba)一同登场的“QPS可控、支撑近十年阿里巴巴双11”的强劲新人(对两者区别有兴趣可以看看这里)。
为了更好的理解Sentinel,我们先来看一下Sentinel最基本的功能——限流。
Sentinel可视化控制台,我们可以在上面看到已连接服务的一些监控信息。
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.1.jar
dashboard是一个便捷的页面管理工具,真正的Sentinel功能还是依赖在业务项目之中,我们继续在之前的demo基础上进行扩充。
>
>com.alibaba.cloud >
>spring-cloud-starter-alibaba-sentinel >
>
spring.cloud.sentinel.transport.port=8121
spring.cloud.sentinel.transport.dashboard=localhost:8080
package com.lele.mall.controller;/*
* com.lele.mall.controller
* @author: lele
*/
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@SentinelResource("test")
@GetMapping(value = "/test")
public String test(){
return "test";
}
}
除了流量控制,sentinel还支持热点流量控制、服务降级规则配置等。
热点规则是对接口规则的更细化的控制,可以通过对参数进行流量控制,比如将test方法改造为带参数的方法(如下代码),然后配置热点规则的参数索引、单机阈值、统计窗口长度(如下图),则可以按照参数限制。
限制规则:按照索引下标选择限制的参数,如test接口限制第一个参数name,若该参数为某值的方法连续被调用n次(如name="asd"在窗口长度时间内调用超过单机阈值次数),则接下来的name="asd"的访问请求将无法访问。
@SentinelResource("test")
@GetMapping(value = "/test")
public String test(@RequestParam String name){
return name;
}
降级规则则是从 服务响应时间、接口异常次数、接口异常频率来评估接口,若响应过慢,或异常次数过多,则对接口进行降级。
如:test接口被限制为1分钟内异常2次就进行服务降级,服务降级3秒。测试代码及dashboard配置如下。
@SentinelResource("test")
@GetMapping(value = "/test")
public String test(@RequestParam String name){
throw new RuntimeException("asdasd");// 服务降级前页面会看到异常抛出asdasd,服务降级后不会有该信息
//return name;
Sentinel的功能很强大,不只是可以对接口进行限制,还可以让超出限制的请求去调用本地的‘失败专用接口’。
对接口的限制是在保护节点不会被流量或是压力打死,而后续的‘失败专用接口’则是关乎用户体验的命脉,这一部分以及规则持久化我们下一章再来介绍。
注意:如果不使用nacos请去除pom中nacos相关依赖、将bootstrap.properties变更为application.properties并添加server.port属性。
https://github.com/flyChineseBoy/lel-mall/tree/master/mall03
这里正在完善一个从零开始的基于SpringCloud Alibaba的电商系统,有兴趣就来点个star吧!