摘要:開發(fā)階段很有意義。源碼整合配置文件中添加來開啟編寫類,實現(xiàn)默認用戶遠程調(diào)用被限流降級,默認用戶應(yīng)用定義可以拿到異常信息無法拿到異常信息若初啟動應(yīng)用,設(shè)置流控規(guī)則,結(jié)果展示如下默認用戶源碼
Sentinel API
Github : WIKI
Sphu (指明要保護的資源名稱)
Tracer (指明調(diào)用來源,異常統(tǒng)計接口)
ContextUtil(標示進入調(diào)用鏈入口)
流控規(guī)則(針對來源屬性)
@GetMapping("/test-sentinel-api") public String testSentinelAPI(@RequestParam(required = false) String a) { String resourceName = "test-sentinel-api"; ContextUtil.enter(resourceName, "user-center-service"); // 定義一個sentinel 保護的資源,名稱是test-sentinel-api Entry entry = null; try { entry = SphU.entry(resourceName); // ...被保護的業(yè)務(wù)邏輯處理 if (StringUtils.isEmpty(a)) { // Sentinel 默認只會統(tǒng)計BlockException & BlockException的子類,如果想統(tǒng)計其他異常信息,添加Tracer throw new IllegalArgumentException("A is not empty."); } return a; // block Exception: 如果被保護的資源被限流或者降級了,就會拋異常出去 } catch (BlockException e) { log.error("我被限流啦?。}", e); return "我被限流啦!!"; } catch (IllegalArgumentException argEx) { // 統(tǒng)計當前異常發(fā)生次數(shù) / 占比 Tracer.trace(argEx); return "非法參數(shù)信息"; } finally { if (entry != null) { entry.exit(); } ContextUtil.exit(); } }
降級規(guī)則
@GetMapping("/test-sentinel-api") public String testSentinelAPI(@RequestParam(required = false) String a) { // 定義一個sentinel 保護的資源,名稱是test-sentinel-api Entry entry = null; try { entry = SphU.entry("test-sentinel-api"); // ...被保護的業(yè)務(wù)邏輯處理 if (StringUtils.isEmpty(a)) { // Sentinel 默認只會統(tǒng)計BlockException & BlockException的子類,如果想統(tǒng)計其他異常信息,添加Tracer throw new IllegalArgumentException("A is not empty."); } return a; // block Exception: 如果被保護的資源被限流或者降級了,就會拋異常出去 } catch (BlockException e) { log.error("我被限流啦??!{}", e); return "我被限流啦!!"; } catch (IllegalArgumentException argEx) { // 統(tǒng)計當前異常發(fā)生次數(shù) / 占比 Tracer.trace(argEx); return "非法參數(shù)信息"; } finally { if (entry != null) { entry.exit(); } } }Sentinel Annotation
源碼:com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect & com.alibaba.csp.sentinel.annotation.aspectj.AbstractSentinelAspectSupport
SentinelResource 使用該注解重構(gòu)上述方法
@GetMapping("/test-sentinel-resource") @SentinelResource(value = "test-sentinel-api", blockHandler = "blockException", fallback = "fallback") public String testSentinelResource(@RequestParam(required = false) String a) { // ...被保護的業(yè)務(wù)邏輯處理 if (StringUtils.isEmpty(a)) { // Sentinel 默認只會統(tǒng)計BlockException & BlockException的子類,如果想統(tǒng)計其他異常信息,添加Tracer throw new IllegalArgumentException("A is not empty."); } return a; } /** * testSentinelResource BlockException method */ public String blockException(String a, BlockException e) { log.error("限流了,{}", e); return "blockHandler 對應(yīng)《限流規(guī)則》"; } /** * testSentinelResource fallback method * {@link SentinelResource} #fallback 在< 1.6的版本中,不能補貨BlockException */ public String fallback(String a) { return "fallback 對應(yīng)《降級規(guī)則》"; }RestTemplate 整合Sentinel
使用 @SentinelRestTemplate.
resttemplate.sentinel.enabled可以開關(guān)是否啟用該注解。(開發(fā)階段很有意義。)
源碼:com.springframework.cloud.alibaba.sentinel.custom.SentinelBeanPostProcessor
@Bean @LoadBalanced @SentinelRestTemplate public RestTemplate restTemplate() { return new RestTemplate(); } @Autowired private RestTemplate restTemplate; ...Feign整合 Sentinel
配置文件中添加 feign.sentinel.enabled: true來開啟
編寫fallback 類,實現(xiàn)feign client
@Component public class UserCenterFeignClientFallback implements IUserCenterFeignClient { @Override public UserDTO findById(Long userId) { UserDTO userDTO = new UserDTO(); userDTO.setWxNickname("默認用戶"); return userDTO; } } @Slf4j @Component public class UserCenterFeignClientFallbackFactory implements FallbackFactory{ @Override public IUserCenterFeignClient create(Throwable cause) { return new IUserCenterFeignClient() { @Override public UserDTO findById(Long userId) { log.warn("遠程調(diào)用被限流/降級,{}", cause); UserDTO userDTO = new UserDTO(); userDTO.setWxNickname("默認用戶"); return userDTO; } }; } }
應(yīng)用fallback class
/** * IUserCenterFeignClient for 定義 user-center feign client * fallbackFactory 可以拿到異常信息 * fallback 無法拿到異常信息 * * @author Isaac.Zhang | 若初 * @since 2019/7/15 */ @FeignClient(name = "user-center", // fallback = UserCenterFeignClientFallback.class, fallbackFactory = UserCenterFeignClientFallbackFactory.class ) public interface IUserCenterFeignClient { @GetMapping(path = "/users/{userId}") public UserDTO findById(@PathVariable Long userId); }
啟動應(yīng)用,設(shè)置流控規(guī)則,結(jié)果展示如下
{ id: 1, ... wxNickName: "默認用戶" }
源碼:org.springframework.cloud.alibaba.sentinel.feign.SentinelFeign
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/75492.html
摘要:前面我們都是直接通過集成的依賴,通過編碼的方式配置規(guī)則等。對于集成到中阿里已經(jīng)有了一套開源框架,就是用于將一系列的框架成功的整合到中。但這也是在學(xué)習(xí)過程中遇到的一個問題,還是得通過調(diào)試源碼的方式去發(fā)現(xiàn)問題的原因。 前面我們都是直接通過集成sentinel的依賴,通過編碼的方式配置規(guī)則等。對于集成到Spring Cloud中阿里已經(jīng)有了一套開源框架spring-cloud-alibaba...
摘要:介紹隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。以流量為切入點,從流量控制熔斷降級系統(tǒng)負載保護等多個維度保護服務(wù)的穩(wěn)定性。完備的實時監(jiān)控同時提供實時的監(jiān)控功能。您只需要引入相應(yīng)的依賴并進行簡單的配置即可快速地接入。 Sentinel 介紹 隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。 Sentinel 以流量為切入點,從流量控制、熔斷降級、系統(tǒng)負載保護等多個維度...
摘要:在之前的練習(xí)中,只要應(yīng)用重啟,就需要重新配置,這樣在我們實際的項目是非常不實用的,那么有沒有辦法把我們配置的規(guī)則保存下來呢答案是,那么接下來,給大家來介紹如何將規(guī)則持久化。重新啟動測試效果添加流控規(guī)則查看同步的配置 在之前的練習(xí)中,只要應(yīng)用重啟,就需要重新配置,這樣在我們實際的項目是非常不實用的,那么有沒有辦法把我們配置的規(guī)則保存下來呢?答案是YES,那么接下來,給大家來介紹如何將Se...
摘要:在之后,也終于發(fā)布了最新的版本。該版本距離上一次發(fā)布,過去了整整個月下面就隨我一起看看,這個大家期待已久的版本都有哪些內(nèi)容值得我們關(guān)注。如果是用戶,同時也是阿里云這些產(chǎn)品的用戶,那么直接使用還是非常方便的。 在Nacos 1.0.0 Release之后,Spring Cloud Alibaba也終于發(fā)布了最新的版本。該版本距離上一次發(fā)布,過去了整整4個月!下面就隨我一起看看,這個大家期...
摘要:得到得到類得到類得到調(diào)用的服務(wù)名稱檢查和屬性省略部分代碼中的方法里面進行熔斷限流的處理。在的方法中進行的包裝。 Spring Cloud Alibaba Sentinel 除了對 RestTemplate 做了支持,同樣對于 Feign 也做了支持,如果我們要從 Hystrix 切換到 Sentinel 是非常方便的,下面來介紹下如何對 Feign 的支持以及實現(xiàn)原理。 集成 Feig...
閱讀 2916·2023-04-25 19:08
閱讀 1416·2021-11-16 11:45
閱讀 1964·2021-10-13 09:40
閱讀 4127·2021-09-30 09:47
閱讀 2415·2019-08-30 15:44
閱讀 2261·2019-08-30 13:03
閱讀 1386·2019-08-30 12:56
閱讀 1889·2019-08-26 14:04