国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring Cloud Alibaba整合Sentinel流控

ytwman / 2974人閱讀

摘要:前面我們都是直接通過集成的依賴,通過編碼的方式配置規則等。對于集成到中阿里已經有了一套開源框架,就是用于將一系列的框架成功的整合到中。但這也是在學習過程中遇到的一個問題,還是得通過調試源碼的方式去發現問題的原因。

前面我們都是直接通過集成sentinel的依賴,通過編碼的方式配置規則等。對于集成到Spring Cloud中阿里已經有了一套開源框架spring-cloud-alibaba,就是用于將一系列的框架成功的整合到Spring Cloud中。

我這邊Spring Cloud的版本是Finchley.SR2,Spring Boot的版本是2.0.6.RELEASE,下面開始集成步驟。

1. 整合步驟 1.1添加Maven依賴

    org.springframework.cloud
    spring-cloud-starter-alibaba-sentinel
    0.2.1.RELEASE
1.2 增加限流的配置

application.properties

# 文件規則數據源
spring.cloud.sentinel.datasource.ds1.file.file=classpath: flowrule.json
# JSON格式的數據
spring.cloud.sentinel.datasource.ds1.file.data-type=json
# 規則類型
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 回退內容定義
public class ExceptionUtil {
    public static String handleException(BlockException ex) {
        return "扛不住了啊....";
    }
}

前面我們使用注解的話都是手動配置SentinelResourceAspect類,為什么今天不需要配置SentinelResourceAspect呢?

那是因為在spring-cloud-alibaba中已經默認配置好了,代碼在org.springframework.cloud.alibaba.sentinel.custom.SentinelAutoConfiguration中,代碼如下:

@Bean
@ConditionalOnMissingBean
public SentinelResourceAspect sentinelResourceAspect() {
    return new SentinelResourceAspect();
}
2. 整合Apollo持久化規則

利用spring-cloud-alibaba整合Apollo就比較簡單了,直接通過配置就可以,不需要通過編碼的方式手動注冊動態數據源。

2.1 增加Apollo的Maven依賴

    com.alibaba.csp
    sentinel-datasource-apollo
    1.4.1
2.2 數據源配置
# Apollo命名空間
spring.cloud.sentinel.datasource.ds4.apollo.namespace-name = application
# 規則配置Key
spring.cloud.sentinel.datasource.ds4.apollo.flow-rules-key = flowRules
# 規則配置默認值
spring.cloud.sentinel.datasource.ds4.apollo.default-flow-rule-value = []
# 規則類型
spring.cloud.sentinel.datasource.ds4.apollo.rule-type = flow
2.3 Apollo相關的配置

關于Apollo的地址,appid等信息可以在配置文件中添加,我們為了演示方便就還是使用代碼指定的方式。

@SpringBootApplication
public class SentinelApp {
    public static void main(String[] args) {
        // Apollo 中的應用名稱,自己定義的
        String appId = "SampleApp";
        // Apollo 的地址
        String apolloMetaServerAddress = "http://localhost:8080";
        System.setProperty("app.id", appId);
        System.setProperty("apollo.meta", apolloMetaServerAddress);
        // 指定環境
        System.setProperty("env", "DEV");
        SpringApplication.run(SentinelApp.class, args);
    }
}
2.4 測試

在Apollo中添加限流的規則即可,比如:

flowRules = [{"grade":1,"count":1,"resource":"hello","controlBehavior":0}]

在org.springframework.cloud.alibaba.sentinel.datasource.converter.JsonConverter中打個端點調試下,啟動時或者配置更新時都會在里面進行規則的轉換。

在這邊遇到了一個坑跟大家分享一下,最開始我配置了最簡單的規則,就下面三個Key

flowRules = [{"grade":1,"count":1,"resource":"hello"}]

如果配置成上面的三個Key,限流將不會觸發,后面自己調試JsonConverter中的代碼才發現了原因。

有這么一段代碼,是根據配置中心的json字符串轉換成對應的規則類:

List rules = Arrays.asList(convertFlowRule(itemJson),
                        convertDegradeRule(itemJson), convertSystemRule(itemJson),
                        convertAuthorityRule(itemJson), convertParamFlowRule(itemJson));

轉換完了后會進行過濾,得到一個最終的List,然后判斷數量,只有為1的時候才是正確的,由于我配置上面的規則,然后得出來的convertRuleList里面數量為2,這樣就沒法返回正確的規則。

List convertRuleList = 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));
}

之所有數量為2是因為上面轉換代碼的convertFlowRule(itemJson)和convertParamFlowRule(itemJson),這兩個轉換的問題,由于我的配置只有三個key,而這三個Key又是這兩個規則共同的,所以都轉換成功了才導致數量為2。解決辦法就是加一些獨有的Key,比如controlBehavior。

當然這個問題如果我們對接了控制臺的話,通過控制臺去修改配置中心的值就不會出現這個問題了。但這也是在學習過程中遇到的一個問題,還是得通過調試源碼的方式去發現問題的原因。

歡迎加入我的知識星球,一起交流技術,免費學習猿天地的課程(http://cxytiandi.com/course) PS:目前星球中正在星主的帶領下組隊學習Sentinel,等你哦!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74221.html

相關文章

  • Spring Cloud Alibaba基礎教程:Sentinel使用Nacos存儲規則

    摘要:所以,在整合了做規則存儲之后,需要知道在下面兩個地方修改存在不同的效果控制臺中修改規則僅存在于服務的內存中,不會修改中的配置值,重啟后恢復原來的值。控制臺中修改規則服務的內存中規則會更新,中持久化規則也會更新,重啟后依然保持。 通過上一篇《使用Sentinel實現接口限流》的介紹,相信大家對Sentinel已經有了初步的認識。在Spring Cloud Alibaba的整合封裝之下,接...

    xingqiba 評論0 收藏0
  • Spring Cloud Alibaba基礎教程:使用Sentinel實現接口限流

    摘要:但是比較可惜的是已經宣布對停止更新。客戶端整合每個微服務客戶端都需要整合的客戶端封裝與配置,才能將監控信息上報給展示以及實時的更改限流或熔斷規則等。下面我們就分兩部分來看看,如何使用來實現接口限流。 最近管點閑事浪費了不少時間,感謝網友libinwalan的留言提醒。及時糾正路線,繼續跟大家一起學習Spring Cloud Alibaba。 Nacos作為注冊中心和配置中心的基礎教程,...

    stefanieliang 評論0 收藏0
  • Sentinel Dashboard中修改規則同步到Apollo存儲

    摘要:在之前的兩篇教程中我們分別介紹了如何將的限流規則存儲到和中。本文以存儲為例,下一篇介紹的改在示例。但是由于考慮到與的結合使用,略作修改。 在之前的兩篇教程中我們分別介紹了如何將Sentinel的限流規則存儲到Nacos和Apollo中。同時,在文末的思考中,我都指出了這兩套整合方案都存在一個不足之處:不論采用什么配置中心,限流規則都只能通過Nacos界面或Apollo界面來完成修改才能...

    psychola 評論0 收藏0
  • [Spring-Cloud-Alibaba] Sentinel 整合RestTemplate &am

    摘要:開發階段很有意義。源碼整合配置文件中添加來開啟編寫類,實現默認用戶遠程調用被限流降級,默認用戶應用定義可以拿到異常信息無法拿到異常信息若初啟動應用,設置流控規則,結果展示如下默認用戶源碼 Sentinel API Github : WIKI Sphu (指明要保護的資源名稱) Tracer (指明調用來源,異常統計接口) ContextUtil(標示進入調用鏈入口) 流控規則(針...

    libin19890520 評論0 收藏0
  • Spring Cloud Alibaba基礎教程:Sentinel使用Apollo存儲規則

    摘要:上一篇我們介紹了如何通過的配置功能來存儲限流規則。第六步啟動應用。深入思考在使用存儲規則配置的時候與存儲一樣,對于控制臺這些數據是只讀的,也就是說控制臺中修改規則僅存在于服務的內存中,不會修改中的配置值,重啟后恢復原來的值。 上一篇我們介紹了如何通過Nacos的配置功能來存儲限流規則。Apollo是國內用戶非常多的配置中心,所以,今天我們繼續說說Spring Cloud Alibaba...

    Airmusic 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<