ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

spring-cloud-gateway(一)代码分析

2021-06-21 22:32:56  阅读:139  来源: 互联网

标签:exchange spring class rest requestEntity headers RequestEntity gateway cloud


谈不上核心分析

gateway 网关,本质是实现一层反向代理,client提交 获取request,提交给upstream 把upstream 返回的response 返回给client

查看spring-cloud-gateway的反向代理的实现位置

spring-cloud-gateway 提供两种方式的代理,传统的bio,spirng-mvc/serverlet/jetty, 最新的nio,spring webflux/netty

以最简单的get请求为例

对bio包spring-cloud-gateway-mvc

核心类

public class ProxyExchange<T> {
  ...
  private RestTemplate rest;
  public ResponseEntity<T> get() {
		RequestEntity<?> requestEntity = headers((BodyBuilder) RequestEntity.get(uri)).build();
		return exchange(requestEntity);
	}

	private ResponseEntity<T> exchange(RequestEntity<?> requestEntity) {
		Type type = this.responseType;
		if (type instanceof TypeVariable || type instanceof WildcardType) {
			type = Object.class;
		}
		return rest.exchange(requestEntity, ParameterizedTypeReference.forType(responseType));
	}	
}

关键是rest

package org.springframework.web.client;
public class RestTemplate extends InterceptingHttpAccessor implements RestOperations {

对nio 结构类似

包spring-cloud-gateway-webflux

public class ProxyExchange<T> {
	private WebClient rest;
	public Mono<ResponseEntity<T>> get() {
		RequestEntity<?> requestEntity = headers((BodyBuilder) RequestEntity.get(uri)).build();
		return exchange(requestEntity);
	}
  private Mono<ResponseEntity<T>> exchange(RequestEntity<?> requestEntity) {
		Type type = this.responseType;
		RequestBodySpec builder = rest.method(requestEntity.getMethod()).uri(requestEntity.getUrl())
				.headers(headers -> addHeaders(headers, requestEntity.getHeaders()));
		Mono<ClientResponse> result;
		if (requestEntity.getBody() instanceof Publisher) {
			@SuppressWarnings("unchecked")
			Publisher<Object> publisher = (Publisher<Object>) requestEntity.getBody();
			result = builder.body(publisher, Object.class).exchange();
		}
		else if (requestEntity.getBody() != null) {
			result = builder.body(BodyInserters.fromValue(requestEntity.getBody())).exchange();
		}
		else {
			if (hasBody) {
				result = builder.headers(headers -> addHeaders(headers, exchange.getRequest().getHeaders()))
						.body(exchange.getRequest().getBody(), DataBuffer.class).exchange();
			}
			else {
				result = builder.headers(headers -> addHeaders(headers, exchange.getRequest().getHeaders())).exchange();
			}
		}
		return result.flatMap(response -> response.toEntity(ParameterizedTypeReference.forType(type)));
	}
}

rest

package org.springframework.web.reactive.function.client;
public interface WebClient {}

class DefaultWebClient implements WebClient {
...
}

标签:exchange,spring,class,rest,requestEntity,headers,RequestEntity,gateway,cloud
来源: https://www.cnblogs.com/zihunqingxin/p/14916169.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有