摘要:前面我們都是直接通過集成的依賴,通過編碼的方式配置規(guī)則等。對(duì)于集成到中阿里已經(jīng)有了一套開源框架,就是用于將一系列的框架成功的整合到中。但這也是在學(xué)習(xí)過程中遇到的一個(gè)問題,還是得通過調(diào)試源碼的方式去發(fā)現(xiàn)問題的原因。
前面我們都是直接通過集成sentinel的依賴,通過編碼的方式配置規(guī)則等。對(duì)于集成到Spring Cloud中阿里已經(jīng)有了一套開源框架spring-cloud-alibaba,就是用于將一系列的框架成功的整合到Spring Cloud中。
我這邊Spring Cloud的版本是Finchley.SR2,Spring Boot的版本是2.0.6.RELEASE,下面開始集成步驟。
1. 整合步驟 1.1添加Maven依賴1.2 增加限流的配置org.springframework.cloud spring-cloud-starter-alibaba-sentinel 0.2.1.RELEASE
application.properties
# 文件規(guī)則數(shù)據(jù)源 spring.cloud.sentinel.datasource.ds1.file.file=classpath: flowrule.json # JSON格式的數(shù)據(jù) spring.cloud.sentinel.datasource.ds1.file.data-type=json # 規(guī)則類型 spring.cloud.sentinel.datasource.ds1.file.rule-type=flow
flowrule.json
[ { "resource": "hello", "controlBehavior": 0, "count": 1, "grade": 1, "limitApp": "default", "strategy": 0 } ]1.3 @SentinelResource使用
@GetMapping("/test") @SentinelResource(value="hello",blockHandler="handleException",blockHandlerClass=ExceptionUtil.class) public String test() { String result = restTemplate.getForObject("http://localhost:8087/user/name", String.class); return result; }1.4 回退內(nèi)容定義
public class ExceptionUtil { public static String handleException(BlockException ex) { return "扛不住了啊...."; } }
前面我們使用注解的話都是手動(dòng)配置SentinelResourceAspect類,為什么今天不需要配置SentinelResourceAspect呢?
那是因?yàn)樵趕pring-cloud-alibaba中已經(jīng)默認(rèn)配置好了,代碼在org.springframework.cloud.alibaba.sentinel.custom.SentinelAutoConfiguration中,代碼如下:
@Bean @ConditionalOnMissingBean public SentinelResourceAspect sentinelResourceAspect() { return new SentinelResourceAspect(); }2. 整合Apollo持久化規(guī)則
利用spring-cloud-alibaba整合Apollo就比較簡(jiǎn)單了,直接通過配置就可以,不需要通過編碼的方式手動(dòng)注冊(cè)動(dòng)態(tài)數(shù)據(jù)源。
2.1 增加Apollo的Maven依賴2.2 數(shù)據(jù)源配置com.alibaba.csp sentinel-datasource-apollo 1.4.1
# Apollo命名空間 spring.cloud.sentinel.datasource.ds4.apollo.namespace-name = application # 規(guī)則配置Key spring.cloud.sentinel.datasource.ds4.apollo.flow-rules-key = flowRules # 規(guī)則配置默認(rèn)值 spring.cloud.sentinel.datasource.ds4.apollo.default-flow-rule-value = [] # 規(guī)則類型 spring.cloud.sentinel.datasource.ds4.apollo.rule-type = flow2.3 Apollo相關(guān)的配置
關(guān)于Apollo的地址,appid等信息可以在配置文件中添加,我們?yōu)榱搜菔痉奖憔瓦€是使用代碼指定的方式。
@SpringBootApplication public class SentinelApp { public static void main(String[] args) { // Apollo 中的應(yīng)用名稱,自己定義的 String appId = "SampleApp"; // Apollo 的地址 String apolloMetaServerAddress = "http://localhost:8080"; System.setProperty("app.id", appId); System.setProperty("apollo.meta", apolloMetaServerAddress); // 指定環(huán)境 System.setProperty("env", "DEV"); SpringApplication.run(SentinelApp.class, args); } }2.4 測(cè)試
在Apollo中添加限流的規(guī)則即可,比如:
flowRules = [{"grade":1,"count":1,"resource":"hello","controlBehavior":0}]
在org.springframework.cloud.alibaba.sentinel.datasource.converter.JsonConverter中打個(gè)端點(diǎn)調(diào)試下,啟動(dòng)時(shí)或者配置更新時(shí)都會(huì)在里面進(jìn)行規(guī)則的轉(zhuǎn)換。
在這邊遇到了一個(gè)坑跟大家分享一下,最開始我配置了最簡(jiǎn)單的規(guī)則,就下面三個(gè)Key
flowRules = [{"grade":1,"count":1,"resource":"hello"}]
如果配置成上面的三個(gè)Key,限流將不會(huì)觸發(fā),后面自己調(diào)試JsonConverter中的代碼才發(fā)現(xiàn)了原因。
有這么一段代碼,是根據(jù)配置中心的json字符串轉(zhuǎn)換成對(duì)應(yīng)的規(guī)則類:
Listrules = Arrays.asList(convertFlowRule(itemJson), convertDegradeRule(itemJson), convertSystemRule(itemJson), convertAuthorityRule(itemJson), convertParamFlowRule(itemJson));
轉(zhuǎn)換完了后會(huì)進(jìn)行過濾,得到一個(gè)最終的List,然后判斷數(shù)量,只有為1的時(shí)候才是正確的,由于我配置上面的規(guī)則,然后得出來的convertRuleList里面數(shù)量為2,這樣就沒法返回正確的規(guī)則。
ListconvertRuleList = rules.stream() .filter(rule -> !ObjectUtils.isEmpty(rule)) .collect(Collectors.toList()); if (convertRuleList.size() == 0) { logger.warn( "Sentinel JsonConverter can not convert {} to any rules, ignore", itemJson); } else if (convertRuleList.size() > 1) { logger.warn( "Sentinel JsonConverter convert {} and match multi rules, ignore", itemJson); } else { ruleList.add(convertRuleList.get(0)); }
之所有數(shù)量為2是因?yàn)樯厦孓D(zhuǎn)換代碼的convertFlowRule(itemJson)和convertParamFlowRule(itemJson),這兩個(gè)轉(zhuǎn)換的問題,由于我的配置只有三個(gè)key,而這三個(gè)Key又是這兩個(gè)規(guī)則共同的,所以都轉(zhuǎn)換成功了才導(dǎo)致數(shù)量為2。解決辦法就是加一些獨(dú)有的Key,比如controlBehavior。
當(dāng)然這個(gè)問題如果我們對(duì)接了控制臺(tái)的話,通過控制臺(tái)去修改配置中心的值就不會(huì)出現(xiàn)這個(gè)問題了。但這也是在學(xué)習(xí)過程中遇到的一個(gè)問題,還是得通過調(diào)試源碼的方式去發(fā)現(xiàn)問題的原因。
歡迎加入我的知識(shí)星球,一起交流技術(shù),免費(fèi)學(xué)習(xí)猿天地的課程(http://cxytiandi.com/course) PS:目前星球中正在星主的帶領(lǐng)下組隊(duì)學(xué)習(xí)Sentinel,等你哦!文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/74221.html
摘要:所以,在整合了做規(guī)則存儲(chǔ)之后,需要知道在下面兩個(gè)地方修改存在不同的效果控制臺(tái)中修改規(guī)則僅存在于服務(wù)的內(nèi)存中,不會(huì)修改中的配置值,重啟后恢復(fù)原來的值。控制臺(tái)中修改規(guī)則服務(wù)的內(nèi)存中規(guī)則會(huì)更新,中持久化規(guī)則也會(huì)更新,重啟后依然保持。 通過上一篇《使用Sentinel實(shí)現(xiàn)接口限流》的介紹,相信大家對(duì)Sentinel已經(jīng)有了初步的認(rèn)識(shí)。在Spring Cloud Alibaba的整合封裝之下,接...
摘要:但是比較可惜的是已經(jīng)宣布對(duì)停止更新。客戶端整合每個(gè)微服務(wù)客戶端都需要整合的客戶端封裝與配置,才能將監(jiān)控信息上報(bào)給展示以及實(shí)時(shí)的更改限流或熔斷規(guī)則等。下面我們就分兩部分來看看,如何使用來實(shí)現(xiàn)接口限流。 最近管點(diǎn)閑事浪費(fèi)了不少時(shí)間,感謝網(wǎng)友libinwalan的留言提醒。及時(shí)糾正路線,繼續(xù)跟大家一起學(xué)習(xí)Spring Cloud Alibaba。 Nacos作為注冊(cè)中心和配置中心的基礎(chǔ)教程,...
摘要:在之前的兩篇教程中我們分別介紹了如何將的限流規(guī)則存儲(chǔ)到和中。本文以存儲(chǔ)為例,下一篇介紹的改在示例。但是由于考慮到與的結(jié)合使用,略作修改。 在之前的兩篇教程中我們分別介紹了如何將Sentinel的限流規(guī)則存儲(chǔ)到Nacos和Apollo中。同時(shí),在文末的思考中,我都指出了這兩套整合方案都存在一個(gè)不足之處:不論采用什么配置中心,限流規(guī)則都只能通過Nacos界面或Apollo界面來完成修改才能...
摘要:開發(fā)階段很有意義。源碼整合配置文件中添加來開啟編寫類,實(shí)現(xiàn)默認(rèn)用戶遠(yuǎn)程調(diào)用被限流降級(jí),默認(rèn)用戶應(yīng)用定義可以拿到異常信息無法拿到異常信息若初啟動(dòng)應(yīng)用,設(shè)置流控規(guī)則,結(jié)果展示如下默認(rèn)用戶源碼 Sentinel API Github : WIKI Sphu (指明要保護(hù)的資源名稱) Tracer (指明調(diào)用來源,異常統(tǒng)計(jì)接口) ContextUtil(標(biāo)示進(jìn)入調(diào)用鏈入口) 流控規(guī)則(針...
摘要:上一篇我們介紹了如何通過的配置功能來存儲(chǔ)限流規(guī)則。第六步啟動(dòng)應(yīng)用。深入思考在使用存儲(chǔ)規(guī)則配置的時(shí)候與存儲(chǔ)一樣,對(duì)于控制臺(tái)這些數(shù)據(jù)是只讀的,也就是說控制臺(tái)中修改規(guī)則僅存在于服務(wù)的內(nèi)存中,不會(huì)修改中的配置值,重啟后恢復(fù)原來的值。 上一篇我們介紹了如何通過Nacos的配置功能來存儲(chǔ)限流規(guī)則。Apollo是國內(nèi)用戶非常多的配置中心,所以,今天我們繼續(xù)說說Spring Cloud Alibaba...
閱讀 3897·2021-09-27 13:35
閱讀 1081·2021-09-24 09:48
閱讀 2910·2021-09-22 15:42
閱讀 2349·2021-09-22 15:28
閱讀 3154·2019-08-30 15:43
閱讀 2623·2019-08-30 13:52
閱讀 2979·2019-08-29 12:48
閱讀 1458·2019-08-26 13:55