微服務當前這么火爆的程度,如果不能學會一種微服務框架技術。怎么能升職加薪,增加簡歷的籌碼?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 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方法里面拋出異常。不進行捕獲,會導致程序直接退出
我們重啟啟動程序。看一下
思考一下,如果在配置中心修改規則以后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 方式 不保證一致性;規則保存在內存中,重啟即消失。嚴重不建議用於生產環境
往期資料、參考資料
摘自參考 spring cloud 官方文檔
服務器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 alibaba網關 sentinel zuul 四 限流熔斷
Spring Cloud gateway 網關服務二 斷言、過濾器
Spring Cloud gateway 三 自定義過濾器GatewayFilter
Spring Cloud gateway 五 Sentinel整合
如何喜歡可以關注分享本公眾號。
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。轉載請附帶公眾號二維碼