1. 程式人生 > >Spring Cloud gateway 六 Sentinel nacos儲存動態重新整理

Spring Cloud gateway 六 Sentinel nacos儲存動態重新整理

微服務當前這麼火爆的程度,如果不能學會一種微服務框架技術。怎麼能升職加薪,增加簡歷的籌碼?spring cloud 和 Dubbo 需要單獨學習。說沒有時間?沒有精力?要學倆個框架?而Spring Cloud alibaba只需要你學會一個就會擁有倆種微服務治理框架技術。何樂而不為呢?加油吧!騷猿年

### Sentinel規則

Sentinel 的理念是開發者只需要關注資源的定義,當資源定義成功後可以動態增加各種流控降級規則。Sentinel 提供兩種方式修改規則:

通過 API 直接修改 (loadRules)
通過 DataSource 適配不同資料來源修改
手動通過 API 修改比較直觀,可以通過以下幾個 API 修改不同的規則:

FlowRuleManager.loadRules(List<FlowRule> rules); // 修改流控規則
DegradeRuleManager.loadRules(List<DegradeRule> rules); // 修改降級規則

特別注意一下這倆個方法。後面會拿一個做案例說明

手動修改規則(硬編碼方式)一般僅用於測試和演示,生產上一般通過動態規則源的方式來動態管理規則。

### DataSource 擴充套件

上述 loadRules() 方法只接受記憶體態的規則物件,但更多時候規則儲存在檔案、資料庫或者配置中心當中。DataSource 介面給我們提供了對接任意配置源的能力。相比直接通過 API 修改規則,實現 DataSource 介面是更加可靠的做法。

推薦通過控制檯設定規則後將規則推送到統一的規則中心,客戶端實現 ReadableDataSource 介面端監聽規則中心實時獲取變更,流程如下:

DataSource 擴充套件常見的實現方式有:

  • 拉模式:客戶端主動向某個規則管理中心定期輪詢拉取規則,這個規則中心可以是 RDBMS、檔案,甚至是 VCS 等。這樣做的方式是簡單,缺點是無法及時獲取變更;
  • 推模式:規則中心統一推送,客戶端通過註冊監聽器的方式時刻監聽變化,比如使用 Nacos、Zookeeper 等配置中心。這種方式有更好的實時性和一致性保證。

Sentinel 目前支援以下資料來源擴充套件:

  • Pull-based: 檔案、Consul (since 1.7.0)
  • Push-based: ZooKeeper, Redis, Nacos, Apollo

因為是註冊中心和配置中心 都使用的nacos。這裡也只介紹nacos 的使用方式。

整合程式碼修改pom 引入jar

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

修改yml 配置檔案。新增DataSource支援

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8890
        port: 8719
      eager: true
      datasource:
        na:
          nacos:
            server-addr: 47.99.209.72:8848
            groupId: DEFAULT_GROUP
            dataId: ${spring.application.name}-${spring.profiles.active}-sentinel
            rule-type: flow

nacos配置中心建立檔案 cloud-gateway-demo-dev-sentinel

[
    {
        "resource": "/api",
        "limitApp": "default",
        "grade": 1,
        "count": 5,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]

啟動服務

檢視啟動臺sentinel

如果需要動態修改。直接修改nacos對應配置檔案。在進行釋出,Sentinel 就會隨著動態更新
這個就不帶大家去做這個實驗了。

還有一種情況 就是上面提高的 手動api方式修改。官方並不推薦

FlowRuleManager.loadRules(List<FlowRule> rules); // 修改流控規則

這種方案這裡也實現一下

很簡單隻要增加一個ApplicationRunner 實現類就可以完成

package com.xian.cloud.runner;

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * <Description>
 *
 * @author [email protected]
 * @version 1.0
 * @createDate 2019/11/12 11:18
 */
@Component
@Slf4j
public class FlowRuleRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        try {
            List<FlowRule> rules = FlowRuleManager.getRules();
            if(rules == null ){
                rules = new ArrayList<>();
            }
            FlowRule flowRule = new FlowRule("/refreshRoutes");
            flowRule.setCount(5).setClusterMode(false).setControlBehavior(0);
            flowRule.setLimitApp("default");
            rules.add(flowRule);
            log.info("FlowRuleRunner loadRules reules:{}  ",rules);
            FlowRuleManager.loadRules(rules);
        }catch (Exception e){
            log.error("FlowRuleRunner 載入異常 :{}",e.getMessage());
        }
    }
}

這裡需要要注意下ApplicationRunner 是在專案啟動完成之後做的一些事情。如果在run方法裡面丟擲異常。不進行捕獲,會導致程式直接退出

我們重啟啟動程式。看一下

思考一下,如果在配置中心修改規則以後refreshRoutes 這個限流規則還會存在麼?

現在實驗一下,將nacos api修改為test 併發布。

程式日誌

2019-11-13 10:23:07.426  INFO 43912 --- [.99.209.72_8848] c.a.n.client.config.impl.ClientWorker    : [fixed-47.99.209.72_8848] [polling-resp] config changed. dataId=cloud-gateway-demo-dev-sentinel, group=DEFAULT_GROUP
2019-11-13 10:23:07.535  INFO 43912 --- [.99.209.72_8848] c.a.n.client.config.impl.ClientWorker    : [fixed-47.99.209.72_8848] [data-received] dataId=cloud-gateway-demo-dev-sentinel, group=DEFAULT_GROUP, tenant=null, md5=b03e221f14293f3274788cbdb24a44b4, content=[
    {
        "resource": "/test",
        "limitApp": "default",
        "grade": 1,
        "cou...
2019-11-13 10:23:07.535  INFO 43912 --- [.99.209.72_8848] c.a.nacos.client.config.impl.CacheData   : [fixed-47.99.209.72_8848] [notify-listener] time cost=0ms in ClientWorker, dataId=cloud-gateway-demo-dev-sentinel, group=DEFAULT_GROUP, md5=b03e221f14293f3274788cbdb24a44b4, listener=com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource$1@10b4e985 
2019-11-13 10:23:07.538  INFO 43912 --- [update-thread-1] c.a.nacos.client.config.impl.CacheData   : [fixed-47.99.209.72_8848] [notify-ok] dataId=cloud-gateway-demo-dev-sentinel, group=DEFAULT_GROUP, md5=b03e221f14293f3274788cbdb24a44b4, listener=com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource$1@10b4e985 

來看一下 Sentinel控制檯

在之前通過ApplicationRunner 注入的規則消失了。

反思

  • 如果程式上選中DataSource方式儲存動態的限流規則等。就不能在使用官方提供各種工具類載入規則xxx.loadRules。因為動態重新整理一次,儲存在記憶體裡面的規則就會清空。

  • 手動API 方式 不保證一致性;規則儲存在記憶體中,重啟即消失。嚴重不建議用於生產環境

往期資料、參考資料

Sentinel 官方文件地址

摘自參考 spring cloud 官方文件

Spring Cloud alibaba 官網地址

示例程式碼地址

伺服器nacos 地址 http://47.99.209.72:8848/nacos

往期地址 spring cloud alibaba 地址

spring cloud alibaba 簡介

Spring Cloud Alibaba (nacos 註冊中心搭建)

Spring Cloud Alibaba 使用nacos 註冊中心

Spring Cloud Alibaba nacos 配置中心使用

spring cloud 閘道器服務

Spring Cloud zuul閘道器服務 一

Spring Cloud 閘道器服務 zuul 二

Spring Cloud 閘道器服務 zuul 三 動態路由

Spring Cloud alibaba閘道器 sentinel zuul 四 限流熔斷

Spring Cloud gateway 閘道器服務 一

Spring Cloud gateway 閘道器服務二 斷言、過濾器

Spring Cloud gateway 三 自定義過濾器GatewayFilter

Spring Cloud gateway 閘道器四 動態路由

Spring Cloud gateway 五 Sentinel整合

如何喜歡可以關注分享本公眾號。

版權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本宣告。轉載請附帶公眾號二維