javascript
Spring Cloud(五) Zuul Filter
前文回顧:
Spring Cloud(一)Eureka Server-單體及集群搭建
Spring Cloud(二) 配置Eureka Client
Spring Cloud(三) 熔斷器Hystrix
Spring Cloud(四) API網(wǎng)關(guān)Zuul
一.執(zhí)行流程
Filter是Zuul的核心,用來實(shí)現(xiàn)對外服務(wù)的控制。Filter的生命周期有4個,分別是“PRE”、“ROUTING”、“POST”、“ERROR”,整個生命周期可以用下圖來表示。
Zuul大部分功能都是通過過濾器來實(shí)現(xiàn)的。Zuul中定義了四種標(biāo)準(zhǔn)過濾器類型,這些過濾器類型對應(yīng)于請求的典型生命周期。
-
PRE:這種過濾器在請求被路由之前調(diào)用。我們可利用這種過濾器實(shí)現(xiàn)身份驗(yàn)證、在集群中選擇請求的微服務(wù)、記錄調(diào)試信息等。
-
ROUTING:這種過濾器將請求路由到微服務(wù)。這種過濾器用于構(gòu)建發(fā)送給微服務(wù)的請求,并使用Apache HttpClient或Netfilx Ribbon請求微服務(wù)。
-
POST:這種過濾器在路由到微服務(wù)以后執(zhí)行。這種過濾器可用來為響應(yīng)添加標(biāo)準(zhǔn)的HTTP Header、收集統(tǒng)計(jì)信息和指標(biāo)、將響應(yīng)從微服務(wù)發(fā)送給客戶端等。
-
ERROR:在其他階段發(fā)生錯誤時執(zhí)行該過濾器。
二.自定義Filter
我們假設(shè)有這樣一個場景,因?yàn)榉?wù)網(wǎng)關(guān)應(yīng)對的是外部的所有請求,為了避免產(chǎn)生安全隱患,我們需要對請求做一定的限制,比如請求中含有Token便讓請求繼續(xù)往下走,如果請求不帶Token就直接返回并給出提示。
在上一篇博客的Zuul項(xiàng)目中添加如下內(nèi)容:
1.自定義TokenFilter
public class TokenFilter extends ZuulFilter { ?private final Logger logger = LoggerFactory.getLogger(TokenFilter.class); ?@Overridepublic String filterType() {// 可以在請求路由之前被調(diào)用return "pre";} ?@Overridepublic int filterOrder() {// filter執(zhí)行順序,通過數(shù)字指定 ,優(yōu)先級為0,數(shù)字越大,優(yōu)先級越低return 0;} ?@Overridepublic boolean shouldFilter() {// 是否執(zhí)行該過濾器,此處為true,說明需要過濾return true;} ?@Overridepublic Object run() {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest(); ?logger.info("--->>> TokenFilter {},{}", request.getMethod(), request.getRequestURL().toString()); ?// 獲取請求的參數(shù)String token = request.getParameter("token"); ?if (StringUtils.isNotBlank(token)) {// 對請求進(jìn)行路由ctx.setSendZuulResponse(true);ctx.setResponseStatusCode(200);ctx.set("isSuccess", true);return null;} else {// 不對其進(jìn)行路由ctx.setSendZuulResponse(false);ctx.setResponseStatusCode(400);ctx.setResponseBody("token is empty");ctx.set("isSuccess", false);return null;}} }2.在啟動類中添加Bean
@Bean public TokenFilter tokenFilter() {return new TokenFilter(); }3.測試
依次啟動 spring-cloud-eureka、 spring-cloud-producer、gateway-service-zuul-eureka
訪問:http://localhost:8888/producer/hello?name=yfy
返回:token is empty
添加token參數(shù),再次訪問:http://localhost:8888/producer/hello?name=yfy&token=test
返回:hello yfy,welcome to Spring Cloud
總結(jié)
以上是生活随笔為你收集整理的Spring Cloud(五) Zuul Filter的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Cloud(四) API网
- 下一篇: Spring Cloud(六) 服务网关