音乐

Spring Cloud Gateway一次请求调用源码验证

2025-03-20 11:29:31 来源:音乐

能接受乞求

Spring Cloud Gateway的最上层开放性是netty,不能接受乞求的更为重要类是ReactorHttpHandlerAdapter,来作的真的很最简单,就是将netty的乞求、自发转变成http的乞求、自发并交还给一个http handler指派末尾的逻辑上,示意图为该类的源字符串仅仅保留举例来感叹逻辑上。

@Override

public Mono apply(HttpServerRequest request, HttpServerResponse response) {

NettyDataBufferFactory bufferFactory = new NettyDataBufferFactory(response.alloc());

ServerHttpRequest adaptedRequest;

ServerHttpResponse adaptedResponse;

//转换乞求

try {

adaptedRequest = new ReactorServerHttpRequest(request, bufferFactory);

adaptedResponse = new ReactorServerHttpResponse(response, bufferFactory);

}

catch (URISyntaxException ex) {

if (logger.isWarnEnabled()) {

}

return this.httpHandler.handle(adaptedRequest, adaptedResponse)

.do(ex -> logger.warn("Handling completed with error: " + ex.getMessage()))

.doOnSuccess(aVoid -> logger.debug("Handling completed with success"));

}

2 WEB去除氨基酸

http handler来作的真的第一是将request 和 response转变成一个exchange,这个exchange十分举例来感叹,是各个filter之间给定流转的载体,该类都有request、response、attributes(扩展字段),接着来作的真的就是web filter氨基酸的指派,其里的逻辑上主要是。

其里WebfilterChainParoxy 又就会引发出最初一条filter氨基酸,主要是必要、历史记录、认证相关的逻辑上,由此可见Spring Cloud Gateway的去除其设计是层层嵌套,扩展性较弱。

3 寻找传输法则

举例来感叹类是RoutePredicateHandlerMapping,逻辑上也十分最简单,就是把所有的route法则的predicate加载一遍看哪个predicate能够齐射,举例来感叹字符串是:

return this.routeLocator.getRoutes()

.filter(route -> {

return route.getPredicate().test(exchange);

})

因为我这里用的是path同步进行过滤,所以只不过的逻辑上是PathRoutePredicateFactory来完成的,除了PathRoutePredicateFactory还有很多predicate法则。

这些传输法则都能从官方所文档上找只不过。

4 举例来感叹去除氨基酸指派

找传输法则后下一步就是指派了,这里的举例来感叹类是FilteringWebHandler,其里的源字符串为:

来作的真的很最简单:

借助route最高级别的去除 借助全局去除 两种去除放到独自一人并根据order同步进行排序 指派去除氨基酸

因为我的配置里都有了一个填充乞求给定的逻辑上,所以红线箭头不远处就是我配置的gateway filter原称 AddRequestParameterGatewayFilterFactory,其余全是Gloabl Filter,这些去除的功能主要是url二阶,乞求投递,自发回来写到等逻辑上,因为我们这里用的是forward schema,所以乞求投递就会由ForwardRoutingFilter同步进行指派。

5 乞求投递

ForwardRoutingFilter来作的真的也很最简单,同样复用了spring mvc的灵活性,将乞求提交还给dispatcherHandler同步进行不远处置,dispatcherHandler就会根据path形容词找需要目标不远处置器指派逻辑上。

@Override

public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {

URI requestUrl = exchange.getRequiredAttribute(GATEWAY_REQUEST_URL_ATTR);

String scheme = requestUrl.getScheme();

if (isAlreadyRouted(exchange) || !"forward".equals(scheme)) {

return chain.filter(exchange);

}

setAlreadyRouted(exchange);

//TODO: translate url?

if (log.isTraceEnabled()) {

log.trace("Forwarding to URI: "+requestUrl);

}

return this.dispatcherHandler.handle(exchange);

}

6 自发回来写到

自发回来写到的举例来感叹类是NettyWriteResponseFilter,但是大家可以注意到指派器氨基酸里NettyWriteResponseFilter的排序是在最左边的,按道理这种自发不远处置的类无论如何是在靠后才对,这里的其设计相对精巧。大家可以看到chain.filter(exchange).then(),意指就是指派到我的时候同样跳过下一个,等末尾的去除都指派完后才指派这段逻辑上,这种行为控制的作法格外研修。

@Override

public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {

// NOTICE: nothing in "pre" filter stage as CLIENT_RESPONSE_ATTR is not added

// until the WebHandler is run

return chain.filter(exchange).then(Mono.defer(() -> {

HttpClientResponse clientResponse = exchange.getAttribute(CLIENT_RESPONSE_ATTR);

if (clientResponse == null) {

return Mono.empty();

}

log.trace("NettyWriteResponseFilter start");

ServerHttpResponse response = exchange.getResponse();

NettyDataBufferFactory factory = (NettyDataBufferFactory) response.bufferFactory();

//TODO: what if it's not netty

final Flux body = clientResponse.receive()

.retain() //TODO: needed?

.map(factory::wrap);

MediaType contentType = response.getHeaders().getContentType();

return (isStreamingMediaType(contentType) ?

response.writeAndFlushWith(body.map(Flux::just)) : response.writeWith(body));

}));

}

四 总结

总体读完Spring Cloud Gateway乞求不远处理过程字符串后,有几点想像:

去除是Spring Cloud Gateway最举例来感叹的其设计,甚至于可以夸张感叹Spring Cloud Gateway是一个去除氨基酸指派开放性而不是一个API点对点,因为API点对点实质的乞求投递、乞求自发回来写到都是在去除里来作的,这些是Spring Cloud Gateway感知不到的逻辑上。 Spring Cloud Gateway传输法则借助的基本功能具备改进的空间,因为是循环系统加载同步进行借助的,如果每个route法则并不多,predicate法则较多样,就可以考虑用map同步进行改进了,隔日route法则,predicate法则也不能很多样,考虑到到字符串的灵活性,举例来感叹方基本型也也没有什么问题。 作为API点对点开放性,必需了十分多的去除,如果有去除的修理功能可能就会能够,用户必需根据实质具体情况修理可避免的功能,只不过降低的逻辑上负担,在绑定使用量极大的API点对点场景,收入也就会很可观。

本文为阿里云原创内容,未经允许不得刊载。

经常熬夜喝酒抽烟肝不好怎么办
艾得辛和羟氯喹哪个见效快
阳了要吃什么药
黄褐斑怎么内调治疗最好
来氟米特片副作用
相关阅读

费城76人联系周琦了!两支NBA球队正在询问周琦!!!

自从伟拉去南半球为NBL而战以来,他就依然被人们谈论着。当然,不仅仅是我们国内的曼联,NBA的联赛也开始看他了。 来自苏群学长的一段话:“有两支NBA联赛刚刚质问周伟,其中的的一支...

杜锋有点不尊重吉林男篮,垃圾时长,派出奇葩阵容,恶心谁呢????

出来参杂迟早要还的,这句话非常有道理,好似潮州宁静如水,实为杜锋慌的一匹,险胜黑龙江,有太多弊端需总结。 赞许来到大壮谈论足球。今天,让我们来谈谈潮州和黑龙江的赛。我希望阜新球迷能给大壮一个免...

隔扣小写哥!听说骑士有位天才内线,今日一见名不虚传???

这个开关实在太可怕了! 想想过去的等奖项进球,加在兰先前;还有假动作,一步过霍乐迪,然后伪装吸引两个人的注意力,而不是吓坏人家跑动准确引导篮下! 莫布里拿球...

太开心了!吉林淘汰首钢挺进8弱!王晗紧握双拳:笑着笑着就快哭了

终场哨声响起,继上一连串压哨反败为胜后来,长春队80-75再胜成都邯郸市从而以大比分2-0成功进占了8强。 王晗指导,他这次一定会有绝技看板专业知识永生舞步,而是握住双拳以前傻呵呵...

李娜接班人身受一轮游!直言自己已没有女性特征,球迷:还是很美!!!

近日,里面国,杰出的女子网球田径王蔷,接受了媒体的报道。她在堪培拉球手上遇到了一轮巡回赛,并在这场250分的热身赛里面惜败了当地世锦赛阿雅瓦。作为李娜的接班人,王蔷目前的表现相当尽如人意,在接受...

友情链接