javascript
java服务限流_SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级
一、基本簡(jiǎn)介
1、概念描述
sentinel 以流量為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性。包括核心的獨(dú)立類(lèi)庫(kù),監(jiān)控臺(tái),豐富的使用場(chǎng)景驗(yàn)證。(這似乎是阿里開(kāi)源組件的一貫作風(fēng),極其有特點(diǎn),且特點(diǎn)很規(guī)律)
基本特性圖:
補(bǔ)刀一句:這種圖很多人可能不在意,但是一般官方給這個(gè)圖就是該中間件的基本使用思路,與核心功能點(diǎn)。
2、基礎(chǔ)性概念
資源管理
資源是sentinel組件中的核心概念之一。應(yīng)用服務(wù)器上腳本,靜態(tài)頁(yè)面,api接口,文件圖片等都可以理解為資源,對(duì)于java開(kāi)發(fā)者而言,api接口就是這里資源的概念。
規(guī)則配置
sentinel組件通過(guò)流控規(guī)則的配置,來(lái)指定允許該資源(api接口)通過(guò)的請(qǐng)求次數(shù),ip黑白名單,應(yīng)用服務(wù)等。
測(cè)試效果
qps:每秒查詢(xún)率,是一臺(tái)服務(wù)器每秒能夠處理的查詢(xún)次數(shù)。
tps:每秒處理事務(wù)數(shù),事務(wù)處理整體傾向于整個(gè)過(guò)程。
二、框架環(huán)境整合
這里的環(huán)境主要整合nacos注冊(cè)中心,feign服務(wù),sentinel哨兵,和sentinel控制臺(tái)。
1、基本依賴(lài)
這里的依賴(lài)需要參考官方文檔,不同的環(huán)境使用不同的依賴(lài),這里主要適配springcloud環(huán)境,所以使用如下包即可。
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
2.1.1.release
2、控制臺(tái)面板
這里直接從github下載一個(gè)控制臺(tái)服務(wù)包即可,也可以自己下載源碼,按照需求修改后自行打包。
java -jar sentinel-dashboard-1.7.1.jar
下載并啟動(dòng)控制臺(tái)服務(wù)。
3、服務(wù)配置
這里主要是把用到的兩個(gè)服務(wù)9001和9002連接到監(jiān)控臺(tái)。
spring:
application:
name: node09-nacos-9001
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
sentinel:
transport:
port: 9001
dashboard: localhost:8080
最下面四行文件是哨兵控制臺(tái)的主要配置,注意剛啟動(dòng)之后控制臺(tái)是看不到連接的,有資源被觸發(fā)之后才能看到。(附一張首頁(yè)效果圖)
三、流量控制
1、基本描述
流量控制(flow control),其原理是監(jiān)控應(yīng)用流量的 qps 或并發(fā)線(xiàn)程數(shù)等指標(biāo),當(dāng)達(dá)到指定的閾值時(shí)對(duì)流量進(jìn)行控制,以避免被瞬時(shí)的流量高峰沖垮,從而保障應(yīng)用的高可用性。
2、限流規(guī)則
限流規(guī)則主要由下面幾個(gè)因素組成。
resource:資源名,即限流規(guī)則的作用對(duì)象,對(duì)于java服務(wù)端開(kāi)發(fā)而言就是執(zhí)行的方法;
count: 限流閾值,單位時(shí)間內(nèi)能按照規(guī)則通過(guò)的請(qǐng)求量;
grade: 限流閾值類(lèi)型,qps 或并發(fā)線(xiàn)程數(shù) ;
limitapp: 流控限制的指定應(yīng)用來(lái)源,若為default則不區(qū)分調(diào)用來(lái)源;
strategy: 調(diào)用關(guān)系限流策略,直連,鏈路等;
controlbehavior: 流量控制效果,直接拒絕、warm up、勻速排隊(duì);
3、基本案例
硬編碼
配置規(guī)則
public class flowruleconfig {
public static void initflowqpsrule(string resourcename) {
list rules = new arraylist<>();
flowrule rule = new flowrule(resourcename);
// 修改這里參數(shù),查看效果
rule.setcount(100);
rule.setgrade(ruleconstant.flow_grade_qps);
rule.setlimitapp("default");
rules.add(rule);
flowrulemanager.loadrules(rules);
}
}
該規(guī)則參考上面的限流因素,不難理解。
使用方式
@requestmapping(value = "/web/getorder",method = requestmethod.get)
public string getorder (@requestparam("id") integer id){
flowruleconfig.initflowqpsrule("getorder");
entry entry = null;
try {
// 定義資源,埋點(diǎn)
entry = sphu.entry("getorder");
// 保護(hù)的業(yè)務(wù)邏輯
return "order=" + id ;
} catch (exception e){
e.printstacktrace();
} finally {
if (entry != null){entry.exit();}
}
return "order error" ;
}
測(cè)試的時(shí)候修改規(guī)則中count值,測(cè)試效果明顯。
編碼簡(jiǎn)化
sphu.entry中可以設(shè)置處理類(lèi)型,限流閾值。
@requestmapping(value = "/web/getstate",method = requestmethod.get)
public string getstate (@requestparam("id") integer id){
entry entry = null;
try {
entry = sphu.entry("getorder",entrytype.in,2);
return "state=" + id;
}
catch (blockexception e){
e.printstacktrace();
} finally {
if (entry != null){entry.exit();}
}
return "state error" ;
}
不過(guò)這種模式依舊是代碼入侵嚴(yán)重,不太符合現(xiàn)在編程的大趨勢(shì)。sentinel支持通過(guò)@sentinelresource注解定義資源并配置。
4、測(cè)試效果
請(qǐng)求上述的兩個(gè)測(cè)試接口,之后看控制臺(tái)中9001服務(wù)的簇點(diǎn)鏈路。
可以基于控制臺(tái)實(shí)時(shí)配置資源的:流控、降級(jí)、熱點(diǎn)、授權(quán)等核心功能,服務(wù)重啟之后配置也會(huì)重置。
四、服務(wù)熔斷降級(jí)
1、注解詳解
核心注解sentinelresource
用于定義資源,并提供可選的異常處理和 fallback 配置項(xiàng)。 @sentinelresource 注解包含以下屬性:
value
資源名稱(chēng),核心概念不能為空;
entrytype
entry 類(lèi)型,可選項(xiàng)默認(rèn)為 entrytype.out;
blockhandler
對(duì)應(yīng)處理blockexception的函數(shù)名稱(chēng),可選項(xiàng)。blockhandler函數(shù)訪問(wèn)范圍需要是public,返回類(lèi)型需要與原方法相匹配,參數(shù)類(lèi)型需要和原方法相匹配并且最后加一個(gè)額外的參數(shù),類(lèi)型為blockexception。blockhandler函數(shù)默認(rèn)需要和原方法在同一個(gè)類(lèi)中。若希望使用其他類(lèi)的函數(shù),則可以指定 blockhandlerclass為對(duì)應(yīng)的類(lèi)的class對(duì)象,注意對(duì)應(yīng)的函數(shù)必須為 static 函數(shù),否則無(wú)法解析。
fallback
fallback函數(shù)名稱(chēng),可選項(xiàng),用于在拋出異常的時(shí)候提供fallback處理邏輯。fallback函數(shù)可以針對(duì)所有類(lèi)型的異常(除了 exceptionstoignore里面排除掉的異常類(lèi)型)進(jìn)行處理。fallback 函數(shù)簽名和位置要求:返回值類(lèi)型必須與原函數(shù)返回值類(lèi)型一致;方法參數(shù)列表需要和原函數(shù)一致,或者可以額外多一個(gè);
注意:這里可以這樣理解blockhandler和fallback,fallback處理業(yè)務(wù)邏輯的異常,服務(wù)降級(jí),blockhandler處理sentinel組件控制的阻斷異常。
2、使用案例
9001接口服務(wù)
@service
public class flowserviceimpl implements flowservice {
@resource
private jdbctemplate jdbctemplate ;
@sentinelresource(value = "getphone",blockhandler = "exceptionhandler", fallback = "fallback")
@override
public string getphone(integer id) {
string sql = "select phone from d_phone where id="+id ;
integer.parseint("hand") ;
return jdbctemplate.queryforlist(sql,string.class).get(0) ;
}
// 降級(jí)處理
public string fallback(integer id) {
return "服務(wù)降級(jí),id="+id ;
}
// 異常處理
public string exceptionhandler(integer id,blockexception be) {
be.printstacktrace();
return "服務(wù)拋異常,id="+id ;
}
}
9002請(qǐng)求服務(wù)
@requestmapping(value = "/web/getjdbc",method = requestmethod.get)
public string getjdbc () {
return msgfeign.getjdbc() ;
}
3、效果測(cè)試
通過(guò)控制臺(tái)配置9001的限流規(guī)則,然后刷接口看效果。
注意阻斷異常和業(yè)務(wù)異常的返參區(qū)別。
4、對(duì)比hystrix組件
hystrix的核心點(diǎn)在于以隔離和熔斷為主的容錯(cuò)機(jī)制,超時(shí)或被熔斷的調(diào)用將會(huì)快速失敗,并可以提供 fallback 機(jī)制;
sentinel核心點(diǎn)在于流量控制多樣化,熔斷降級(jí)服務(wù),系統(tǒng)負(fù)載保護(hù),實(shí)時(shí)監(jiān)控和控制臺(tái);
補(bǔ)刀一句:對(duì)于流量控制類(lèi)的組件,大部分場(chǎng)景是使用限流,服務(wù)降級(jí)這兩塊核心功能。
五、源代碼地址
github地址:知了一笑
https://github.com/cicadasmile/spring-cloud-base
gitee地址:知了一笑
https://gitee.com/cicadasmile/spring-cloud-base
微服務(wù)系列組件
如您對(duì)本文有疑問(wèn)或者有任何想說(shuō)的,請(qǐng)點(diǎn)擊進(jìn)行留言回復(fù),萬(wàn)千網(wǎng)友為您解惑!
總結(jié)
以上是生活随笔為你收集整理的java服务限流_SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 提供怎么读?
- 下一篇: java servlet 返回图片_Sp