“满大街的人格残疾顶着恋爱之名寻求心理救赎,误把求救当爱情,误把索取当成长,其实你从未见过爱情”
之前的微服务熔断我们需要使用hystrix,我们知道虽然能用,但是Netflix已经不再进行维护了,所有我们需要寻找新的替代的工具,所以alibaba的Sentinel便成了首选
Sentinel: 分布式系统的流量防卫兵
这是官网的介绍
https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
详细文档请看官方文档,我叭叭半天你还不一定懂
Sentinel主要功能
- 熔断:。。。
- 限流:提供非常细度的限流规则
- 监控:。。。
搭建
- 引依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
- 添加配置
spring:
application:
name: gmsj-customer
profiles:
active: dev
cloud:
nacos:
config:
server-addr: ${settings.nacos.addr}
namespace: ${settings.nacos.namespace.${spring.profiles.active}}
file-extension: yaml
shared-configs: shareConfig.yaml
refresh-enabled: true
# extension-configs:
# dataId:
# group:
# refresh: true
discovery:
server-addr: ${settings.nacos.addr}
namespace: ${settings.nacos.namespace.${spring.profiles.active}}
sentinel:
transport:
dashboard: ${settings.sentinel.dashboard}
feign:
sentinel:
enabled: true
##### nacos配置参数 ####
settings:
nacos:
addr: 192.168.31.37:38001
namespace:
dev: 190bfcff-e39e-42d7-ae87-af2690a4d409
sentinel:
dashboard: 192.168.31.37:8808
主要添加了Sentinel的控制台的配置,如果你不需要可以不要添加
Dashobard搭建
需要下载jar然后自行部署,这点感觉不太方便,个人觉得还是自己下载源码,docker部署比较好,这是spring boot项目,和正常服务一样部署就行,不管是修改配置还是管理项目,都比运行一个jar包强的多吧
https://github.com/alibaba/Sentinel/releases
我比较懒,直接部署jar包
java -jar sentinel-dashboard-1.7.2.jar
- 默认启动端口是8080,用户名和密码都是sentinel
可以通过- –server.port=8088,指定端口
- –auth.username=sentinel
- –auth.password=123456
具体怎么修改可以查看源码的配置文件
为了方便,我是在windows上启动的
java -jar .\sentinel-dashboard-1.7.2.jar --server.port=8808 --auth.username=meng --auth.password=123456
启动成功后打开ip:端口即可访问控制台
- 定义资源
@Service
public class CustomerServiceImpl implements CustomerService {
@Override
@SentinelResource(value = "hello", blockHandler = "helloException", fallback = "helloFallback")
public String hello(String msg) {
// throw new RuntimeException("异常发生了");
return "hello" + msg;
}
public String helloException(String msg, BlockException ble){
return msg + " 异常:" + ble.getMessage();
}
public String helloFallback(String msg){
return msg + " fallback";
}
}
资源的定义方式有多种,这里采用注解的方式,不入侵源代码
所有方式:https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8
通过@SentinelResource定义了一个资源,value表示资源的名称,标识该接口
- value:资源名称,必需项(不能为空)
- entryType:entry 类型,可选项(默认为 EntryType.OUT)
- blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
fallback / fallbackClass:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:
返回值类型必须与原函数返回值类型一致;
方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。 - fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
- defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:
返回值类型必须与原函数返回值类型一致;
方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。 - exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
- 官方文档:https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81
然后在控制台配置该接口的限流,第一次需要先调一次接口,然后在sentinel控制台即可看见该资源的信息
然后我们可以给资源添加各种限制
在簇点链路对应的资源名称,添加一个流控,对接口限流,也可以直接在流控规则菜单中直接添加
使用QPS,设置单机阈值为2,每秒最多请求两次,快速请求接口
可以看见返回了我在@SentinelResource中定义的blockHandler 返回信息
降级设置和流控类似,然后规则的定义在上面给出的官方文档里面都有,
还有热点限流,就是资源的指定参数访问限制
该资源一秒只能调两次,否者就会抛出我们刚刚定义的错误
然后在热点规则中编辑我们刚刚配置的规则,展开高级选项,配置指定参数值的限流阈值
第一个参数的参数值为mm的1秒只能请求一次。
然后还有授权就不用讲了,你点开一看就明白,还有系统规则里面可以新增系统规则保护服务器,需要的话可以了解一下。
大概规则就这些,后面有问题我还会持续更新,有问题也请指出
以上只是我们的一个简单测试,并不适合在生产环境使用,
在控制台配置,界面化的操作是比较方便,但是我们如果重启,我们配置的规则就丢失了,所以我们需要对我们配置的规则进行持久化。