日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sentinel接入网关应用_阿里Sentinel整合Zuul网关详解

發(fā)布時間:2023/12/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sentinel接入网关应用_阿里Sentinel整合Zuul网关详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前面我們講解了Sentinel整合Spring Cloud Gateway,詳細請查看文章:阿里Sentinel支持Spring Cloud Gateway啦

目前來說,大部分公司線上的網(wǎng)關(guān)應(yīng)該是Zuul,所以今天我們就來看看如何在Zuul中整合Sentinel。本來想基于Spring Cloud Alibaba來進行整合講解,整合的時候發(fā)現(xiàn)目前還沒更新版本,依賴還是之前的版本,咱們就以最原生的方式進行整合吧,等Spring Cloud Alibaba更新之后,Sentinel的整合只會變得更簡單。

加入zuul-adapter依賴:

com.alibaba.csp

sentinel-zuul-adapter

1.6.0

配置Sentinel提供的限流過濾器和限流規(guī)則:

@Configuration

public class ZuulConfig {

@Bean

public ZuulFilter sentinelZuulPreFilter() {

return new SentinelZuulPreFilter();

}

@Bean

public ZuulFilter sentinelZuulPostFilter() {

return new SentinelZuulPostFilter();

}

@Bean

public ZuulFilter sentinelZuulErrorFilter() {

return new SentinelZuulErrorFilter();

}

@PostConstruct

public void doInit() {

// 注冊 FallbackProvider

ZuulBlockFallbackManager.registerProvider(new MyBlockFallbackProvider());

initGatewayRules();

}

/**

* 配置限流規(guī)則

*/

private void initGatewayRules() {

Set rules = new HashSet<>();

rules.add(new GatewayFlowRule("yinjihuan").setCount(1) // 限流閾值

.setIntervalSec(1) // 統(tǒng)計時間窗口,單位是秒,默認是 1 秒

);

GatewayRuleManager.loadRules(rules);

}

}

SentinelZuulPreFilter

pre過濾器,在請求路由之前匹配routeId和api,進行限流操作

SentinelZuulPostFilter

post過濾器,路由之后恢復(fù)資源

SentinelZuulErrorFilter

error過濾器,異常后的處理

最后再配置一個簡單的路由,路由名稱yinjihuan,跟上面規(guī)則中的名稱一致:

zuul.routes.yinjihuan.path=/cxytiandi/**

zuul.routes.yinjihuan.url=http://cxytiandi.com

觸發(fā)限流后會返回固定的提示:

{

"code":429,

"message":"Sentinel block exception",

"route":"yinjihuan"

}

如果想修改提示內(nèi)容可以自己實現(xiàn)ZuulBlockFallbackProvider接口,框架默認提供的實現(xiàn)是DefaultBlockFallbackProvider,源碼如下:

public class DefaultBlockFallbackProvider implements ZuulBlockFallbackProvider {

@Override

public String getRoute() {

return "*";

}

@Override

public BlockResponse fallbackResponse(String route, Throwable cause) {

if (cause instanceof BlockException) {

return new BlockResponse(429, "Sentinel block exception", route);

} else {

return new BlockResponse(500, "System Error", route);

}

}

}

用法其實跟Zuul中的FallbackProvider一致,但是FallbackProvider比較好的是返回的ClientHttpResponse,我們可以自定義響應(yīng)內(nèi)容。

Sentinel提供的ZuulBlockFallbackProvider接口中定義的返回對象是BlockResponse ,也就意味著限制了響應(yīng)的字段,BlockResponse中有code,message,route三個字段,如果我想返回status, msg這兩個字段目前我沒找到其它的方式,不知道后續(xù)會不會支持,其實最好的是也返回ClientHttpResponse,這樣就可以自定義響應(yīng)內(nèi)容了。

這邊有個小插曲,就是我們自定義fallbackResponse的時候如果用中文message的話,響應(yīng)內(nèi)容是亂碼,如下:

{

code: 429,

message: "??????",

route: "yinjihuan"

}

我看了下SentinelZuulPreFilter中的代碼,如下:

這邊是構(gòu)造了BlockResponse,然后設(shè)置到ResponseBody中,但是沒有進行編碼設(shè)置,我自己改了下源碼,加了一行代碼:

ctx.getResponse().setContentType("application/json; charset=utf-8");

加了上面的代碼后,中文就不會亂碼了,效果如下:

{

code: 429,

message: "訪問太頻繁啦",

route: "yinjihuan"

}

歡迎加入我的知識星球,一起交流技術(shù),免費學(xué)習(xí)猿天地的課程(http://cxytiandi.com/course)

PS:目前星球中正在星主的帶領(lǐng)下組隊學(xué)習(xí)Spring Cloud,等你哦!

總結(jié)

以上是生活随笔為你收集整理的sentinel接入网关应用_阿里Sentinel整合Zuul网关详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。