概述
Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。
官方文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
- Sentinel 分为两个部分:
核心库(Java 客户端):不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。 - 控制台(Dashboard):基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
环境搭建
一、dashboard 控制台安装与启动
-
下载地址:https://github.com/alibaba/Sentinel/releases
-
启动控制台
java -jar sentinel-dashboard-1.8.6.jar --server.port=8333
默认是8080端口,可能会被占用,这里我们指定了下8333端口。
-
配置控制台信息
application.yml内容如下,这里
spring.cloud.sentinel.transport.port
是SpringBoot项目与控制台做交互的端口,默认8719。spring: cloud: sentinel: transport: port: 8719 dashboard: localhost:8333
-
进入控制台
访问刚刚配置好的地址:localhost:8333
默认用户名:sentinel 密码: sentinel,登录,至此控制台环境搭建完成!
二、SpringBoot整合Sentinel
-
引入Sentinel依赖
版本号最好与dashboard 版本对应,由于sentinel对spring could做了很好的适配,引入依赖后,项目里就可以正常监控了,是不是很简单。
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
-
加入Feign支持
Sentinel 适配了Feign组件。如果想要使用,还需要做 2 个事情:
-
配置文件打开 Sentinel 对 Feign 的支持:
feign.sentinel.enabled=true
-
加入
spring-cloud-starter-openfeign
依赖使 Sentinel starter 中的自动化配置类生效<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
@FeignClient(name = "service-provider", fallback = EchoServiceFallback.class, configuration = FeignConfiguration.class) public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); } class FeignConfiguration { @Bean public EchoServiceFallback echoServiceFallback() { return new EchoServiceFallback(); } } class EchoServiceFallback implements EchoService { @Override public String echo(@PathVariable("str") String str) { return "echo fallback"; } }
这里降级方法与hystrix类似,EchoServiceFallback实现降级方法。
-
-
自定义流控响应
项目里一般要配置,对流控拦截后的默认响应,这里我们成一个公共返回对象
@Component public class GulimallSentinelConfig implements UrlBlockHandler{ @Override public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws IOException { R r = R.error(BizCodeEnum.SECKILL_EXCEPTION.getCode(),BizCodeEnum.SECKILL_EXCEPTION.getMsg()); response.setContentType("application/json;charset=utf-8"); response.getWriter().write(JSON.toJSONString(r)); } }
-
网关流控
如果能在网关层就进行流控,可以避免请求流入业务,减小服务压力
<!-- 引入sentinel网关限流 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> <version>2.1.0.RELEASE</version> </dependency>