欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Cloud Gateway 攔截響應(yīng)問(wèn)題分析(數(shù)據(jù)截?cái)鄦?wèn)題)

 更新時(shí)間:2023年01月07日 14:36:10   作者:起風(fēng)哥  
這篇文章主要介紹了Spring Cloud Gateway 攔截響應(yīng)問(wèn)題分析(數(shù)據(jù)截?cái)鄦?wèn)題),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

Spring Cloud Gateway是Spring 官方基于Spring 5.0、Spring Boot 2.0和Project Reactor等技術(shù)開(kāi)發(fā)的網(wǎng)關(guān),Spring Cloud Gateway旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的、統(tǒng)一的 API 路由管理方式。

Spring Cloud Gateway 作為 Spring Cloud 生態(tài)系中的網(wǎng)關(guān),其目標(biāo)是替代 Netflix Zuul,它不僅提供統(tǒng)一的路由方式,并且基于Filter鏈的方式提供了網(wǎng)關(guān)基本的功能,如:安全、監(jiān)控/埋點(diǎn)和限流等。

Spring Cloud Gateway依賴Spring Boot和Spring WebFlux,基于Netty 運(yùn)行。不能在傳統(tǒng)的 servlet 容器中工作也不能構(gòu)建成war包。

關(guān)于Spring Cloud Gateway 核心概念

1、Route

Route 是網(wǎng)關(guān)的基礎(chǔ)元素,由 ID、目標(biāo) URI、斷言、過(guò)濾器組成。當(dāng)請(qǐng)求到達(dá)網(wǎng)關(guān)時(shí),由 Gateway HandlerMapping 通過(guò)斷言進(jìn)行路由匹配(Mapping),斷言為真時(shí)匹配到路由。

2、Predicate

Predicate 是 Java 8 中提供的一個(gè)函數(shù)。輸入類(lèi)型是 Spring Framework ServerWebExchange。它允許開(kāi)發(fā)人員匹配來(lái)自 HTTP 的請(qǐng)求,例如請(qǐng)求頭或者請(qǐng)求參數(shù)。簡(jiǎn)單來(lái)說(shuō)它就是匹配條件。

3、Filter

Filter是Gateway 中的過(guò)濾器,可以在請(qǐng)求發(fā)出前后進(jìn)行一些業(yè)務(wù)上的處理。

Spring Cloud Gateway 攔截響應(yīng)

最近因?yàn)樯湘溌纷粉櫤蟀l(fā)現(xiàn)如果在服務(wù)層將異常攔截掉,在鏈路追蹤界面上就不會(huì)顯示異常鏈路信息,除了服務(wù)異常意外,系統(tǒng)的異常不會(huì)觸發(fā)鏈路error,所以對(duì)服務(wù)層做了個(gè)變更,將所有未處理異常直接捕獲后統(tǒng)一封裝完拋出,這個(gè)時(shí)候就需要在網(wǎng)關(guān)層統(tǒng)一處理那么網(wǎng)關(guān)需要對(duì)響應(yīng)數(shù)據(jù)進(jìn)行攔截如果是 9999錯(cuò)誤碼,則封裝后返回,如果是其它響應(yīng)碼或者其它數(shù)據(jù)直接返回。

起初寫(xiě)法測(cè)試后發(fā)現(xiàn)數(shù)據(jù)過(guò)長(zhǎng)時(shí)被截?cái)唷?/p>

 return super.writeWith(fluxBody.map(dataBuffer -> {
	
 
	byte[] content = new byte[dataBuffer.readableByteCount()];
	
	dataBuffer.read(content);
	// 釋放掉內(nèi)存
	DataBufferUtils.release(dataBuffer);
	String str = new String(content, Charset.forName("UTF-8"));
 
	originalResponse.getHeaders().setContentLength(str.getBytes().length);
	log.error("gateway catch service exception error:"+ str);
	
	JsonResult result = new JsonResult();
	result.setCode(ErrorCode.SYS_EXCEPTION.getCode());
	result.setMessage(ErrorCode.SYS_EXCEPTION.getMsg());
	
	return bufferFactory.wrap(str.getBytes());
}));                   

查詢api后發(fā)現(xiàn)存在一個(gè)DataBufferFactory可以一次性join完所有數(shù)據(jù)后拼接就不會(huì)產(chǎn)生截?cái)鄦?wèn)題。

DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();

于是修改代碼如下

package com.server.gateway.filters;
 
import java.nio.charset.Charset;
import java.util.concurrent.atomic.AtomicReference;
 
import org.apache.http.protocol.HTTP;
import org.reactivestreams.Publisher;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
 
import com.framework.common.enums.ErrorCode;
import com.framework.common.web.JsonResult;
 
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
 
@Component
@Slf4j
public class WrapperResponseGlobalFilter implements GlobalFilter, Ordered{
 
	@Override
	public int getOrder() {
		// -1 is response write filter, must be called before that
		return -2;
	}
 
	@Override
	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
		ServerHttpResponse originalResponse = exchange.getResponse();
		DataBufferFactory bufferFactory = originalResponse.bufferFactory();
		ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
			@Override
			public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
				AtomicReference<String> bodyRef = new AtomicReference<>();
				if (body instanceof Flux) {
					Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body;
					
					return super.writeWith(fluxBody.buffer().map(dataBuffers -> {
						
						DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
						DataBuffer join = dataBufferFactory.join(dataBuffers);
						
						byte[] content = new byte[join.readableByteCount()];
						
						join.read(content);
						// 釋放掉內(nèi)存
						DataBufferUtils.release(join);
						String str = new String(content, Charset.forName("UTF-8"));
		
						originalResponse.getHeaders().setContentLength(str.getBytes().length);
						log.error("gateway catch service exception error:"+ str);
						
						JsonResult result = new JsonResult();
				        result.setCode(ErrorCode.SYS_EXCEPTION.getCode());
				        result.setMessage(ErrorCode.SYS_EXCEPTION.getMsg());
				        
						return bufferFactory.wrap(str.getBytes());
					}));
					
				}
				// if body is not a flux. never got there.
	                return super.writeWith(body);
	            }
	        };
	        // replace response with decorator
	        return chain.filter(exchange.mutate().response(decoratedResponse).build());
	    }
 
}

經(jīng)過(guò)如上修改后鏈路追蹤可以實(shí)現(xiàn)哪個(gè)服務(wù)出錯(cuò)就立馬出現(xiàn)鏈路異常馬上可以定位到哪個(gè)服務(wù)出現(xiàn)了未處理異常

到此這篇關(guān)于Spring Cloud Gateway 攔截響應(yīng)(數(shù)據(jù)截?cái)鄦?wèn)題)的文章就介紹到這了,更多相關(guān)Spring Cloud Gateway 攔截響應(yīng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot依賴注入的三種方式

    SpringBoot依賴注入的三種方式

    本文將通過(guò)代碼示例詳細(xì)介紹SpringBoot依賴注入的三種方式,對(duì)學(xué)習(xí)依賴注入有一定的參考價(jià)值,需要的朋友可以參考一下
    2023-04-04
  • SkyWalking自定義鏈路追蹤實(shí)現(xiàn)步驟

    SkyWalking自定義鏈路追蹤實(shí)現(xiàn)步驟

    本文詳細(xì)介紹了如何使用SkyWalking進(jìn)行自定義鏈路追蹤的步驟,包括POM文件依賴和邏輯業(yè)務(wù)代碼的編寫(xiě),文章最后推薦了腳本之家作為進(jìn)一步學(xué)習(xí)的資源
    2024-02-02
  • 解決spirngboot連接redis報(bào)錯(cuò):READONLY?You?can‘t?write?against?a?read?only?replica的問(wèn)題

    解決spirngboot連接redis報(bào)錯(cuò):READONLY?You?can‘t?write?against?

    docker部署的redis,springboot基本每天來(lái)連redis都報(bào)錯(cuò):READONLY?You?can't?write?against?a?read?only?replica,重啟redis后,可以正常連接。但是每天都重啟redis,不現(xiàn)實(shí),也很麻煩,今天給大家分享解決方式,感興趣的朋友一起看看吧
    2023-06-06
  • 已有的springcloud+mybatis項(xiàng)目升級(jí)為mybatis-plus的方法

    已有的springcloud+mybatis項(xiàng)目升級(jí)為mybatis-plus的方法

    這篇文章主要介紹了已有的springcloud+mybatis項(xiàng)目升級(jí)為mybatis-plus,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • ShardingSphere數(shù)據(jù)庫(kù)讀寫(xiě)分離算法及測(cè)試示例詳解

    ShardingSphere數(shù)據(jù)庫(kù)讀寫(xiě)分離算法及測(cè)試示例詳解

    這篇文章主要為大家介紹了ShardingSphere數(shù)據(jù)庫(kù)讀寫(xiě)分離算法及測(cè)試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • SpringBoot中讀取配置的七種方法總結(jié)

    SpringBoot中讀取配置的七種方法總結(jié)

    在Spring Boot應(yīng)用中,讀取配置是一項(xiàng)基礎(chǔ)且重要的任務(wù),Spring Boot提供了多種靈活的方式來(lái)讀取配置,以滿足不同場(chǎng)景下的需求,本文將詳細(xì)介紹Spring Boot中讀取配置的幾種常用方法,需要的朋友可以參考下
    2024-08-08
  • java.lang.FileNotFoundException 異常的正確解決方法(親測(cè)有效)

    java.lang.FileNotFoundException 異常的正確解決方法(親測(cè)有效)

    java.io.FileNotFoundException是一個(gè)在文件操作過(guò)程中常見(jiàn)的異常,它屬于IOException的一個(gè)子類(lèi),這篇文章主要介紹了java.lang.FileNotFoundException 異常的正確解決方法(親測(cè)有效),需要的朋友可以參考下
    2024-01-01
  • 反射機(jī)制:getDeclaredField和getField的區(qū)別說(shuō)明

    反射機(jī)制:getDeclaredField和getField的區(qū)別說(shuō)明

    這篇文章主要介紹了反射機(jī)制:getDeclaredField和getField的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • springmvc mybatis集成配置示例

    springmvc mybatis集成配置示例

    本文主要介紹springmvc+mybatis集成配置,這里提供了實(shí)例代碼,和簡(jiǎn)單說(shuō)明,有需要的小伙伴可以參考下
    2016-09-09
  • Spring的Aware接口實(shí)現(xiàn)及執(zhí)行順序詳解

    Spring的Aware接口實(shí)現(xiàn)及執(zhí)行順序詳解

    這篇文章主要為大家介紹了Spring的Aware接口實(shí)現(xiàn)及執(zhí)行順序詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評(píng)論