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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

springcloud 网关_Spring Cloud 系列之 Netflix Zuul 服务网关(二)

發(fā)布時間:2024/7/23 javascript 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springcloud 网关_Spring Cloud 系列之 Netflix Zuul 服务网关(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本篇文章為系列文章,未讀第一集的同學(xué)請猛戳這里:

哈嘍沃德先生:Spring Cloud 系列之 Netflix Zuul 服務(wù)網(wǎng)關(guān)(一)?zhuanlan.zhihu.com

本篇文章講解 Zuul 網(wǎng)關(guān)過濾器實現(xiàn)統(tǒng)一鑒權(quán)以及網(wǎng)關(guān)過濾器異常統(tǒng)一處理。

網(wǎng)關(guān)過濾器

https://www.zhihu.com/video/1234207041360777216

Zuul 包含了對請求的路由和過濾兩個核心功能,其中路由功能負(fù)責(zé)將外部請求轉(zhuǎn)發(fā)到具體的微服務(wù)實例上,是實現(xiàn)外部訪問統(tǒng)一入口的基礎(chǔ);而過濾器功能則負(fù)責(zé)對請求的處理過程進(jìn)行干預(yù),是實現(xiàn)請求校驗,服務(wù)聚合等功能的基礎(chǔ)。然而實際上,路由功能在真正運行時,它的路由映射和請求轉(zhuǎn)發(fā)都是由幾個不同的過濾器完成的。

路由映射主要通過 pre 類型的過濾器完成,它將請求路徑與配置的路由規(guī)則進(jìn)行匹配,以找到需要轉(zhuǎn)發(fā)的目標(biāo)地址;而請求轉(zhuǎn)發(fā)的部分則是由 routing 類型的過濾器來完成,對 pre 類型過濾器獲得的路由地址進(jìn)行轉(zhuǎn)發(fā)。所以說,過濾器可以說是 Zuul 實現(xiàn) API 網(wǎng)關(guān)功能最核心的部件,每一個進(jìn)入 Zuul 的 http 請求都會經(jīng)過一系列的過濾器處理鏈得到請求響應(yīng)并返回給客戶端。

關(guān)鍵名詞

  • 類型:定義路由流程中應(yīng)用過濾器的階段。共 pre、routing、post、error 4 個類型。
  • 執(zhí)行順序:在同類型中,定義過濾器執(zhí)行的順序。比如多個 pre 類型的執(zhí)行順序。
  • 條件:執(zhí)行過濾器所需的條件。true 開啟,false 關(guān)閉。
  • 動作:如果符合條件,將執(zhí)行的動作。具體操作。

過濾器類型

  • pre:請求被路由到源服務(wù)器之前執(zhí)行的過濾器
    • 身份認(rèn)證
    • 選路由
    • 請求日志
  • routing:處理將請求發(fā)送到源服務(wù)器的過濾器
  • post:響應(yīng)從源服務(wù)器返回時執(zhí)行的過濾器
    • 對響應(yīng)增加 HTTP 頭
    • 收集統(tǒng)計和度量指標(biāo)
    • 將響應(yīng)以流的方式發(fā)送回客戶端
  • error:上述階段中出現(xiàn)錯誤時執(zhí)行的過濾器

入門案例

創(chuàng)建過濾器

Spring Cloud Netflix Zuul 中實現(xiàn)過濾器必須包含 4 個基本特征:過濾器類型,執(zhí)行順序,執(zhí)行條件,動作(具體操作)。這些步驟都是 ZuulFilter 接口中定義的 4 個抽象方法:

package com.example.filter;import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;/*** 網(wǎng)關(guān)過濾器*/ @Component public class CustomFilter extends ZuulFilter {private static final Logger logger = LoggerFactory.getLogger(CustomFilter.class);/*** 過濾器類型* pre* routing* post* error** @return*/@Overridepublic String filterType() {return "pre";}/*** 執(zhí)行順序* 數(shù)值越小,優(yōu)先級越高** @return*/@Overridepublic int filterOrder() {return 0;}/*** 執(zhí)行條件* true 開啟* false 關(guān)閉** @return*/@Overridepublic boolean shouldFilter() {return true;}/*** 動作(具體操作)* 具體邏輯** @return* @throws ZuulException*/@Overridepublic Object run() throws ZuulException {// 獲取請求上下文RequestContext rc = RequestContext.getCurrentContext();HttpServletRequest request = rc.getRequest();logger.info("CustomFilter...method={}, url={}",request.getMethod(),request.getRequestURL().toString());return null;}}
  • filterType:該函數(shù)需要返回一個字符串代表過濾器的類型,而這個類型就是在 http 請求過程中定義的各個階段。在 Zuul 中默認(rèn)定義了 4 個不同的生命周期過程類型,具體如下:
    • pre:請求被路由之前調(diào)用
    • routing: 路由請求時被調(diào)用
    • post:routing 和 error 過濾器之后被調(diào)用
    • error:處理請求時發(fā)生錯誤時被調(diào)用
  • filterOrder:通過 int 值來定義過濾器的執(zhí)行順序,數(shù)值越小優(yōu)先級越高。
  • shouldFilter:返回一個 boolean 值來判斷該過濾器是否要執(zhí)行。
  • run:過濾器的具體邏輯。在該函數(shù)中,我們可以實現(xiàn)自定義的過濾邏輯,來確定是否要攔截當(dāng)前的請求,不對其進(jìn)行后續(xù)路由,或是在請求路由返回結(jié)果之后,對處理結(jié)果做一些加工等。

訪問

訪問:http://localhost:9000/product-service/product/1 控制臺輸出如下:

CustomFilter...method=GET, url=http://localhost:9000/product-service/product/1

統(tǒng)一鑒權(quán)

接下來我們在網(wǎng)關(guān)過濾器中通過 token 判斷用戶是否登錄,完成一個統(tǒng)一鑒權(quán)案例。

創(chuàng)建過濾器

package com.example.filter;import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.PrintWriter;/*** 權(quán)限驗證過濾器*/ @Component public class AccessFilter extends ZuulFilter {private static final Logger logger = LoggerFactory.getLogger(AccessFilter.class);@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {// 獲取請求上下文RequestContext rc = RequestContext.getCurrentContext();HttpServletRequest request = rc.getRequest();// 獲取表單中的 tokenString token = request.getParameter("token");// 業(yè)務(wù)邏輯處理if (null == token) {logger.warn("token is null...");// 請求結(jié)束,不在繼續(xù)向下請求。rc.setSendZuulResponse(false);// 響應(yīng)狀態(tài)碼,HTTP 401 錯誤代表用戶沒有訪問權(quán)限r(nóng)c.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());// 響應(yīng)類型rc.getResponse().setContentType("application/json; charset=utf-8");PrintWriter writer = null;try {writer = rc.getResponse().getWriter();// 響應(yīng)內(nèi)容writer.print("{"message":"" + HttpStatus.UNAUTHORIZED.getReasonPhrase() + ""}");} catch (IOException e) {e.printStackTrace();} finally {if (null != writer)writer.close();}} else {// 使用 token 進(jìn)行身份驗證logger.info("token is OK!");}return null;}}

訪問

訪問:http://localhost:9000/product-service/product/1 結(jié)果如下:

訪問:http://localhost:9000/product-service/product/1?token=abc123 結(jié)果如下:

Zuul 請求的生命周期

  • HTTP 發(fā)送請求到 Zuul 網(wǎng)關(guān)
  • Zuul 網(wǎng)關(guān)首先經(jīng)過 pre filter
  • 驗證通過后進(jìn)入 routing filter,接著將請求轉(zhuǎn)發(fā)給遠(yuǎn)程服務(wù),遠(yuǎn)程服務(wù)執(zhí)行完返回結(jié)果,如果出錯,則執(zhí)行 error filter
  • 繼續(xù)往下執(zhí)行 post filter
  • 最后返回響應(yīng)給 HTTP 客戶端
  • 網(wǎng)關(guān)過濾器異常統(tǒng)一處理

    https://www.zhihu.com/video/1234207208662945792

    創(chuàng)建過濾器

    package com.example.filter;import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component;import java.io.IOException; import java.io.PrintWriter;/*** 異常過濾器*/ @Component public class ErrorFilter extends ZuulFilter {private static final Logger logger = LoggerFactory.getLogger(ErrorFilter.class);@Overridepublic String filterType() {return "error";}@Overridepublic int filterOrder() {return 0;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {RequestContext rc = RequestContext.getCurrentContext();Throwable throwable = rc.getThrowable();logger.error("ErrorFilter..." + throwable.getCause().getMessage(), throwable);// 響應(yīng)狀態(tài)碼,HTTP 500 服務(wù)器錯誤rc.setResponseStatusCode(HttpStatus.INTERNAL_SERVER_ERROR.value());// 響應(yīng)類型rc.getResponse().setContentType("application/json; charset=utf-8");PrintWriter writer = null;try {writer = rc.getResponse().getWriter();// 響應(yīng)內(nèi)容writer.print("{"message":"" + HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase() + ""}");} catch (IOException e) {e.printStackTrace();} finally {if (null != writer)writer.close();}return null;}}

    模擬異常

    在 pre 過濾器中添加模擬異常代碼。

    // 模擬異常 Integer.parseInt("zuul");

    配置文件

    禁用 Zuul 默認(rèn)的異常處理 filter:SendErrorFilter

    zuul:# 禁用 Zuul 默認(rèn)的異常處理 filterSendErrorFilter:error:disable: true

    訪問

    訪問:http://localhost:9000/product-service/product/1 結(jié)果如下:

    下一篇我們講解 Zuul 和 Hystrix 的無縫結(jié)合,實現(xiàn)網(wǎng)關(guān)監(jiān)控、網(wǎng)關(guān)熔斷、網(wǎng)關(guān)限流、網(wǎng)關(guān)調(diào)優(yōu),記得關(guān)注噢~

    大家可以通過 分類 查看更多關(guān)于 Spring Cloud 的文章。

    本文采用 知識共享「署名-非商業(yè)性使用-禁止演繹 4.0 國際」許可協(xié)議。

    您的點贊和轉(zhuǎn)發(fā)是對我最大的支持。

    掃碼關(guān)注 哈嘍沃德先生「文檔 + 視頻」每篇文章都配有專門視頻講解,學(xué)習(xí)更輕松噢 ~

    總結(jié)

    以上是生活随笔為你收集整理的springcloud 网关_Spring Cloud 系列之 Netflix Zuul 服务网关(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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