Gateway

来源:https://www.cnblogs.com/Gao-yubo/archive/2022/10/31/16845983.html
-Advertisement-
Play Games

JavaScript02 8.JavaScript函數 JavaScript函數介紹 函數是由事件驅動的,或者當它被調用時,執行的可重覆使用的代碼 例子 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>函數快 ...


一、GateWay

image-20220208140741111

1.作用

  • 對用戶請求做身份認證、許可權校驗
  • 將用戶請求路由到微服務,並實現負載均衡
  • 對用戶請求做限流

2.使用

1.創建模塊,引入GateWay網關依賴和nacos依賴

<!--網關-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服務發現依賴-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.編寫啟動類,配置yaml文件

server:
  port: 10010 # 網關埠
spring:
  application:
    name: gateway # 服務名稱
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
    gateway:
      routes: # 網關路由配置
        - id: user-service # 路由id,自定義,只要唯一即可
          uri: lb://userservice # 路由的目標地址 lb就是負載均衡,後面跟服務名稱
          predicates: # 路由斷言,也就是判斷請求是否符合路由規則的條件
            - Path=/user/** # 這個是按照路徑匹配,只要以/user/開頭就符合要求

3.訪問使用

會自動將含有user的路徑路由到userservice的服務中

image-20220208141837716

3.路由斷言工廠

就是配置文件中的:

lpredicates:路由斷言,判斷請求是否符合要求,符合則轉發到路由目的地

l我們在配置文件中寫的斷言規則只是字元串,這些字元串會被Predicate Factory讀取並處理,轉變為路由判斷的條件

Spring提供了11種基本的Predicate工廠:

名稱 說明 示例
After 是某個時間點後的請求 - After=2037-01-20T17:42:47.789-07:00[America/Denver]
Before 是某個時間點之前的請求 - Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
Between 是某兩個時間點之前的請求 - Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]
Cookie 請求必須包含某些cookie - Cookie=chocolate, ch.p
Header 請求必須包含某些header - Header=X-Request-Id, \d+
Host 請求必須是訪問某個host(功能變數名稱) - Host=.somehost.org,.anotherhost.org
Method 請求方式必須是指定方式 - Method=GET,POST
Path 請求路徑必須符合指定規則 - Path=/red/{segment},/blue/**
Query 請求參數必須包含指定參數 - Query=name, Jack或者- Query=name
RemoteAddr 請求者的ip必須是指定範圍 - RemoteAddr=192.168.1.1/24

4.路由過濾器

過濾器的作用

① 對路由的請求或響應做加工處理,比如添加請求頭

② 配置在路由下的過濾器只對當前路由的請求生效

defaultFilters的作用是什麼?

① 對所有路由都生效的過濾器

image-20220208142237775

過濾器工廠

Spring提供了31種不同的路由過濾器工廠。例如:

名稱 說明
AddRequestHeader 給當前請求添加一個請求頭
RemoveRequestHeader 移除請求中的一個請求頭
AddResponseHeader 給響應結果中添加一個響應頭
RemoveResponseHeader 從響應結果中移除有一個響應頭
RequestRateLimiter 限制請求的流量

請求頭過濾器

下麵我們以AddRequestHeader 為例來講解。

需求:給所有進入userservice的請求添加一個請求頭:Truth=itcast is freaking awesome!

只需要修改gateway服務的application.yml文件,添加路由過濾即可:

spring:
  cloud:
    gateway:
      routes:
      - id: user-service 
        uri: lb://userservice 
        predicates: 
        - Path=/user/** 
        filters: # 過濾器
        - AddRequestHeader=Truth, Itcast is freaking awesome! # 添加請求頭

當前過濾器寫在userservice路由下,因此僅僅對訪問userservice的請求有效。

預設過濾器

如果要對所有的路由都生效,則可以將過濾器工廠寫到default下。格式如下:

spring:
  cloud:
    gateway:
      routes:
      - id: user-service 
        uri: lb://userservice 
        predicates: 
        - Path=/user/**
      default-filters: # 預設過濾項
      - AddRequestHeader=Truth, Itcast is freaking awesome! 

5.全局過濾器

全局過濾器的作用與路由過濾器的作用一樣。

區別在於GatewayFilter通過配置定義,處理邏輯是固定的。而GlobalFilter的邏輯需要自己寫代碼實現。

定義方式是實現GlobalFilter介面。

public interface GlobalFilter {
    /**
     *  處理當前請求,有必要的話通過{@link GatewayFilterChain}將請求交給下一個過濾器處理
     *
     * @param exchange 請求上下文,裡面可以獲取Request、Response等信息
     * @param chain 用來把請求委托給下一個過濾器 
     * @return {@code Mono<Void>} 返回標示當前過濾器業務結束
     */
    Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

舉例:判斷請求參數authorization參數值是否為admin

實現:

在gateway中定義一個過濾器:

package cn.itcast.gateway.filters;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.獲取請求參數
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
        // 2.獲取authorization參數
        String auth = params.getFirst("authorization");
        // 3.校驗
        if ("admin".equals(auth)) {
            // 放行
            return chain.filter(exchange);
        }
        // 4.攔截
        // 4.1.禁止訪問,設置狀態碼
        exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        // 4.2.結束處理
        return exchange.getResponse().setComplete();
    }
}

過濾器執行順序

每一個過濾器都必須指定一個int類型的order值,order值越小,優先順序越高,執行順序越靠前

  • GlobalFilter通過實現Ordered介面,或者添加@Order註解來指定order值,由我們自己指定
  • 路由過濾器和defaultFilter的order由Spring指定,預設是按照聲明順序從1遞增。

當過濾器的order值一樣時,會按照 defaultFilter > 路由過濾器 > GlobalFilter的順序執行。

6.跨域問題

跨域:功能變數名稱不一致就是跨域,主要包括:

  • 功能變數名稱不同: www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com

  • 功能變數名稱相同,埠不同:localhost:8080和localhost8081

瀏覽器禁止請求的發起者與服務端發生跨域ajax請求,請求被瀏覽器攔截的問題

解決跨域問題

在gateway服務的application.yml文件中,添加下麵的配置:

spring:
  cloud:
    gateway:
      # 。。。
      globalcors: # 全局的跨域處理
        add-to-simple-url-handler-mapping: true # 解決options請求被攔截問題
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允許哪些網站的跨域請求 
              - "http://localhost:8090"
            allowedMethods: # 允許的跨域ajax的請求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允許在請求中攜帶的頭信息
            allowCredentials: true # 是否允許攜帶cookie
            maxAge: 360000 # 這次跨域檢測的有效期

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、下載 node.js的下載地址**Download | Node.js (nodejs.org)** 根據使用系統,選擇對應的安裝包 根據點擊如下按鈕可以選擇歷史版本進行下載 二、安裝 下載好之後直接雙擊安裝即可 三、環境配置 安裝完成後,在系統環境變數配置中將node的路徑添加進去 在CMD中 ...
  • 在做一些常規應用的時候,我們往往需要確定條件的內容,以便在後臺進行區分的進行精確查詢,在移動端,由於受限於屏幕界面的情況,一般會對多個指定的條件進行模糊的搜索,而這個搜索的處理,也是和前者強類型的條件查詢處理類似的處理過程,因此本篇隨筆探討兩種不同查詢在前端界面上的展示效果,以及後端基於.netCo... ...
  • 摘要:在Java中提供了synchronized關鍵字來保證只有一個線程能夠訪問同步代碼塊。既然已經提供了synchronized關鍵字,那為何在Java的SDK包中,還會提供Lock介面呢?這是不是重覆造輪子,多此一舉呢? 本文分享自華為雲社區《【高併發】Java中提供了synchronized, ...
  • 在之前的SqlSugar系列隨筆中,介紹了很多我們關於SqlSugar的開發框架的內容,SqlSugar的開發框架的目的是多前端應用場景,因此其中會包含各種不同的前端應用,前面介紹了基於DevExpress的Winform的前端應用,以及基於Vue3+TypeScript+ElementPlus的B... ...
  • apijson 初探 本文試著用 5W1H 方式切入,試圖快速建立自己對 apijson 的整體認知,所以這不是一趟快速入門的 demo 之旅,而是顯得比較務虛的探索式知識體系整合過程。 持續更新中... 1、Why 前後端開發過程中各種痛點: 開發流程繁瑣、周期長 前端/客戶端與後端各種扯皮 文檔 ...
  • 您好,我是湘王,這是我的博客園,歡迎您來,歡迎您再來~ 前面把線程相關的生命周期、關鍵字、線程池(ThreadPool)、ThreadLocal、CAS、鎖和AQS都講完了,現在就剩下怎麼來用多線程了。而要想用好多線程,其實是可以取一些巧的,比如JUC(好多面試官喜歡問的JUC,就是現在要講的JUC ...
  • 1.函數定義 函數就是將完成一件事情的步驟封裝在一起並得到最終的結果; 函數名代表了這個函數要做的事情; 函數體是實現函數功能的流程; 添加一個函數也被叫做實現了一個方法或功能; 函數可以幫助我們重覆使用一些操作步驟; 2.def 通過關鍵字def定義函數; def name(args...): p ...
  • 1.簡介 python的創始人為 吉多·範羅蘇姆(Guido van Rossum),創建於1989年的聖誕節期間,根據本人熱愛的電視劇《蒙提·派森的飛行馬戲團》(Monty Python's Flying Circus)而取得。 目前python在眾多領域中得到了極大的推廣,一躍成為全球最火爆的語 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...