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,若有問題,歡迎指出,共同進步: