成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

SpringCloud升級(jí)之路2020.0.x版-41. SpringCloudGateway 基本

不知名網(wǎng)友 / 2379人閱讀

摘要:將請(qǐng)求封裝成將請(qǐng)求封裝成的接口定義是但是最外層傳進(jìn)來的參數(shù)是和,需要將他們封裝成,這個(gè)工作就是在中做的。其實(shí)主要任務(wù)就是將各種參數(shù)封裝成除了和本次請(qǐng)求相關(guān)的和,還有會(huì)話管理器,編碼解碼器配置,國(guó)際化配置還有用于擴(kuò)展。

本系列代碼地址:https://github.com/JoJoTec/spring-cloud-parent

接下來,將進(jìn)入我們升級(jí)之路的又一大模塊,即網(wǎng)關(guān)模塊。網(wǎng)關(guān)模塊我們廢棄了已經(jīng)進(jìn)入維護(hù)狀態(tài)的 zuul,選用了 Spring Cloud Gateway 作為內(nèi)部網(wǎng)關(guān)。為何選擇 Spring Cloud Gateway 而不是 nginx 還有 Kong 的原因是:

  1. 項(xiàng)目組對(duì)于 Java 更加熟悉,并且對(duì)于 Project Reactor 異步編程也比較熟悉,這個(gè)比較重要
  2. 需要在網(wǎng)關(guān)中使用我們之前實(shí)現(xiàn)的基于請(qǐng)求的有狀態(tài)重試的壓力敏感的負(fù)載均衡器
  3. 需要在網(wǎng)關(guān)中實(shí)現(xiàn)重試
  4. 需要在網(wǎng)關(guān)中實(shí)現(xiàn)實(shí)例路徑斷路
  5. 需要在網(wǎng)關(guān)中進(jìn)行業(yè)務(wù)統(tǒng)一加解密
  6. 需要在網(wǎng)關(guān)中實(shí)現(xiàn) BFF(Backends For Frontends)接口,即根據(jù)客戶端請(qǐng)求,將某幾個(gè)不同接口的請(qǐng)求一次性組合返回
  7. 需要在網(wǎng)關(guān)中使用 Redis 記錄一些與 Token 相關(guān)的值

因此,我們使用了 Spring Cloud Gateway 作為內(nèi)部網(wǎng)關(guān),接下來,我們就來依次實(shí)現(xiàn)上面說的這些功能。同時(shí)在本次升級(jí)使用過程中, Spring Cloud Gateway 也有一些坑,例如:

  1. 結(jié)合使用 spring-cloud-sleuth 會(huì)有鏈路信息追蹤,但是某些情況鏈路信息會(huì)丟失。
  2. 對(duì)于三方 Reactor 封裝的異步 API (例如前面提到的操作 Redis 使用的 spring-data-redis)理解不到位導(dǎo)致關(guān)鍵線程被占用

但是首先,我們需要簡(jiǎn)單理解下 Spring Cloud Gateway 究竟包括哪些組件以及整個(gè)調(diào)用流程是什么樣子的。由于 Spring Cloud Gateway 基于 Spring-Boot 和 Spring-Webflux 實(shí)現(xiàn),所以我們會(huì)從外層 WebFilter 開始說明,然后分析如何走到 Spring Cloud Gateway 的封裝邏輯,以及 Spring Cloud Gateway 包含的組件,請(qǐng)求是如何轉(zhuǎn)發(fā)出去,回來后又經(jīng)過了哪些處理,這些我們都會(huì)逐一分析。

創(chuàng)建一個(gè)簡(jiǎn)單的 API 網(wǎng)關(guān)

為了詳細(xì)分析流程,我們先來創(chuàng)建一個(gè)簡(jiǎn)單的網(wǎng)關(guān),用于快速上手并分析。

首先創(chuàng)建依賴:

pom.xml

			spring-cloud-parent		com.github.jojotech		2020.0.3-SNAPSHOT		4.0.0	spring-cloud-api-gateway						com.github.jojotech			spring-cloud-webflux			${project.version}							org.springframework.cloud			spring-cloud-starter-gateway			

parent 指向了我們項(xiàng)目的 spring-cloud-parent,同時(shí)加入了上一節(jié)實(shí)現(xiàn)的 spring-cloud-webflux 依賴,同時(shí)還需要加入 spring-cloud-starter-gateway,由于在我們的 spring-cloud-parent 已經(jīng)指定了 spring-cloud-parent 的版本依賴管理,所以這里不需要指定 spring-cloud-starter-gateway 的版本

然后,我們開始編寫配置文件:

application.yml

server:  ##端口為 8181  port: 8181spring:  application:    # 微服務(wù)名稱是 apiGateway    name: apiGateway  cloud:    gateway:      httpclient:        # 網(wǎng)關(guān)轉(zhuǎn)發(fā)到其他微服務(wù)的 HTTP 連接超時(shí)為 500ms        connect-timeout: 500        # 網(wǎng)關(guān)轉(zhuǎn)發(fā)到其他微服務(wù)的 HTTP 響應(yīng)超時(shí)為 500ms        response-timeout: 60000      routes:        # 編寫轉(zhuǎn)發(fā)規(guī)則        - id: first_route          # 轉(zhuǎn)發(fā)到微服務(wù) test-service          uri: lb://test-service          # 包含哪些路徑          predicates:            - Path=/test-ss/**          #  轉(zhuǎn)發(fā)到的微服務(wù)訪問路徑,去掉路徑中的第一塊,即去掉 /test-ss          filters:            - StripPrefix=1    loadbalancer:      # 指定 zone,因?yàn)槲覀冎霸谪?fù)載均衡中加入了只有同一個(gè) zone 的實(shí)例才能互相訪問的邏輯      zone: test      ribbon:        # 關(guān)閉ribbon        enabled: false      cache:        # 本地微服務(wù)實(shí)例列表緩存時(shí)間        ttl: 5        # 緩存大小,你的微服務(wù)調(diào)用多少個(gè)其他微服務(wù),大小就設(shè)置為多少,默認(rèn)256        capacity: 256    discovery:      client:        simple:          # 使用 spring-common 中的簡(jiǎn)單 DiscoveryClient 服務(wù)發(fā)現(xiàn)客戶端,就是將微服務(wù)實(shí)例寫死在配置文件中          instances:            # 指定微服務(wù) test-service 的實(shí)例列表            test-service:              - host: httpbin.org                port: 80                metadata:                  # 指定該實(shí)例的 zone,因?yàn)槲覀冎霸谪?fù)載均衡中加入了只有同一個(gè) zone 的實(shí)例才能互相訪問的邏輯                   zone: testeureka:  client:    # 關(guān)掉 eureka    enabled: false

最后編寫啟動(dòng)入口類:

package com.github.jojotech.spring.cloud.apigateway;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(scanBasePackages = "com.github.jojotech.spring.cloud.apigateway")public class Application {	public static void main(String[] args) {		SpringApplication.run(Application.class, args);	}}

啟動(dòng),訪問路徑: http://127.0.0.1:8181/test-ss/anything,可以看到請(qǐng)求被發(fā)送到 httpbin.org 的 anything 路徑中,這個(gè)接口會(huì)返回請(qǐng)求中的所有信息。

這樣,我們就實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的網(wǎng)關(guān)。接下來我們來詳細(xì)分析其工作流程和源碼。

異步環(huán)境下請(qǐng)求處理的核心 - Spring Boot + Spring WebFlux 的 WebHandler

我們創(chuàng)建的簡(jiǎn)易網(wǎng)關(guān),外層的服務(wù)容器其實(shí)就是基于 Netty 和 Project Reactor 的容器,我們跳過這些,直接進(jìn)入 Spring Boot 相關(guān)的處理邏輯。我們只需要知道,請(qǐng)求和其對(duì)應(yīng)的響應(yīng),會(huì)被外層的容器封裝成為 ServerHttpRequest requestServerHttpResponse response(都在 org.springframework.http.server.reactive 這個(gè)包下)。

然后,會(huì)交由 WebHandler 進(jìn)行處理。WebHandler 的實(shí)現(xiàn),其實(shí)是一種責(zé)任鏈裝飾模式,如下圖所示。每一層的 WebHandler 會(huì)將 requestresponse 進(jìn)行對(duì)應(yīng)自己責(zé)任的裝飾,然后交給內(nèi)層的 WebHandler 處理。

image

HttpWebHandlerAdapter - 將請(qǐng)求封裝成 ServerWebExchange

WebHandler 的接口定義是:

public interface WebHandler {	Mono handle(ServerWebExchange exchange);}

但是最外層傳進(jìn)來的參數(shù)是 requestresponse,需要將他們封裝成 ServerWebExchange,這個(gè)工作就是在 HttpWebHandlerAdapter 中做的。HttpWebHandlerAdapter 其實(shí)主要任務(wù)就是將各種參數(shù)封裝成 ServerWebExchange(除了和本次請(qǐng)求相關(guān)的 requestresponse,還有會(huì)話管理器 SessionManager,編碼解碼器配置,國(guó)際化配置還有 ApplicationContext 用于擴(kuò)展)。

除了這些,處理 Forwarded 還有 X-Forwarded* 相關(guān)的 Header 的配置邏輯,也在這里進(jìn)行。然后將封裝好的 ServerWebExchange 交給內(nèi)層的 WebHandlerExceptionHandlingWebHandler 繼續(xù)處理。同時(shí),從源碼中可以看出,交給內(nèi)層處理的 Mono 還加入了異常處理和記錄響應(yīng)信息的邏輯:

HttpWebHandlerAdapter.java

//交給內(nèi)層處理封裝好的 `ServerWebExchange`return getDelegate().handle(exchange)        //記錄響應(yīng)日志,trace 級(jí)別,一般用不上		.doOnSuccess(aVoid -> logResponse(exchange))		//處理內(nèi)層沒有處理的異常,一般不會(huì)走到這里		.onErrorResume(ex -> handleUnresolvedError(exchange, ex))		//在所有處理完成后,將 response 設(shè)為 complete		.then(Mono.defer(response::setComplete));

剩下的內(nèi)層的 WebHandler,我們將在下一節(jié)中繼續(xù)分析

微信搜索“我的編程喵”關(guān)注公眾號(hào),每日一刷,輕松提升技術(shù),斬獲各種offer

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/125101.html

相關(guān)文章

  • SpringCloud升級(jí)之路2020.0.x-41. SpringCloudGateway 基本

    摘要:在這里,會(huì)將上下文中載入的拼接成,然后調(diào)用其方法的,它是的處理請(qǐng)求業(yè)務(wù)的起點(diǎn)。添加相關(guān)依賴之后,會(huì)有這個(gè)。路由權(quán)重相關(guān)配置功能相關(guān)實(shí)現(xiàn)類,這個(gè)我們這里不關(guān)心。本系列代碼地址:https://github.com/JoJoTec/spring-cloud-parent我們繼續(xù)分析上一節(jié)提到的 WebHandler,經(jīng)過將請(qǐng)求封裝成 ServerWebExchange 的 HttpWebHand...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • SpringCloud升級(jí)之路2020.0.x-41. SpringCloudGateway 基本

    摘要:在這里,會(huì)將上下文中載入的拼接成,然后調(diào)用其方法的,它是的處理請(qǐng)求業(yè)務(wù)的起點(diǎn)。添加相關(guān)依賴之后,會(huì)有這個(gè)。路由權(quán)重相關(guān)配置功能相關(guān)實(shí)現(xiàn)類,這個(gè)我們這里不關(guān)心。 本系列代碼地址:??https://github.com/JoJoTec/spring-cloud-parent??我們繼續(xù)分析上一節(jié)提到的 ??WebHandle...

    番茄西紅柿 評(píng)論0 收藏2637
  • SpringCloud升級(jí)之路2020.0.x-41. SpringCloudGateway 基本

    摘要:升級(jí)之路版基本流程講解抽象類本系列代碼地址我們繼續(xù)分析上一節(jié)提到的。添加相關(guān)依賴之后,會(huì)有這個(gè)。路由權(quán)重相關(guān)配置功能相關(guān)實(shí)現(xiàn)類,這個(gè)我們這里不關(guān)心。這個(gè)是的,會(huì)讀取配置并生成路由。 本系列代碼地址:??https://github.com/JoJoTec/spring-cloud-parent??我們繼續(xù)分析上一節(jié)提到的 ...

    番茄西紅柿 評(píng)論0 收藏2637
  • SpringCloud升級(jí)之路2020.0.x-41. SpringCloudGateway 基本

    摘要:添加相關(guān)依賴之后,會(huì)有這個(gè)。接著,根據(jù)的源碼分析,會(huì)繼續(xù)鏈路,到達(dá)下一個(gè),即。在中,我們會(huì)計(jì)算出路由并發(fā)送請(qǐng)求到符合條件的。這個(gè)是的,會(huì)讀取配置并生成路由。本系列代碼地址:https://github.com/JoJoTec/spring-cloud-parent我們繼續(xù)分析上一節(jié)提到的 WebHandler。加入 Spring Cloud Sleuth 以及 Prometheus 相關(guān)依賴...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • SpringCloud升級(jí)之路2020.0.x-37. 實(shí)現(xiàn)異步的客戶端封裝配置管理的意義與設(shè)計(jì)

    摘要:對(duì)于異步的請(qǐng)求,使用的是異步客戶端即。要實(shí)現(xiàn)的配置設(shè)計(jì)以及使用舉例要實(shí)現(xiàn)的配置設(shè)計(jì)以及使用舉例首先,我們要實(shí)現(xiàn)的,其包含三個(gè)重試重試的要在負(fù)載均衡之前,因?yàn)橹卦嚨臅r(shí)候,我們會(huì)從負(fù)載均衡器獲取另一個(gè)實(shí)例進(jìn)行重試,而不是在同一個(gè)實(shí)例上重試多次。 本系列代碼地址:https://github.com/JoJoTec/spring-cloud-parent 為何需要封裝異步 HT...

    fxp 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<