日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

SpringCloud組件之Gateway微服務網關

作者:wl_Honest 更新時間: 2022-10-14 編程語言

學習SprinngCloud到了網關這一組件,照例簡單記錄下網關的作用

網關有以下幾個作用:

  • 統一入口:未全部為服務提供一個唯一的入口,網關起到外部和內部隔離的作用,保障了后臺服務的安全性。
  • 鑒權校驗:識別每個請求的權限,拒絕不符合要求的請求。
  • 動態路由:動態的將請求路由到不同的后端集群中。
  • 減少客戶端與服務端的耦合:服務可以獨立發展,通過網關層來做映射。

?

在1.x版本中都是采用Zuul網關。但是在2.x版本中,zuul的升級一直跳票,SpringCloud最后自己研發了一個網關代替Zuul,就是SpringCloud Gateway,Gateway就是原zuul1.x版的替代。

Spring Cloud Gateway 里明確的區分了 Router 和 Filter,并且一個很大的特點是內置了非常多的開箱即用功能,并且都可以通過 SpringBoot 配置或者手工編碼鏈式調用來使用。

比如內置了 10 種 Router,使得我們可以直接配置一下就可以隨心所欲的根據 Header、或者 Path、或者 Host、或者 Query 來做路由。

比如區分了一般的 Filter 和全局 Filter,內置了 20 種 Filter 和 9 種全局 Filter,也都可以直接用。當然自定義 Filter 也非常方便。

接著開始實戰,首先創建一個新的moudule,就叫gateway

?然后引入依賴

<!-- gateway網關 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--eureka客戶端依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

接著創建啟動類

package com.wl.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author wl
 * @date 2022/3/7 16:34
 */
@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
        System.out.println("o(* ̄▽ ̄*)o啟動成功!!!?(? ???ω??? ?)?");
    }
}

然后對配置文件進行配置

server:
  port: 10010

spring:
  application:
    name: gateway
  cloud:
    gateway:
      # 網關路由配置
      routes:
        - id: user-service
          # lb表示負債均衡
          uri: lb://user-service
          # 斷言
          predicates:
            # 按照路徑匹配
            - Path=/user/**
          # 過濾器
          filters:
            - AddRequestHeader=topic, wl is a good man

其中predicates意為斷言,配置Path=/user/**表示只有以/user開頭的請求路徑才會放行,否則攔截。除了可以按路徑匹配,還可以設置按時間,比如Before=xx時間表示在xx時間前放行,After=xx時間表示在xx時間后放行,一共有11種選項可進行配置

?filter過濾器則可以對請求和響應進行修改處理,此處配置為給user-service這個服務的請求頭添加一段話。Spring Cloud Gateway 內置的過濾器工廠一覽表如下:

?啟動服務,訪問10010端口,如圖

?除此以外,還有一個GlobalFilter可以作為全局的過濾器,這里同樣參考黑馬程序員視頻寫了個小例子,針對權限為admin的用戶放行,否則攔截。

package com.wl.gateway.filter;

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

/**
 * @author wl
 * @date 2022/3/7 17:00
 */
@Order(Ordered.HIGHEST_PRECEDENCE)
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1.獲取請求參數
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        //2.獲取請求參數中的authorization參數
        String authorize = queryParams.getFirst("authorization");
        //3.判斷參數是否等于admin
        if ("admin".equals(authorize)) {
            //4.是,放行
            return chain.filter(exchange);
        }
        //5.1 設置狀態碼
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        //5.2 攔截請求
        return exchange.getResponse().setComplete();
    }
}

重新啟動,再次訪問

?顯示401,在url后面加上?authorization=admin再次訪問

?另外,如果有多個過濾器,可以配置@Order注解里的數字來進行排序,數字越小,執行順序越靠前。

原文鏈接:https://blog.csdn.net/wl_Honest/article/details/123335679

欄目分類
最近更新