亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

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

摘要:添加相關(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)依賴之后, Spring Cloud Gateway 的處理流程如下所示:

image

Spring Cloud Gateway 入口 -> WebFlux 的 DefaultWebFilterChain

Spring Cloud Gateway 是基于 Spring WebFlux 開(kāi)發(fā)的異步響應(yīng)式網(wǎng)關(guān),異步響應(yīng)式代碼比較難以理解和閱讀,我這里給大家分享一種方法去理解,通過(guò)這個(gè)流程來(lái)理解 Spring Cloud Gateway 的工作流程以及底層原理。其實(shí)可以理解為,上圖這個(gè)流程,就是拼出來(lái)一個(gè)完整的 Mono(或者 Flux)流,最后 subscribe 執(zhí)行。

當(dāng)收到一個(gè)請(qǐng)求的時(shí)候,會(huì)經(jīng)過(guò) org.springframework.web.server.handler.DefaultWebFilterChain,這是 WebFilter 的調(diào)用鏈,這個(gè)鏈路包括三個(gè) WebFilter:

  • org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter:添加 Prometheus 相關(guān)依賴之后,會(huì)有這個(gè) MetricsWebFilter,用于記錄請(qǐng)求處理耗時(shí),采集相關(guān)指標(biāo)。
  • org.springframework.cloud.sleuth.instrument.web.TraceWebFilter:添加 Spring Cloud Sleuth 相關(guān)依賴之后,會(huì)有這個(gè) TraceWebFilter。
  • org.springframework.cloud.gateway.handler.predicate.WeightCalculatorWebFilter:Spring Cloud Gateway 路由權(quán)重相關(guān)配置功能相關(guān)實(shí)現(xiàn)類,這個(gè)我們這里不關(guān)心。

在這個(gè) DefaultWebFilterChain 會(huì)形成這樣一個(gè) Mono,我們依次將他們標(biāo)記出來(lái),首先是入口代碼 org.springframework.web.server.handler.DefaultWebFilterChain#filter

public Mono filter(ServerWebExchange exchange) {	return Mono.defer(() ->	        // this.currentFilter != null 代表 WebFilter 鏈還沒(méi)有結(jié)束	        // this.chain != null 代表 WebFilter 鏈不為空			this.currentFilter != null && this.chain != null ?					//在 WebFilter 鏈沒(méi)有結(jié)束的情況下,調(diào)用 WebFilter					invokeFilter(this.currentFilter, this.chain, exchange) :					//在 WebFilter 結(jié)束的情況下,調(diào)用 handler 					this.handler.handle(exchange));}

對(duì)于我們這里的 WebFilter 鏈的第一個(gè) MetricsWebFilter,假設(shè)啟用了對(duì)應(yīng)的采集統(tǒng)計(jì)的話,這時(shí)候生成的 Mono 就是:

return Mono.defer(() ->	chain.filter(exchange).transformDeferred((call) -> {		long start = System.nanoTime();		return call				//成功時(shí),記錄響應(yīng)時(shí)間				.doOnSuccess((done) -> MetricsWebFilter.this.onSuccess(exchange, start))				//失敗時(shí),記錄響應(yīng)時(shí)間和異常				.doOnError((cause) -> MetricsWebFilter.this.onError(exchange, start, cause));	}););

這里為了方便,我們對(duì)代碼做了簡(jiǎn)化,由于我們要將整個(gè)鏈路的所有 Mono 和 Flux 拼接在一起行程完整鏈路,所以原本是 MetricsWebFilter中的 onSuccess(exchange, start)方法,被改成了 MetricsWebFilter.this.onSuccess(exchange, start) 這種偽代碼。

接著,根據(jù)DefaultWebFilterChain 的源碼分析,chain.filter(exchange) 會(huì)繼續(xù) WebFilter 鏈路,到達(dá)下一個(gè) WebFilter,即 TraceWebFilter。經(jīng)過(guò) TraceWebFilter,Mono 就會(huì)變成:

return Mono.defer(() ->	new MonoWebFilterTrace(source, chain.filter(exchange), TraceWebFilter.this.isTracePresent(), TraceWebFilter.this, TraceWebFilter.this.spanFromContextRetriever()).transformDeferred((call) -> {		//MetricsWebFilter 相關(guān)的處理,在前面的代碼中給出了,這里省略	}););

可以看出,在 TraceWebFilter 中,整個(gè)內(nèi)部 Mono (chain.filter(exchange) 后續(xù)的結(jié)果)都被封裝成了一個(gè) MonoWebFilterTrace,這也是保持鏈路追蹤信息的關(guān)鍵實(shí)現(xiàn)。

繼續(xù) WebFilter 鏈路,經(jīng)過(guò)最后一個(gè) WebFilter WeightCalculatorWebFilter; 這個(gè) WebFilter 我們不關(guān)心,里面對(duì)路由權(quán)重做了一些計(jì)算操作,我們這里直接忽略即可。這樣我們就走完了所有 WebFilter 鏈路,來(lái)到了最后的調(diào)用 DefaultWebFilterChain.this.handler,這個(gè) handler 就是 org.springframework.web.reactive.DispatcherHandler。在 DispatcherHandler 中,我們會(huì)計(jì)算出路由并發(fā)送請(qǐng)求到符合條件的 GatewayFilter。經(jīng)過(guò) DispatcherHandler,Mono 會(huì)變成:

return Mono.defer(() ->	new MonoWebFilterTrace(source, 		Flux.fromIterable(DispatcherHandler.this.handlerMappings) //讀取所有的 handlerMappings			.concatMap(mapping -> mapping.getHandler(exchange)) //按順序調(diào)用所有的 handlerMappings 的 getHandler 方法,如果有對(duì)應(yīng)的 Handler 會(huì)返回,否則返回 Mono.empty();			.next() //找到第一個(gè)返回不是 Mono.empty() 的 Handler			.switchIfEmpty(DispatcherHandler.this.createNotFoundError()) //如果沒(méi)有返回不為 Mono.empty() 的 handlerMapping,則直接返回 404			.flatMap(handler -> DispatcherHandler.this.invokeHandler(exchange, handler)) //調(diào)用對(duì)應(yīng)的 Handler			.flatMap(result -> DispatcherHandler.this.handleResult(exchange, result)), //處理結(jié)果	TraceWebFilter.this.isTracePresent(), TraceWebFilter.this, TraceWebFilter.this.spanFromContextRetriever()).transformDeferred((call) -> {		//MetricsWebFilter 相關(guān)的處理,在前面的代碼中給出了,這里省略	}););

handlerMappings 包括:

  • org.springframework.boot.actuate.endpoint.web.reactive.WebFluxEndPointHandlerMapping:由于我們項(xiàng)目中添加了 Actuator 相關(guān)依賴,所以這里有這個(gè) HandlerMapping。Actuator 相關(guān)路徑映射,不是我們這里關(guān)心的。但是可以看出,Actuator 相關(guān)路徑優(yōu)先于 Spring Cloud Gateway 配置路由
  • org.springframework.boot.actuate.endpoint.web.reactive.ControllerEndpointHandlerMapping:由于我們項(xiàng)目中添加了 Actuator 相關(guān)依賴,所以這里有這個(gè) HandlerMapping。使用 @ControllerEndpoint 或者 @RestControllerEndpoint 注解標(biāo)注的 Actuator 相關(guān)路徑映射,不是我們這里關(guān)心的。
  • org.springframework.web.reactive.function.server.support.RouterFunctionMapping:在 Spring-WebFlux 中,你可以定義很多不同的 RouterFunction 來(lái)控制路徑路由,但這也不是我們這里關(guān)心的。但是可以看出,自定義的 RouterFunction 會(huì)優(yōu)先于 Spring Cloud Gateway 配置路由
  • org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerMapping:針對(duì) @RequestMapping 注解的路徑的 HandlerMapping,不是我們這里關(guān)心的。但是可以看出,如果你在 Spring Cloud Gateway 中指定 RequestMapping 路徑,會(huì)優(yōu)先于 Spring Cloud Gateway 配置路由
  • org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping:這個(gè)是 Spring Cloud Gateway 的 HandlerMapping,會(huì)讀取 Spring Cloud Gateway 配置并生成路由。這個(gè)是我們這里要詳細(xì)分析的。

其實(shí)這些 handlerMappings,我們這里肯定走的是 RoutePredicateHandlerMapping 的相關(guān)邏輯,所以我們的 Mono 又可以簡(jiǎn)化成:

 return Mono.defer(() ->	new MonoWebFilterTrace(source, 		RoutePredicateHandlerMapping.this.getHandler(exchange)			.switchIfEmpty(DispatcherHandler.this.createNotFoundError()) //如果沒(méi)有返回不為 Mono.empty() 的 handlerMapping,則直接返回 404			.flatMap(handler -> DispatcherHandler.this.invokeHandler(exchange, handler)) //調(diào)用對(duì)應(yīng)的 Handler			.flatMap(result -> DispatcherHandler.this.handleResult(exchange, result)), //處理結(jié)果	TraceWebFilter.this.isTracePresent(), TraceWebFilter.this, TraceWebFilter.this.spanFromContextRetriever()).transformDeferred((call) -> {		//MetricsWebFilter 相關(guān)的處理,在前面的代碼中給出了,這里省略	}););

我們來(lái)看 RoutePredicateHandlerMapping,首先這些 handlerMapping 都是繼承了抽象類 org.springframework.web.reactive.handler.AbstractHandlerMapping, 前面我們拼接的 Mono 里面的 getHandler 的實(shí)現(xiàn)其實(shí)就在這個(gè)抽象類中:

 public Mono getHandler(ServerWebExchange exchange) {	//調(diào)用抽象方法 getHandlerInternal 獲取真正的 Handler	return getHandlerInternal(exchange).map(handler -> {		//這里針對(duì) handler 做一些日志記錄		if (logger.isDebugEnabled()) {			logger.debug(exchange.getLogPrefix() + "Mapped to " + handler);		}		// 跨域處理		ServerHttpRequest request = exchange.getRequest();		if (hasCorsConfigurationSource(handler) || CorsUtils.isPreFlightRequest(request)) {			CorsConfiguration config = (this.corsConfigurationSource != null ?					this.corsConfigurationSource.getCorsConfiguration(exchange) : null);			CorsConfiguration handlerConfig = getCorsConfiguration(handler, exchange);			config = (config != null ? config.combine(handlerConfig) : handlerConfig);			if (config != null) {				config.validateAllowCredentials();			}			if (!this.corsProcessor.process(config, exchange) || CorsUtils.isPreFlightRequest(request)) {				return NO_OP_HANDLER;			}		}		return handler;	});}

可以看出,其實(shí)核心就是每個(gè)實(shí)現(xiàn)類的 getHandlerInternal(exchange) 方法,所以在我們拼接的 Mono 中,我們會(huì)忽略抽象類中的針對(duì) handler 之后的 map 處理。

return Mono.defer(() ->	new MonoWebFilterTrace(source, 		RoutePredicateHandlerMapping.this.getHandlerInternal(exchange)			.switchIfEmpty(DispatcherHandler.this.createNotFoundError()) //如果沒(méi)有返回不為 Mono.empty() 的 handlerMapping,則直接返回 404			.flatMap(handler -> DispatcherHandler.this.invokeHandler(exchange, handler)) //調(diào)用對(duì)應(yīng)的 Handler			.flatMap(result -> DispatcherHandler.this.handleResult(exchange, result)), //處理結(jié)果	TraceWebFilter.this.isTracePresent(), TraceWebFilter.this, TraceWebFilter.this.spanFromContextRetriever()).transformDeferred((call) -> {		//MetricsWebFilter 相關(guān)的處理,在前面的代碼中給出了,這里省略	}););

接下來(lái)經(jīng)過(guò) RoutePredicateHandlerMappinggetHandlerInternal(exchange) 方法,我們的 Mono 變成了:

return Mono.defer(() ->	new MonoWebFilterTrace(source, 		RoutePredicateHandlerMapping.this.lookupRoute(exchange) //根據(jù)請(qǐng)求尋找路由				.flatMap((Function>) r -> {					exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, r); //將路由放入 Attributes 中,后面我們還會(huì)用到					return Mono.just(RoutePredicateHandlerMapping.this.webHandler); //返回 RoutePredicateHandlerMapping 的 FilteringWebHandler				}).switchIfEmpty( //如果為 Mono.empty(),也就是沒(méi)找到路由					Mono.empty() //返回 Mono.empty()					.then(Mono.fromRunnable(() -> { //返回 Mono.empty() 之后,記錄日志						if (logger.isTraceEnabled()) {							logger.trace("No RouteDefinition found for [" + getExchangeDesc(exchange) + "]");					}				})))			.switchIfEmpty(DispatcherHandler.this.createNotFoundError()) //如果沒(méi)有返回不為 Mono.empty() 的 handlerMapping,則直接返回 404			.flatMap(handler -> DispatcherHandler.this.invokeHandler(exchange, handler)) //調(diào)用對(duì)應(yīng)的 Handler			.flatMap(result -> DispatcherHandler.this.handleResult(exchange, result)), //處理結(jié)果	TraceWebFilter.this.isTracePresent(), TraceWebFilter.this, TraceWebFilter.this.spanFromContextRetriever()).transformDeferred((call) -> {		//MetricsWebFilter 相關(guān)的處理,在前面的代碼中給出了,這里省略	}););

RoutePredicateHandlerMapping.this.lookupRoute(exchange) 根據(jù)請(qǐng)求尋找路由,這個(gè)我們就不詳細(xì)展開(kāi)了,其實(shí)就是根據(jù)你的 Spring Cloud Gateway 配置,找到合適的路由。接下來(lái)我們來(lái)看調(diào)用對(duì)應(yīng)的 Handler,即 FilteringWebHandler。DispatcherHandler.this.invokeHandler(exchange, handler) 我們這里也不詳細(xì)展開(kāi),我們知道其實(shí)就是調(diào)用 Handler 的 handle 方法,即 FilteringWebHandler 的 handle 方法,所以 我們的 Mono 變成了:

return Mono.defer(() ->	new MonoWebFilterTrace(source, 		RoutePredicateHandlerMapping.this.lookupRoute(exchange) //根據(jù)請(qǐng)求尋找路由				.flatMap((Function>) r -> {					exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, r); //將路由放入 Attributes 中,后面我們還會(huì)用到					return Mono.just(RoutePredicateHandlerMapping.this.webHandler); //返回 RoutePredicateHandlerMapping 的 FilteringWebHandler				}).switchIfEmpty( //如果為 Mono.empty(),也就是沒(méi)找到路由					Mono.empty() 					.then(Mono.fromRunnable(() -> { //返回 Mono.empty() 之后,記錄日志						if (logger.isTraceEnabled()) {							logger.trace("No RouteDefinition found for [" + getExchangeDesc(exchange) + "]");					}				})))			.switchIfEmpty(DispatcherHandler.this.createNotFoundError()) //如果沒(méi)有返回不為 Mono.empty() 的 handlerMapping,則直接返回 404			.then(FilteringWebHandler.this.handle(exchange).then(Mono.empty())) //調(diào)用對(duì)應(yīng)的 Handler			.flatMap(result -> DispatcherHandler.this.handleResult(exchange, result)), //處理結(jié)果	TraceWebFilter.this.isTracePresent(), TraceWebFilter.this, TraceWebFilter.this.spanFromContextRetriever()).transformDeferred((call) -> {		//MetricsWebFilter 相關(guān)的處理,在前面的代碼中給出了,這里省略	}););

由于調(diào)用對(duì)應(yīng)的 Handler,最后返回的是 Mono.empty(),所以后面的 flatMap 其實(shí)不會(huì)執(zhí)行了。所以我們可以將最后的處理結(jié)果這一步去掉。所以我們的 Mono 就變成了:

return Mono.defer(() ->	new MonoWebFilterTrace(source, 		RoutePredicateHandlerMapping.this.lookupRoute(exchange) //根據(jù)請(qǐng)求尋找路由				.flatMap((Function>) r -> {					exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, r); //將路由放入 Attributes 中,后面我們還會(huì)用到					return Mono.just(RoutePredicateHandlerMapping.this.webHandler); //返回 RoutePredicateHandlerMapping 的 FilteringWebHandler				}).switchIfEmpty( //如果為 Mono.empty(),也就是沒(méi)找到路由					Mono.empty() 					.then(Mono.fromRunnable(() -> { //返回 Mono.empty() 之后,記錄日志						if (logger.isTraceEnabled()) {							logger.trace("No RouteDefinition found for [" + getExchangeDesc(exchange) + "]");					}				})))			.switchIfEmpty(DispatcherHandler.this.createNotFoundError()) //如果沒(méi)有返回不為 Mono.empty() 的 handlerMapping,則直接返回 404			.then(FilteringWebHandler.this.handle(exchange).then(Mono.empty()))), //調(diào)用對(duì)應(yīng)的 Handler	TraceWebFilter.this.isTracePresent(), TraceWebFilter.this, TraceWebFilter.this.spanFromContextRetriever()).transformDeferred((call) -> {		//MetricsWebFilter 相關(guān)的處理,在前面的代碼中給出了,這里省略	}););

FilteringWebHandler.this.handle(exchange) 其實(shí)就是從 Attributes 中取出路由,從路由中取出對(duì)應(yīng)的 GatewayFilters,與全局 GatewayFilters 放到同一個(gè) List 中,并按照這些 GatewayFilter 的順序排序(可以通過(guò)實(shí)現(xiàn) org.springframework.core.Ordered 接口來(lái)制定順序),然后生成 DefaultGatewayFilterChain 即 GatewayFilter 鏈路。對(duì)應(yīng)的源碼是:

public Mono handle(ServerWebExchange exchange) {	//從 Attributes 中取出路由,從路由中取出對(duì)應(yīng)的 GatewayFilters	Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);	List gatewayFilters = route.getFilters();	//與全局 GatewayFilters 放到同一個(gè) List 中	List combined = new ArrayList<>(this.globalFilters);	combined.addAll(gatewayFilters);	//按照這些 GatewayFilter 的順序排序(可以通過(guò)實(shí)現(xiàn) `org.springframework.core.Ordered` 接口來(lái)制定順序)	AnnotationAwareOrderComparator.sort(combined);		if (logger.isDebugEnabled()) {		logger.debug("Sorted gatewayFilterFactories: " + combined);	}	//生成調(diào)用鏈	return new DefaultGatewayFilterChain(combined).filter(exchange);}

這個(gè) GatewayFilter 調(diào)用鏈和 WebFilter 調(diào)用鏈類似,參考 DefaultGatewayFilterChain 的源碼:

public Mono filter(ServerWebExchange exchange) {	return Mono.defer(() -> {		//如果鏈路沒(méi)有結(jié)束,則繼續(xù)鏈路		if (this.index < filters.size()) {			GatewayFilter filter = filters.get(this.index);			//這里將 index + 1,也就是調(diào)用鏈路中的下一個(gè) GatewayFilter			DefaultGatewayFilterChain chain = new DefaultGatewayFilterChain(this, this.index + 1);			//每個(gè) filter 中如果想要繼續(xù)鏈路,則會(huì)調(diào)用 chain.filter(exchange),這也是我們開(kāi)發(fā) GatewayFilter 的時(shí)候的使用方式			return filter.filter(exchange, chain);		}		else {			//到達(dá)末尾,鏈路結(jié)束			return Mono.empty(); // complete		}	});}

所以,經(jīng)過(guò) DefaultGatewayFilterChain 后,我們的 Mono 就會(huì)變成:

return Mono.defer(() ->	new MonoWebFilterTrace(source, 		RoutePredicateHandlerMapping.this.lookupRoute(exchange) //根據(jù)請(qǐng)求尋找路由				.flatMap((Function>) r -> {					exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, r); //將路由放入 Attributes 中,后面我們還會(huì)用到					return Mono.just(RoutePredicateHandlerMapping.this.webHandler); //返回 RoutePredicateHandlerMapping 的 FilteringWebHandler				}).switchIfEmpty( //如果為 Mono.empty(),也就是沒(méi)找到路由					Mono.empty() 					.then(Mono.fromRunnable(() -> { //返回 Mono.empty() 之后,記錄日志						if (logger.isTraceEnabled()) {							logger.trace("No RouteDefinition found for [" + getExchangeDesc(exchange) + "]");					}				})))			.switchIfEmpty(DispatcherHandler.this.createNotFoundError()) //如果沒(méi)有返回不為 Mono.empty() 的 handlerMapping,則直接返回 404			.then(new DefaultGatewayFilterChain(combined).filter(exchange).then(Mono.empty()))), //調(diào)用對(duì)應(yīng)的 Handler	TraceWebFilter.this.isTracePresent(), TraceWebFilter.this, TraceWebFilter.this.spanFromContextRetriever()).transformDeferred((call) -> {		//MetricsWebFilter 相關(guān)的處理,在前面的代碼中給出了,這里省略	}););

再繼續(xù)展開(kāi) DefaultGatewayFilterChain 的鏈路調(diào)用,可以得到:

return Mono.defer(() ->	new MonoWebFilterTrace(source, 		RoutePredicateHandlerMapping.this.lookupRoute(exchange) //根據(jù)請(qǐng)求尋找路由				.flatMap((Function>) r -> {					exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, r); //將路由放入 Attributes 中,后面我們還會(huì)用到					return Mono.just(RoutePredicateHandlerMapping.this.webHandler); //返回 RoutePredicateHandlerMapping 的 FilteringWebHandler				}).switchIfEmpty( //如果為 Mono.empty(),也就是沒(méi)找到路由					Mono.empty() 					.then(Mono.fromRunnable(() -> { //返回 Mono.empty() 之后,記錄日志						if (logger.isTraceEnabled()) {							logger.trace("No RouteDefinition found for [" + getExchangeDesc(exchange) + "]");					}				})))			.switchIfEmpty(DispatcherHandler.this.createNotFoundError()) //如果沒(méi)有返回不為 Mono.empty() 的 handlerMapping,則直接返回 404			.then(				Mono.defer(() -> {					//如果鏈路沒(méi)有結(jié)束,則繼續(xù)鏈路					if (DefaultGatewayFilterChain.this.index < DefaultGatewayFilterChain.this.filters.size()) {						GatewayFilter filter = DefaultGatewayFilterChain.this.filters.get(DefaultGatewayFilterChain.this.index);						//這里將 index + 1,也就是調(diào)用鏈路中的下一個(gè) GatewayFilter						DefaultGatewayFilterChain chain = new DefaultGatewayFilterChain(DefaultGatewayFilterChain.this, DefaultGatewayFilterChain.this.index + 1);						//每個(gè) filter 中如果想要繼續(xù)鏈路,則會(huì)調(diào)用 chain.filter(exchange),這也是我們開(kāi)發(fā) GatewayFilter 的時(shí)候的使用方式						return filter.filter(exchange, chain);					}					else {						return Mono.empty(); //鏈路完成					}				})				.then(Mono.empty()))			), //調(diào)用對(duì)應(yīng)的 Handler	TraceWebFilter.this.isTracePresent(), TraceWebFilter.this, TraceWebFilter.this.spanFromContextRetriever()).transformDeferred((call) -> {		//MetricsWebFilter 相關(guān)的處理,在前面的代碼中給出了,這里省略	}););

這樣,就形成了 Spring Cloud Gateway 針對(duì)路由請(qǐng)求的完整 Mono 調(diào)用鏈。

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/125381.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)過(guò)將請(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 基本

    摘要:將請(qǐng)求封裝成將請(qǐng)求封裝成的接口定義是但是最外層傳進(jìn)來(lái)的參數(shù)是和,需要將他們封裝成,這個(gè)工作就是在中做的。其實(shí)主要任務(wù)就是將各種參數(shù)封裝成除了和本次請(qǐng)求相關(guān)的和,還有會(huì)話管理器,編碼解碼器配置,國(guó)際化配置還有用于擴(kuò)展。本系列代碼地址:https://github.com/JoJoTec/spring-cloud-parent接下來(lái),將進(jìn)入我們升級(jí)之路的又一大模塊,即網(wǎng)關(guān)模塊。網(wǎng)關(guān)模塊我們廢棄了...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • 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-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元查看
<