Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级流量控制产品,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。 点此地址了解更多Sentinel。html
Sentinel分为两个部分:客户端以及控制台。java
当前最新的release版本为1.4.0git
https://github.com/alibaba/Sentinel/releases/tag/1.4.0github
注意:启动 Sentinel 控制台须要 JDK 版本为 1.8 及以上版本。spring
使用以下命令启动控制台:api
java -Dserver.port=8080 \ -Dcsp.sentinel.dashboard.server=localhost:8080 \ -Dproject.name=sentinel-dashboard \ -jar sentinel-dashboard.jar
其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080。架构
访问http://localhost:8080查看控制台信息。 分布式
使用时需引入如下模块(以 Maven 为例):spring-boot
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-dubbo-adapter</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> <version>1.4.0</version> </dependency>
启动时加入 JVM 参数.net
-Djava.net.preferIPv4Stack=true \ -Dcsp.sentinel.api.port=8720 \ -Dcsp.sentinel.dashboard.server=localhost:8787 \ -Dproject.name=example-customer
启动项参数说明:
更详细的信息能够参考启动配置项。
而后你能够愉快的打开控制台对你的服务进行限流,熔断降级了。
方法1:采用包装异常的形式,将全部的异常包装为统一的结构体,并设定异常状态码,例如业务异常都是400,服务异常是500。
public class Result<T> { /** * 状态码 */ private int code; /** * 消息 */ private String message; /** * 数据 */ private T result; // TODO 忽略get,set } Entry entry = null; try { entry = SphU.entry(resourceName, entryType, 1, pjp.getArgs()); Object result = pjp.proceed(); // 核心判断 if (result instanceof Result && ((Result) result).getCode() == 500) { Tracer.trace(new RuntimeException(((Result) result).getMessage())); } return result; } catch (BlockException ex) { return handleBlockException(pjp, annotation, ex); } catch (Throwable ex) { Tracer.trace(ex); throw ex; } finally { if (entry != null) { entry.exit(); } }
方法2:采用抛异常的形式,定义一个BussinessException业务异常。
Entry entry = null; try { entry = SphU.entry(resourceName, entryType, 1, pjp.getArgs()); return pjp.proceed(); } catch (BlockException ex) { return handleBlockException(pjp, annotation, ex); } catch (BussinessException ex) { // 核心处理 throw ex; } catch (Throwable ex) { Tracer.trace(ex); throw ex; } finally { if (entry != null) { entry.exit(); } }
至于采用何种方式进行改造,见仁见智吧。
相关连接参考:
楼主本身改造了一个版本,目前已实现的功能以下:
欢迎start,若有问题,欢迎指出,共同进步: