最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud Gateway路由組件詳解

 更新時(shí)間:2023年02月22日 08:46:34   作者:尚少  
SpringCloud Gateway 是 Spring Cloud 的一個(gè)全新項(xiàng)目,它旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的統(tǒng)一的 API 路由管理方式。這篇文章主要介紹了SpringCloud Gateway網(wǎng)關(guān)作用,需要的朋友可以參考下

簡(jiǎn)介

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

核心概念

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

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

  斷言:即路由規(guī)則,用來(lái)判斷哪些請(qǐng)求符合規(guī)則,符合的請(qǐng)求進(jìn)行轉(zhuǎn)發(fā)

  過(guò)濾器:分為GatewayFilter和GlobalFilter,前者作用于單一路由,后者作用于所有路由。過(guò)濾器可以對(duì)請(qǐng)求或者返回進(jìn)行處理,如增加請(qǐng)求頭、刪除請(qǐng)求頭

  配置文件如下:

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

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

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

  配置中的AddRequestHeader就是其中一種Gateway Filter,還有其余的內(nèi)置的:

名稱(chēng)說(shuō)明
AddRequestHeader給當(dāng)前請(qǐng)求添加一個(gè)請(qǐng)求頭
RemoveRequestHeader移除請(qǐng)求中的一個(gè)請(qǐng)求頭
AddResponseHeader給響應(yīng)結(jié)果中添加一個(gè)響應(yīng)頭
RemoveResponseHeader從響應(yīng)結(jié)果中移除一個(gè)響應(yīng)頭
RequestRateLimiter限制請(qǐng)求的流量

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

具體示例

  這里新建2個(gè)模塊,路由模塊和用戶(hù)模塊

  用戶(hù)模塊,引入依賴(lài)spring-boot-starter-web、spring-cloud-starter-alibaba-nacos-discovery,bootstrap.yml配置端口號(hào)、nacos注冊(cè)中心的地址,并提供接口:

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;
    }
}

  路由模塊,引入依賴(lài):

<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個(gè)模塊都啟動(dòng)后,nacos的服務(wù)列表顯示:

  nacos中新建名為gateway-dev.yml的配置,內(nèi)容為:

spring:
  cloud:
    gateway:
      discovery:
        locator:
          # 通過(guò)服務(wù)名稱(chēng)轉(zhuǎn)發(fā),默認(rèn)false
          enabled: true
          # 服務(wù)名稱(chēng)不用大寫(xiě)
          lower-case-service-id: true
      # routes:
      #   - id: user-service
      #     uri: lb://supplier
      #     predicates:
      #       - Path=/provider/**
      #     filters:
      #       - AddRequestHeader=sign, big JavaCoder

  此時(shí),請(qǐng)求路徑:http://localhost:8086/supplier/provider/user/sayHello

  注:supplier是服務(wù)名稱(chēng),provider是模塊訪問(wèn)路徑(server.servlet.context-path)

但這種配置不是很推薦

  把spring.cloud.gateway.discovery及子配置注釋掉,把spring.cloud.gateway.routes及子配置取消注釋?zhuān)貑⒙酚赡K,這時(shí)訪問(wèn)路徑:

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

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

GlobalFilter

  處理一切進(jìn)入網(wǎng)關(guān)的請(qǐng)求和響應(yīng),并且也是可以編寫(xiě)代碼自定義邏輯;在執(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);
            //被攔截,請(qǐng)求不到對(duì)應(yīng)模塊了
            return exchange.getResponse().setComplete();
        }
        headers = HttpHeaders.writableHttpHeaders(headers);
        headers.set("sign1", "bigAAA");
        //放行
        return chain.filter(exchange);
    }
}

到此這篇關(guān)于SpringCloud Gateway路由組件詳解的文章就介紹到這了,更多相關(guān)SpringCloud Gateway內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring boot實(shí)現(xiàn)在request里解密參數(shù)返回

    spring boot實(shí)現(xiàn)在request里解密參數(shù)返回

    這篇文章主要介紹了Spring Boot實(shí)現(xiàn)在request里解密參數(shù)返回操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄

    SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄

    微信的登錄功能是用戶(hù)注冊(cè)和使用微信的必經(jīng)之路之一,而微信授權(quán)登錄更是方便了用戶(hù)的登錄操作,本文主要介紹了SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄,感興趣的可以了解一下
    2023-09-09
  • Java使用Hutool實(shí)現(xiàn)AES、DES加密解密的方法

    Java使用Hutool實(shí)現(xiàn)AES、DES加密解密的方法

    本篇文章主要介紹了Java使用Hutool實(shí)現(xiàn)AES、DES加密解密的方法,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • 詳解Java如何實(shí)現(xiàn)企業(yè)微信審批流程

    詳解Java如何實(shí)現(xiàn)企業(yè)微信審批流程

    這篇文章主要使用了一個(gè)Java示例代碼,來(lái)向大家展示如何在企業(yè)微信中實(shí)現(xiàn)審批流程,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以參考下
    2024-11-11
  • Java中超高頻常見(jiàn)字符操作合集(建議收藏)

    Java中超高頻常見(jiàn)字符操作合集(建議收藏)

    這篇文章主要為大家詳細(xì)介紹了Java中超高頻常見(jiàn)字符操作合集,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)java有一定的幫助,需要的小伙伴可以參考下
    2023-10-10
  • Spring時(shí)間戳(日期)格式轉(zhuǎn)換方式

    Spring時(shí)間戳(日期)格式轉(zhuǎn)換方式

    這篇文章主要介紹了Spring時(shí)間戳(日期)格式轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java中處理金額計(jì)算之使用Long還是BigDecimal詳解

    Java中處理金額計(jì)算之使用Long還是BigDecimal詳解

    在Java后端開(kāi)發(fā)中處理與錢(qián)有關(guān)的業(yè)務(wù)時(shí),確保金額計(jì)算的準(zhǔn)確性和避免錯(cuò)誤非常重要,這篇文章主要給大家介紹了關(guān)于Java中處理金額計(jì)算之使用Long還是BigDecimal的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • mybatis如何實(shí)現(xiàn)saveOrUpdate

    mybatis如何實(shí)現(xiàn)saveOrUpdate

    這篇文章主要介紹了mybatis如何實(shí)現(xiàn)saveOrUpdate問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java 實(shí)現(xiàn)一個(gè)漢諾塔實(shí)戰(zhàn)練習(xí)

    Java 實(shí)現(xiàn)一個(gè)漢諾塔實(shí)戰(zhàn)練習(xí)

    漢諾塔是源于印度一個(gè)古老傳說(shuō)的益智玩具。大梵天創(chuàng)造世界時(shí)做了三根石柱,在一根柱子上從下往上按大小順序摞著64片黃金圓盤(pán)。大梵天命令婆羅門(mén)把圓盤(pán)從下面開(kāi)始按大小順序重新擺放在另一根柱子上。并且規(guī)定,在小圓盤(pán)上不能放大圓盤(pán),三根柱子之間一次只能移動(dòng)一個(gè)圓盤(pán)
    2021-10-10
  • 詳解Java線程中斷知識(shí)點(diǎn)

    詳解Java線程中斷知識(shí)點(diǎn)

    在本篇文章中我們給大家分享了關(guān)于Java線程中斷的相關(guān)知識(shí)點(diǎn)內(nèi)容以及相關(guān)代碼實(shí)例,有興趣的朋友們可以學(xué)習(xí)下。
    2018-09-09

最新評(píng)論

方山县| 抚顺县| 安新县| 拜泉县| 罗源县| 安塞县| 阜康市| 丰顺县| 扬州市| 吴江市| 龙门县| 松阳县| 哈密市| 禹城市| 应用必备| 高邑县| 平泉县| 沧源| 九龙城区| 昌乐县| 长垣县| 洛扎县| 慈溪市| 胶南市| 逊克县| 清苑县| 巴楚县| 沙湾县| 翼城县| 太谷县| 酒泉市| 吉木乃县| 辽宁省| 松潘县| 清流县| 三都| 浮山县| 油尖旺区| 武冈市| 淮滨县| 江陵县|