亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringCloud Gateway的基本入門(mén)和注意點(diǎn)詳解

 更新時(shí)間:2021年10月13日 10:29:36   作者:zzzgd816  
這篇文章主要介紹了SpringCloud Gateway的基本入門(mén)和注意點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1.gateway和zuul

Spring Cloud Finchley版本的gateway比zuul 1.x系列的性能和功能整體要好,且使用 Gateway 做跨域相比應(yīng)用本身或是 Nginx 的好處是規(guī)則可以配置的更加靈活.

這兩者相同的地方就是都是作為網(wǎng)關(guān),處理前段的請(qǐng)求,可以進(jìn)行路由到對(duì)應(yīng)的服務(wù)或者url,也可以針對(duì)權(quán)限做過(guò)濾處理,也可以對(duì)其他服務(wù)響應(yīng)的結(jié)果做處理

截至目前SpringCloud gateway最新版本是2.1.0 RC3,可見(jiàn)官方網(wǎng)站SpringCloud gateway,每個(gè)版本增加的功能都比較多,改動(dòng)的地方也比較多,前幾個(gè)版本有比較坑的地方,建議使用最新版本

2.使用gateway的路由功能

1. 搭載springcloud gateway

準(zhǔn)備一個(gè)spring cloud工程,包括eureka-server注冊(cè)中心,service-client服務(wù)提供者,端口8090

service-client提供一個(gè)接口:

@RestController
@Slf4j
public class ProducerController {
  @RequestMapping("/hi")
  public String hi(@RequestParam String name) {
    log.info("[client服務(wù)] [hi方法]收到請(qǐng)求");
    return "hi " + name + ",i am from service-client";
  }
}

再建一個(gè)spring cloud工程,service-gateway網(wǎng)關(guān),端口8088

pom的依賴:

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/>
 </parent>
 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

application啟動(dòng)類:

package com.zgd.springcloud.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
 * service-gateway 客戶端
 * @author zgd
 */
@EnableEurekaClient
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

這樣基本的框架就搭好了,先啟動(dòng)eureka-server注冊(cè)中心,再啟動(dòng)service-client和service-gateway

直接調(diào)用 localhost:8090/hi?name=zgd,可以收到

hi zgd,i am from service-client

2.簡(jiǎn)單使用gateway

GateWay大體可以分為路由工廠Route Predicate Factories,網(wǎng)關(guān)過(guò)濾器工廠GatewayFilter Factories,全局過(guò)濾器工廠Global Filters處理請(qǐng)求。

對(duì)于路由轉(zhuǎn)發(fā),Spring Cloud gateway內(nèi)置了很多校驗(yàn)條件謂語(yǔ)(predicate)來(lái)實(shí)現(xiàn)路由功能。

比如

  • 根據(jù)時(shí)間來(lái)路由: After Route Predicate Factory某個(gè)時(shí)間點(diǎn)之后請(qǐng)求路由,Before Route Predicate Factory某個(gè)時(shí)間點(diǎn)之前請(qǐng)求路由,Between Route Predicate Factory兩者時(shí)間之間
  • 通過(guò)請(qǐng)求路徑來(lái)路由: Path Route Predicate Factory
  • 根據(jù)請(qǐng)求頭來(lái)路由
  • 根據(jù)cookie來(lái)路由
  • 根據(jù)域名來(lái)路由

有兩種方式配置,一種是配置文件application的方式,一種是代碼配置

1.application配置

a. 路由到其他地址

spring:
  cloud:
    gateway:
      #可以根據(jù)請(qǐng)求參數(shù),cookie,host,請(qǐng)求時(shí)間,請(qǐng)求頭等進(jìn)行校驗(yàn)判斷路由, 下面根據(jù)先后順序轉(zhuǎn)發(fā)
      routes:
        - id: host_route
          uri: http://httpbin.org:80/get
          predicates:
            - Path=/zzzgd/** # 請(qǐng)求地址攜帶zzzgd的,則轉(zhuǎn)發(fā)

在spring.cloud.gateway.routes中,我們可以根據(jù)不同的謂語(yǔ)配置不同的路由,根據(jù)配置的先后順序來(lái)跳轉(zhuǎn),越在前面優(yōu)先級(jí)越高.

其中id,區(qū)分不同的路由規(guī)則,不可重復(fù),uri,指需要跳轉(zhuǎn)的地址,Predicates就是上面說(shuō)的謂語(yǔ)了,可以配置多個(gè),使用正則匹配. 這里我們配置的是如果請(qǐng)求地址攜帶zzzgd則會(huì)跳轉(zhuǎn)到我們配置的uri

配置好gateway,重新啟動(dòng),然后我們調(diào)用localhost:8088(網(wǎng)關(guān)的地址和端口)/zzzgd/abc,這個(gè)地址是沒(méi)有任何匹配的接口的,按理來(lái)說(shuō)會(huì)返回404,但是配置了網(wǎng)關(guān)就返回了這些信息,這個(gè)是我們配置的uri所返回的:

{
  "args": {
    "name": "zgd"
  }, 
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Accept-Language": "zh-CN,zh;q=0.9", 
    "Connection": "close", 
    "Cookie": "SL_G_WPT_TO=zh; SL_GWPT_Show_Hide_tmp=undefined; SL_wptGlobTipTmp=undefined", 
    "Forwarded": "proto=http;host=\"localhost:8088\";for=\"0:0:0:0:0:0:0:1:55782\"", 
    "Host": "httpbin.org", 
    "Upgrade-Insecure-Requests": "1", 
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36", 
    "X-Forwarded-Host": "localhost:8088"
  }, 
  "origin": "0:0:0:0:0:0:0:1, 119.147.213.42", 
  "url": "http://localhost:8088/get?name=zgd"
}

上面的是根據(jù)地址來(lái)路由,還有下面多種路由配置:

根據(jù)域名來(lái)轉(zhuǎn)發(fā)路由:

routes:
 - id: host_route
   uri: http://httpbin.org:80/get
   predicates:
     - Host=**.csdn.** # 請(qǐng)求域名攜帶csdn的,則轉(zhuǎn)發(fā)
 - id: query_route
   uri: http://httpbin.org:80/get
   predicates:
     - Query=username, zzz* # 請(qǐng)求參數(shù)含有username,且值滿足zzz開(kāi)頭的,則轉(zhuǎn)發(fā)(對(duì)值的匹配可以省略)
 - id: header_route
   uri: http://httpbin.org:80/get
   predicates:
     - Header=request, \d+ # 如果請(qǐng)求頭含有request,且為數(shù)字,則轉(zhuǎn)發(fā)
 - id: cookie_route
      uri: http://httpbin.org:80/get
      predicates:
        - Cookie=name, zzzgd # 如果攜帶cookie,參數(shù)名為name,值為zzzgd,則轉(zhuǎn)發(fā)
    - id: path_route
      uri: http://httpbin.org:80/get
      predicates:
        - Path=/zzzgd/** # 請(qǐng)求地址攜帶zzzgd的,則轉(zhuǎn)發(fā)
    # 路由到其他服務(wù),url需要用[lb://]+[serviceId]
    - id: service_client
      uri: lb://service-client
      predicates:
        - Path=/to_client/** # 如果請(qǐng)求地址滿足/to_client/**,則轉(zhuǎn)發(fā)到 service-client 服務(wù)
      filters:
        - StripPrefix=1 # 去除請(qǐng)求地址中的to_client
    - id: after_route
      uri: http://httpbin.org:80/get
      predicates:
        - After=2019-01-01T17:42:47.789-07:00[America/Denver] # 如果請(qǐng)求時(shí)間大于該時(shí)間,則轉(zhuǎn)發(fā)

b. 根據(jù)服務(wù)名路由到其他服務(wù)

我們知道,zuul是可以根據(jù)服務(wù)在eureka的serviceId,來(lái)將請(qǐng)求路由到不同的服務(wù)上,這也是網(wǎng)關(guān)最大的作用之一,gateway也可以

gateway可以通過(guò)開(kāi)啟以下配置來(lái)打開(kāi)根據(jù)服務(wù)的serviceId來(lái)匹配路由,默認(rèn)是大寫(xiě):

# 配置gateway路由
spring:
  cloud:
    gateway:
      discovery:
        locator:
          # 是否可以通過(guò)其他服務(wù)的serviceId來(lái)轉(zhuǎn)發(fā)到具體的服務(wù)實(shí)例。默認(rèn)為false
          # 為true,自動(dòng)創(chuàng)建路由,路由訪問(wèn)方式:http://Gateway_HOST:Gateway_PORT/大寫(xiě)的serviceId/**,其中微服務(wù)應(yīng)用名默認(rèn)大寫(xiě)訪問(wèn)
          enabled: true

開(kāi)啟配置,重啟gateway,訪問(wèn) localhost:8088/SERVICE-CLIENT/hi?name=zgd,

正常返回了service-client的結(jié)果.

如果需要小寫(xiě)serviceId,則配置spring.cloud.gateway.locator.lowerCaseServiceId:true

注意事項(xiàng)

不管小寫(xiě)大寫(xiě),不能使用下劃線,否則會(huì)報(bào):

org.springframework.cloud.gateway.support.NotFoundException: Unable to find instance for localhost

所以服務(wù)的spring.application.name 必須用中劃線而不是下劃線

如果開(kāi)啟了lowerCaseServiceId,則只能用小寫(xiě),不能識(shí)別大寫(xiě),如果不開(kāi)啟,只能識(shí)別大寫(xiě)

除了上面這種自動(dòng)設(shè)置路由服務(wù),也可以手動(dòng)設(shè)置,在routes中配置

這里使用的是gateway的其中一個(gè)過(guò)濾器工廠,去除請(qǐng)求地址前綴的過(guò)濾器

# 路由到其他服務(wù),url需要用[lb://]+[serviceId]
- id: service_client
  uri: lb://service-client
  predicates:
    - Path=/to_client/** # 如果請(qǐng)求地址滿足/to_client/**,則轉(zhuǎn)發(fā)到 service-client 服務(wù)
  filters:
    - StripPrefix=1 # 去除請(qǐng)求地址中的to_client

這里的uri不是一個(gè)具體的地址了,而是lb://開(kāi)頭,加上serviceId

然后比如上面這個(gè)配置,我們 再調(diào)用 localhost:8088/to_client/hi?name=zgd

可以看到也正常收到了service-client的返回.說(shuō)明我們調(diào)用到了這個(gè)服務(wù).

這里需要注意的一點(diǎn),如果不加上filters.- StripPrefix=1,那么則無(wú)法請(qǐng)求到hi這個(gè)接口。因?yàn)檫@個(gè)to_client相當(dāng)于是服務(wù)名,只是為了網(wǎng)關(guān)的路由加上去的,對(duì)于服務(wù)提供者service-client來(lái)說(shuō),不需要這段地址,所以需要去掉

還有其他的predicate,可以參考官方文檔

過(guò)濾

這個(gè)filters也是gateway的一個(gè)重要功能,過(guò)濾.

gateway內(nèi)置的過(guò)濾器工廠有下面這些:

除了上面用到的

  • 路徑前綴去除過(guò)濾器,還有
  • 添加請(qǐng)求參數(shù)過(guò)濾器
  • 添加請(qǐng)求頭過(guò)濾器
  • 添加響應(yīng)頭過(guò)濾器
  • 移除響應(yīng)頭過(guò)濾器

它可以修改我們請(qǐng)求的路徑,請(qǐng)求的參數(shù),增加請(qǐng)求頭,或者響應(yīng)頭等等

可以參考官方文檔

舉個(gè)例子,我們將application配置如下:

spring:
  cloud:
    gateway:
  routes:
   - id: query_route
    uri: http://httpbin.org:80/get
    predicates:
    - Query=username, zzz* # 請(qǐng)求參數(shù)含有username,且值滿足zzz開(kāi)頭的,則轉(zhuǎn)發(fā)(對(duì)值的匹配可以省略)
    filters:
    - AddRequestHeader=X-Request-Foo, Bar
    - AddRequestParameter=age, 18

請(qǐng)求 localhost:8088/?username=zzzzzzz

它返回了它所受到的請(qǐng)求,將會(huì)看到返回?cái)?shù)據(jù)中已經(jīng)添加了一個(gè)age=18的請(qǐng)求參數(shù),且請(qǐng)求頭也多了X-Request-Foo=Bar

b.代碼配置

為了方便在java開(kāi)發(fā),gateway也提供了代碼的方式配置,比如我們注釋掉上面的application配置,然后建一個(gè)配置類

/**
 * @Author: zgd
 * @Date: 2019/1/8 19:09
 * @Description:
 */
@Configuration
public class GateWayConfig {
  @Bean
  public RouteLocator routeLocator(RouteLocatorBuilder builder) {
    return builder.routes()
            .route(r -> r.path("/fluent/**").and().query("name")
                    .uri("http://httpbin.org:80/get"))
            .build();
  }
}

啟動(dòng),訪問(wèn)

http://localhost:8088/fluent/1/?name=bb

成功!

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中文件寫(xiě)入內(nèi)容的幾種常見(jiàn)方法

    Java中文件寫(xiě)入內(nèi)容的幾種常見(jiàn)方法

    本文主要介紹了Java中文件寫(xiě)入內(nèi)容的幾種常見(jiàn)方法,主要包括使用NIO的Files工具類、通過(guò)commons-io的FileUtils工具類、RandomAccessFile、PrintWriter和BufferedWriter這幾種,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • JavaWeb Session失效時(shí)間設(shè)置方法

    JavaWeb Session失效時(shí)間設(shè)置方法

    這篇文章主要介紹了JavaWeb Session失效時(shí)間設(shè)置方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • java中的多態(tài)和繼承示例分析

    java中的多態(tài)和繼承示例分析

    這篇文章主要介紹了java中的多態(tài)和繼承,結(jié)合實(shí)例形式分析了java中的多態(tài)和繼承原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • Java中List使用stream流轉(zhuǎn)成map的幾種方式詳解

    Java中List使用stream流轉(zhuǎn)成map的幾種方式詳解

    Stream是Java8中處理集合的關(guān)鍵抽象概念,它可以指定你希望對(duì)集合進(jìn)行的操作,可以執(zhí)行非常復(fù)雜的查找、過(guò)濾和映射數(shù)據(jù)等操作,下面這篇文章主要給大家介紹了關(guān)于Java中List使用stream流轉(zhuǎn)成map的幾種方式,需要的朋友可以參考下
    2023-04-04
  • spring boot系列之集成測(cè)試(推薦)

    spring boot系列之集成測(cè)試(推薦)

    這篇文章主要介紹了spring boot系列集成測(cè)試,需要的朋友可以參考下
    2018-03-03
  • Java中的程序計(jì)數(shù)器是什么

    Java中的程序計(jì)數(shù)器是什么

    這篇文章主要介紹了Java中的程序計(jì)數(shù)器是什么,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • 使用jekins自動(dòng)構(gòu)建部署java maven項(xiàng)目的方法步驟

    使用jekins自動(dòng)構(gòu)建部署java maven項(xiàng)目的方法步驟

    這篇文章主要介紹了使用jekins自動(dòng)構(gòu)建部署java maven項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java中InetAddress類的使用

    Java中InetAddress類的使用

    InetAddress類是Java中用于表示IP地址的類,本文就來(lái)介紹一下Java中InetAddress類的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • 通過(guò)Java實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳功能

    通過(guò)Java實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳功能

    用戶上傳大文件,網(wǎng)絡(luò)差點(diǎn)的需要?dú)v時(shí)數(shù)小時(shí),萬(wàn)一線路中斷,不具備斷點(diǎn)續(xù)傳的服務(wù)器就只能從頭重傳,而斷點(diǎn)續(xù)傳就是,允許用戶從上傳斷線的地方繼續(xù)傳送,這樣大大減少了用戶的煩惱。本文將用Java語(yǔ)言實(shí)現(xiàn)斷點(diǎn)續(xù)傳,需要的可以參考一下
    2022-05-05
  • 關(guān)于Spring MVC同名參數(shù)綁定問(wèn)題的解決方法

    關(guān)于Spring MVC同名參數(shù)綁定問(wèn)題的解決方法

    Spring MVC中的參數(shù)綁定還是蠻重要的,最近在使用中遇到了同名參數(shù)綁定的問(wèn)題,想著總結(jié)分享出來(lái),下面這篇文章主要給大家介紹了關(guān)于Spring MVC同名參數(shù)綁定問(wèn)題的解決方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-08-08

最新評(píng)論