在spring boot中3分钟上手阿里巴巴服务熔断系统sentinel

一直在用hystrix作熔断降级,可是无奈hystrix官方已经再也不维护了,sentinel背后是阿里巴巴公司,而且一直在维护sentinel,因此先了解下,hystrix不够用时,能够换成sentineljava

而且特性丰富,这里就使用以下两个核心功能git

  1. 熔断
  2. 流控

启动Sentinel控制台

sentinel的控制台是由spring boot开发,特殊需求能够修改源码定制,源码参考:sentinel-dashboard 可使用docker一键启动控制台 编写sentinel-dashboard的Dockerfilegithub

FROM openjdk:8-jdk-alpine

ADD https://github.com/alibaba/Sentinel/releases/download/1.6.0/sentinel-dashboard-1.6.0.jar /sentinel-dashboard-1.6.0.jar
ENTRYPOINT ["java", "-Dserver.port=8080", "-Dcsp.sentinel.dashboard.server=localhost:8080", "-Dproject.name=sentinel-dashboard", "-jar", "/sentinel-dashboard-1.6.0.jar", "-Dfile.encoding=utf-8"]
复制代码

构建sentinel-dashboard镜像:docker build -t sentinel-dashboard . 而后启动web

docker run --name sentinel-dashboard \
    -it --rm -p 8719:8719 -p 8780:8080 sentinel-dashboard
复制代码

其中8080是sentinel web控制界面端口,8719是sentinel应用端和控制台通讯端口,参考配置控制台信息 spring

打开 本机ip:8780 查看效果,默认的用户名密码都是 sentinel docker

建立测试项目并进行配置

在spring boot里集成sentinel比较容易,找个现有的spring boot的项目,或者去https://start.spring.io/建立一个便可shell

引入sentinel包,这个包用来进行熔断控制,同时会和sentinel控制台进行通讯浏览器

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-alibaba-sentinel -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
	<version>0.9.0.RELEASE</version>
</dependency>
复制代码

注意修改pom.xml文件后记得reimport一下缓存

在配置里加上和sentinel控制台通讯的配置:src/main/resources/application.propertiesbash

spring.application.name=MySentinel
spring.cloud.sentinel.eager= true
spring.cloud.sentinel.transport.port= 8720
spring.cloud.sentinel.transport.dashboard= 127.0.0.1:8780
spring.cloud.sentinel.transport.heartbeat-interval-ms= 500
复制代码

注意这里的8720端口是应用端的sentinel和sentinel控制台通讯的端口

启动项目在sentinel控制台查看效果

能够看到项目已经成功和sentinel控制台创建了通讯

sentinel能够对多个http客户端进行熔断,参考:Feign & RestTemplate支持

这里使用最经常使用的RestTemplate来进行请求

在spring boot main方法所在类里配置容许sentinel对RestTemplate进行熔断 核心代码以下:

@Bean
@SentinelRestTemplate
public RestTemplate restTemplate() {
	return new RestTemplate();
}
复制代码

这个SentinelRestTemplate注解有几个事件回调的参数,能够在熔断时执行自定义的处理逻辑,参考:RestTemplate 支持

有时间能够去详细研究下

编写熔断测试代码

在项目里编写测试控制器好比 MyController.java 核心代码以下

@RestController
@RequestMapping("test")
public class MyController {

    @GetMapping(value = "/hello")
    @SentinelResource("hello")
    public String hello() {
        return "Hello Sentinel";
    }

}
复制代码

SentinelResource注解里的值是资源标识符,能够为这个资源标识符指定限流,熔断规则等

在浏览器里请求这个地址,而后查看sentinel控制台

能够看到sentinel控制台已经成功监控到了这个测试的url

降级测试

编写一个控制器路由,让这个路由可以触发降级阈值,核心代码以下:

@GetMapping(value = "/mye")
@SentinelResource("mye")
public String mye() {
    if (true) {
        throw new RuntimeException("mye");
    }
    return "mye Sentinel";
}
复制代码

能够看到这段代码是会100%抛出异常

配置降级规则 点击 降级规则->新做降级规则 按钮新增降级规则

右键新窗口能够查看大图,这个熔断规则是任务当请求里的异常比例超过50%后,熔断接口30秒

而后屡次请求这个异常接口,查看控制台日志,在几回异常后,能够看到sentinel已经开始熔断保护这个接口了

限流测试

编写一个输出字符串的接口来测试,核心代码以下:

@GetMapping(value = "/myrate")
@SentinelResource("myrate")
public String myrate() {
    return "myrate Sentinel";
}
复制代码

添加限流规则

这里为了看到效果,阈值设置得比较极端:qps超过1秒就限流

而后在浏览器里访问这个接口,按住ctrl+r模拟频繁访问的效果,由于阈值设置得比较极端,马上就能够在应用控制台里看到已经触发了sentinel的限流保护机制了

页面上也开始提示No message了

一些注意的点

测试时注意端口不要冲突了,setinel控制台占用了两个端口(8719, 8080),应用也会占用两个端口(8720, 8666), 8666应用web端口能够自行设置

应用的sentinel客户端会缓存sentinel控制台的熔断规则,若是sentinel控制台宕机了,应用还会继续使用缓存的熔断规则进行熔断。能够重启应用让熔断规则失效

docker的sentinel默认重启后熔断规则会丢失,若是保存熔断规则须要配置数据源,参考动态数据源支持

相关文章
相关标签/搜索