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