微服務(wù)當前這么火爆的程度,如果不能學(xué)會一種微服務(wù)框架技術(shù)。怎么能升職加薪,增加簡歷的籌碼?spring cloud 和 Dubbo 需要單獨學(xué)習(xí)。說沒有時間?沒有精力?要學(xué)倆個框架?而Spring Cloud alibaba只需要你學(xué)會一個就會擁有倆種微服務(wù)治理框架技術(shù)。何樂而不為呢?加油吧!騷猿年
Sentinel規(guī)則
Sentinel 的理念是開發(fā)者只需要關(guān)注資源的定義,當資源定義成功后可以動態(tài)增加各種流控降級規(guī)則。Sentinel 提供兩種方式修改規(guī)則:
通過 API 直接修改 (loadRules)
通過 DataSource 適配不同數(shù)據(jù)源修改
手動通過 API 修改比較直觀,可以通過以下幾個 API 修改不同的規(guī)則:
FlowRuleManager.loadRules(List<FlowRule> rules); // 修改流控規(guī)則
DegradeRuleManager.loadRules(List<DegradeRule> rules); // 修改降級規(guī)則
特別注意一下這倆個方法。后面會拿一個做案例說明
手動修改規(guī)則(硬編碼方式)一般僅用于測試和演示,生產(chǎn)上一般通過動態(tài)規(guī)則源的方式來動態(tài)管理規(guī)則。
DataSource 擴展
上述 loadRules() 方法只接受內(nèi)存態(tài)的規(guī)則對象,但更多時候規(guī)則存儲在文件、數(shù)據(jù)庫或者配置中心當中。DataSource 接口給我們提供了對接任意配置源的能力。相比直接通過 API 修改規(guī)則,實現(xiàn) DataSource 接口是更加可靠的做法。
***推薦通過控制臺設(shè)置規(guī)則后將規(guī)則推送到統(tǒng)一的規(guī)則中心,客戶端實現(xiàn) ReadableDataSource 接口端監(jiān)聽規(guī)則中心實時獲取變更,流程如下: ***

DataSource 擴展常見的實現(xiàn)方式有:
- 拉模式:客戶端主動向某個規(guī)則管理中心定期輪詢拉取規(guī)則,這個規(guī)則中心可以是 RDBMS、文件,甚至是 VCS 等。這樣做的方式是簡單,缺點是無法及時獲取變更;
- 推模式:規(guī)則中心統(tǒng)一推送,客戶端通過注冊監(jiān)聽器的方式時刻監(jiān)聽變化,比如使用 Nacos、Zookeeper 等配置中心。這種方式有更好的實時性和一致性保證。
Sentinel 目前支持以下數(shù)據(jù)源擴展:
- 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配置中心創(chuàng)建文件 cloud-gateway-demo-dev-sentinel

[
{
"resource": "/api",
"limitApp": "default",
"grade": 1,
"count": 5,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
啟動服務(wù)
查看啟動臺sentinel

如果需要動態(tài)修改。直接修改nacos對應(yīng)配置文件。在進行發(fā)布,Sentinel 就會隨著動態(tài)更新
這個就不帶大家去做這個實驗了。
還有一種情況 就是上面提高的 手動api方式修改。官方并不推薦
FlowRuleManager.loadRules(List<FlowRule> rules); // 修改流控規(guī)則
這種方案這里也實現(xiàn)一下
很簡單只要增加一個ApplicationRunner 實現(xiàn)類就可以完成
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方法里面拋出異常。不進行捕獲,會導(dǎo)致程序直接退出
我們重啟啟動程序??匆幌?/p>

思考一下,如果在配置中心修改規(guī)則以后refreshRoutes 這個限流規(guī)則還會存在么?
現(xiàn)在實驗一下,將nacos api修改為test 并發(fā)布。
程序日志
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 注入的規(guī)則消失了。
反思
如果程序上選中DataSource方式存儲動態(tài)的限流規(guī)則等。就不能在使用官方提供各種工具類加載規(guī)則xxx.loadRules。因為動態(tài)刷新一次,存儲在內(nèi)存里面的規(guī)則就會清空。
手動API 方式 不保證一致性;規(guī)則保存在內(nèi)存中,重啟即消失。嚴重不建議用于生產(chǎn)環(huán)境
往期資料、參考資料
摘自參考 spring cloud 官方文檔
Spring Cloud alibaba 官網(wǎng)地址
服務(wù)器nacos 地址 http://47.99.209.72:8848/nacos
往期地址 spring cloud alibaba 地址
Spring Cloud Alibaba (nacos 注冊中心搭建)
Spring Cloud Alibaba 使用nacos 注冊中心
Spring Cloud Alibaba nacos 配置中心使用
spring cloud 網(wǎng)關(guān)服務(wù)
Spring Cloud zuul網(wǎng)關(guān)服務(wù) 一
Spring Cloud 網(wǎng)關(guān)服務(wù) zuul 二
Spring Cloud 網(wǎng)關(guān)服務(wù) zuul 三 動態(tài)路由
Spring Cloud alibaba網(wǎng)關(guān) sentinel zuul 四 限流熔斷
Spring Cloud gateway 網(wǎng)關(guān)服務(wù) 一
Spring Cloud gateway 網(wǎng)關(guān)服務(wù)二 斷言、過濾器
Spring Cloud gateway 三 自定義過濾器GatewayFilter
Spring Cloud gateway 網(wǎng)關(guān)四 動態(tài)路由
Spring Cloud gateway 五 Sentinel整合
如何喜歡可以關(guān)注分享本公眾號。

版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。轉(zhuǎn)載請附帶公眾號二維碼