Spring Cloud gateway 六 Sentinel nacos存儲動態刷新

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

### Sentinel規則

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

經過 API 直接修改 (loadRules)
經過 DataSource 適配不一樣數據源修改
手動經過 API 修改比較直觀,能夠經過如下幾個 API 修改不一樣的規則:git

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

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

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

### DataSource 擴展

上述 loadRules() 方法只接受內存態的規則對象,但更多時候規則存儲在文件、數據庫或者配置中心當中。DataSource 接口給咱們提供了對接任意配置源的能力。相比直接經過 API 修改規則,實現 DataSource 接口是更加可靠的作法。數據庫

推薦經過控制檯設置規則後將規則推送到統一的規則中心,客戶端實現 ReadableDataSource 接口端監聽規則中心實時獲取變動,流程以下: api

file

DataSource 擴展常見的實現方式有:服務器

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

Sentinel 目前支持如下數據源擴展:併發

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

由於是註冊中心和配置中心 都使用的nacos。這裏也只介紹nacos 的使用方式。app

整合代碼修改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
file

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

啓動服務

查看啓動臺sentinel

file

若是須要動態修改。直接修改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 xianliru@163.com
 * @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方法裏面拋出異常。不進行捕獲,會致使程序直接退出

咱們重啓啓動程序。看一下

file

思考一下,若是在配置中心修改規則之後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控制檯
file

在以前經過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整合

如何喜歡能夠關注分享本公衆號。
file

相關文章
相關標籤/搜索