一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringCloud Gateway的基本入門和注意點詳解

SpringCloud Gateway的基本入門和注意點詳解

2022-02-17 15:05zzzgd816 Java教程

這篇文章主要介紹了SpringCloud Gateway的基本入門和注意點,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

1.gateway和zuul

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

這兩者相同的地方就是都是作為網關,處理前段的請求,可以進行路由到對應的服務或者url,也可以針對權限做過濾處理,也可以對其他服務響應的結果做處理

截至目前SpringCloud gateway最新版本是2.1.0 RC3,可見官方網站SpringCloud gateway,每個版本增加的功能都比較多,改動的地方也比較多,前幾個版本有比較坑的地方,建議使用最新版本

 

2.使用gateway的路由功能

1. 搭載springcloud gateway

準備一個spring cloud工程,包括eureka-server注冊中心,service-client服務提供者,端口8090

service-client提供一個接口:

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

再建一個spring cloud工程,service-gateway網關,端口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啟動類:

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

這樣基本的框架就搭好了,先啟動eureka-server注冊中心,再啟動service-client和service-gateway

直接調用 localhost:8090/hi?name=zgd,可以收到

hi zgd,i am from service-client

2.簡單使用gateway

GateWay大體可以分為路由工廠Route Predicate Factories,網關過濾器工廠GatewayFilter Factories,全局過濾器工廠Global Filters處理請求。

對于路由轉發,Spring Cloud gateway內置了很多校驗條件謂語(predicate)來實現路由功能。

比如

  • 根據時間來路由: After Route Predicate Factory某個時間點之后請求路由,Before Route Predicate Factory某個時間點之前請求路由,Between Route Predicate Factory兩者時間之間
  • 通過請求路徑來路由: Path Route Predicate Factory
  • 根據請求頭來路由
  • 根據cookie來路由
  • 根據域名來路由

SpringCloud Gateway的基本入門和注意點詳解

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

1.application配置

a. 路由到其他地址

spring:
cloud:
  gateway:
    #可以根據請求參數,cookie,host,請求時間,請求頭等進行校驗判斷路由, 下面根據先后順序轉發
    routes:
      - id: host_route
        uri: http://httpbin.org:80/get
        predicates:
          - Path=/zzzgd/** # 請求地址攜帶zzzgd的,則轉發

在spring.cloud.gateway.routes中,我們可以根據不同的謂語配置不同的路由,根據配置的先后順序來跳轉,越在前面優先級越高.

其中id,區分不同的路由規則,不可重復,uri,指需要跳轉的地址,Predicates就是上面說的謂語了,可以配置多個,使用正則匹配. 這里我們配置的是如果請求地址攜帶zzzgd則會跳轉到我們配置的uri

配置好gateway,重新啟動,然后我們調用localhost:8088(網關的地址和端口)/zzzgd/abc,這個地址是沒有任何匹配的接口的,按理來說會返回404,但是配置了網關就返回了這些信息,這個是我們配置的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"
}

上面的是根據地址來路由,還有下面多種路由配置:

根據域名來轉發路由:

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

b. 根據服務名路由到其他服務

我們知道,zuul是可以根據服務在eureka的serviceId,來將請求路由到不同的服務上,這也是網關最大的作用之一,gateway也可以

gateway可以通過開啟以下配置來打開根據服務的serviceId來匹配路由,默認是大寫:

# 配置gateway路由
spring:
cloud:
  gateway:
    discovery:
      locator:
        # 是否可以通過其他服務的serviceId來轉發到具體的服務實例。默認為false
        # 為true,自動創建路由,路由訪問方式:http://Gateway_HOST:Gateway_PORT/大寫的serviceId/**,其中微服務應用名默認大寫訪問
        enabled: true

開啟配置,重啟gateway,訪問 localhost:8088/SERVICE-CLIENT/hi?name=zgd,

正常返回了service-client的結果.

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

注意事項

不管小寫大寫,不能使用下劃線,否則會報:

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

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

如果開啟了lowerCaseServiceId,則只能用小寫,不能識別大寫,如果不開啟,只能識別大寫

除了上面這種自動設置路由服務,也可以手動設置,在routes中配置

這里使用的是gateway的其中一個過濾器工廠,去除請求地址前綴的過濾器

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

這里的uri不是一個具體的地址了,而是lb://開頭,加上serviceId

然后比如上面這個配置,我們 再調用 localhost:8088/to_client/hi?name=zgd

可以看到也正常收到了service-client的返回.說明我們調用到了這個服務.

這里需要注意的一點,如果不加上filters.- StripPrefix=1,那么則無法請求到hi這個接口。因為這個to_client相當于是服務名,只是為了網關的路由加上去的,對于服務提供者service-client來說,不需要這段地址,所以需要去掉

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

過濾

這個filters也是gateway的一個重要功能,過濾.

gateway內置的過濾器工廠有下面這些:

SpringCloud Gateway的基本入門和注意點詳解

除了上面用到的

  • 路徑前綴去除過濾器,還有
  • 添加請求參數過濾器
  • 添加請求頭過濾器
  • 添加響應頭過濾器
  • 移除響應頭過濾器

它可以修改我們請求的路徑,請求的參數,增加請求頭,或者響應頭等等

可以參考官方文檔

舉個例子,我們將application配置如下:

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

請求 localhost:8088/?username=zzzzzzz

它返回了它所受到的請求,將會看到返回數據中已經添加了一個age=18的請求參數,且請求頭也多了X-Request-Foo=Bar

b.代碼配置

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

/**
* @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();
}
}

啟動,訪問

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

成功!

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://zzzgd.blog.csdn.net/article/details/86095716

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 第一次做m被调教经历 | 天堂漫画破解版 | 国产尤物精品视频 | 亚洲图片 自拍偷拍 | caoporm国产精品视频免费 | 大学第一次基本都没了 | 免费观看www视频 | gav男人天堂 | 草综合| 午夜国产精品影院在线观看 | 色猪视频 | 青青草国产免费久久久91 | 日韩在线观看一区二区不卡视频 | 色老板在线视频观看 | 1717国产精品视频免费 | 婷婷激情综合五月天 | 国产精品久久久精品日日 | 激情视频图片小说qvdo | 2012在线观看免费视频大全 | 交换性关系中文字幕6 | 色先锋av资源中文字幕 | 日本一区二区免费在线观看 | 日本成熟bbxxxxxxxx | dasd817黑人在线播放 | 丝袜护士强制脚足取精 | 奇米影视在线视频8888 | 亚洲国产精品一区二区三区久久 | 精品国产国产综合精品 | 4444亚洲国产成人精品 | 国产肥老上视频 | 91嫩草私人成人亚洲影院 | 被黑人日| www.4虎影院 w7w7w7w7w免费 | 日本三级免费看 | 温柔校草高h | 无限在线观看免费入口 | 国产精品高清视亚洲一区二区 | 91色香sxmv最网页版新地址 | 国产精品www | 人人人人人看碰人人免费 | 国产99在线a视频 |