溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringCloud?Gateway路由組件怎么使用

發(fā)布時間:2023-02-22 11:42:42 來源:億速云 閱讀:87 作者:iii 欄目:開發(fā)技術

這篇文章主要介紹“SpringCloud Gateway路由組件怎么使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“SpringCloud Gateway路由組件怎么使用”文章能幫助大家解決問題。

簡介

Gateway是SpringCloud Alibaba中的路由組件(前身是Zuul),作為瀏覽器端請求的統(tǒng)一入口。當項目采用微服務模式時,若包含了路由模塊,瀏覽器端的請求都不會直接請求含有業(yè)務邏輯的各個業(yè)務模塊,而是請求這個路由模塊,然后再由它來轉發(fā)到各個業(yè)務模塊去。

核心概念

Gateway中的三個核心概念:路由、斷言(Predicate)、過濾器。

路由:由唯一id、目的url、斷言和過濾組成

斷言:即路由規(guī)則,用來判斷哪些請求符合規(guī)則,符合的請求進行轉發(fā)

過濾器:分為GatewayFilter和GlobalFilter,前者作用于單一路由,后者作用于所有路由。過濾器可以對請求或者返回進行處理,如增加請求頭、刪除請求頭

配置文件如下:

spring:
  cloud:
    gateway:
      # 網(wǎng)關路由配置
      routes:
        # 路由id,自定義,只要唯一即可
        - id: user-service
          # uri: http://127.0.0.1:8081 # 路由的目標地址 http就是固定地址
          # 路由的目標地址 lb就是負載均衡,后面跟服務名稱,要和nacos的注冊中心結合
          uri: lb://userservice
          # 斷言
          predicates:
              # 這個是按照路徑匹配,只要以/user/開頭就符合要求
            - Path=/user/**
          # 過濾器
          filters:
              # 添加請求頭
            - AddRequestHeader=sign, xn2001.com is eternal

上面寫到了根據(jù)路徑匹配的斷言,Gateway提供了十幾種內置的斷言:

名稱說明示例
After是某個時間點之后的請求- After=2022-08-26T18:34:10.475+08:00[Asia/Shanghai]
Before是某個時間點之前的請求- Before=2022-11-26T18:34:10.475+08:00[Asia/Shanghai]
Between是某兩個時間點之前的請求- Between=2022-10-26T18:35:15.093+08:00[Asia/Shanghai], 2022-11-26T18:35:15.093+08:00[Asia/Shanghai]
Cookie請求必須包含某些cookie- Cookie=chocolate, ch.p
Header請求必須包含某些header- Header=sign, internal
Host請求必須是訪問某個host(域名)- Host=**.somehost.org, **.anotherhost.org
Method請求方式必須是指定方式- Method=GET,POST
Path請求路徑必須符合指定規(guī)則- Path=/blue/**
Query請求參數(shù)必須包含指定參數(shù)- Query=name, Jack或- Query=name
RemoteAddr請求者的ip必須是指定范圍- RemoteAddr=192.168.1.1/24
Weight權重處理

配置中的AddRequestHeader就是其中一種Gateway Filter,還有其余的內置的:

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

全局過濾器,后面的示例給出具體用法

具體示例

這里新建2個模塊,路由模塊和用戶模塊

用戶模塊,引入依賴spring-boot-starter-web、spring-cloud-starter-alibaba-nacos-discovery,bootstrap.yml配置端口號、nacos注冊中心的地址,并提供接口:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/user")
public class UserController {
    @ResponseBody
    @RequestMapping("/sayHello")
    public String sayHello(@RequestHeader(value = "sign", 
    required = false) String sign) {
        return "這是好吃的:" + sign;
    }
}

路由模塊,引入依賴:

<dependencies>                                                               
    <dependency>                                                             
        <groupId>com.alibaba.cloud</groupId>                                 
        <artifactId>spring-cloud-starter-alibaba-nacos-config
        </artifactId>   
        <version>2.2.0.RELEASE</version>                                     
    </dependency>                                                            
    <dependency>                                                             
        <groupId>com.alibaba.cloud</groupId>                                 
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery
        </artifactId>
        <version>2.2.0.RELEASE</version>                                     
    </dependency>                                                            
    <dependency>                                                             
        <groupId>org.springframework.cloud</groupId>                         
        <artifactId>spring-cloud-starter-gateway</artifactId>                
        <version>2.2.0.RELEASE</version>                                     
    </dependency>                                                            
    <dependency>                                                             
        <groupId>org.projectlombok</groupId>                                 
        <artifactId>lombok</artifactId>                                      
    </dependency>                                                            
</dependencies>

bootstrap.yml的配置:

server:
  port: 8086
  servlet:
    context-path: /gateway

spring:
  application:
    name: gateway
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yml
      discovery:
        server-addr: 127.0.0.1:8848

2個模塊都啟動后,nacos的服務列表顯示:

SpringCloud?Gateway路由組件怎么使用

nacos中新建名為gateway-dev.yml的配置,內容為:

spring:
  cloud:
    gateway:
      discovery:
        locator:
          # 通過服務名稱轉發(fā),默認false
          enabled: true
          # 服務名稱不用大寫
          lower-case-service-id: true
      # routes:
      #   - id: user-service
      #     uri: lb://supplier
      #     predicates:
      #       - Path=/provider/**
      #     filters:
      #       - AddRequestHeader=sign, big JavaCoder

此時,請求路徑:http://localhost:8086/supplier/provider/user/sayHello

注:supplier是服務名稱,provider是模塊訪問路徑(server.servlet.context-path)

但這種配置不是很推薦

把spring.cloud.gateway.discovery及子配置注釋掉,把spring.cloud.gateway.routes及子配置取消注釋,重啟路由模塊,這時訪問路徑:

http://localhost:8086/provider/user/sayHello。

注:這是訪問的路徑,經(jīng)過gateway處理后,實際訪問的是lb://supplier/provider/user/sayHello(見RouteToRequestUrlFilter的filter方法);provider是模塊訪問路徑(server.servlet.context-path),如果用戶模塊沒有設置的話,filters下添加- StripPrefix=1,這時訪問路徑不變,實際的訪問路徑是lb://supplier/user/sayHello。

GlobalFilter

處理一切進入網(wǎng)關的請求和響應,并且也是可以編寫代碼自定義邏輯;在執(zhí)行順序上,GatewayFilter先執(zhí)行,GlobalFilter后執(zhí)行。

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.List;
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, 
    GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        HttpHeaders headers = request.getHeaders();
        List<String> sign = headers.get("sign");
        if(sign.size() < 1) {
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.BAD_REQUEST);
            //被攔截,請求不到對應模塊了
            return exchange.getResponse().setComplete();
        }
        headers = HttpHeaders.writableHttpHeaders(headers);
        headers.set("sign1", "bigAAA");
        //放行
        return chain.filter(exchange);
    }
}

關于“SpringCloud Gateway路由組件怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識,可以關注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI