上海大型网站制作公司网站建设长尾关键词

diannao/2025/10/26 16:48:22/文章来源:
上海大型网站制作公司,网站建设长尾关键词,wordpress 判断登录,做网站营销1.前言 spring cloud gateway的基本组成和作用就不细赘述#xff0c;此篇适合对此有一定了解的人阅读。 spring cloud gateway版本: Hoxton.SR1 spring cloud gateway的配置使用yml配置#xff1a; server:port: 9527y#根据微服务名称进行动态路由的配置 spring:applicati…1.前言 spring cloud gateway的基本组成和作用就不细赘述此篇适合对此有一定了解的人阅读。 spring cloud gateway版本: Hoxton.SR1 spring cloud gateway的配置使用yml配置 server:port: 9527y#根据微服务名称进行动态路由的配置 spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true #开启从注册中心动态创建路由的功能利用微服务名称进行路由routes: - id: config-clienturi: lb://config-clientpredicates:- Path/config/**filters:- RewritePath/config/?(?segment.*),/config/v1/$\{segment}2. 流程图 先看一张官网文档给的图此图大概描述了请求的处理原理各个组件大致的位置。 3.源码剖析 http底层处理是基于nettynetty是一个高性能异步事件驱动的通讯框架对于netty的处理流程可以查阅其源码。netty读取完数据经过pipeline管道处理后最终调用到reactor.netty.http.server.HttpServerHandle#onStateChange方法。然后经过层层方法调用到核心类org.springframework.web.reactive.DispatcherHandler#handle public MonoVoid handle(ServerWebExchange exchange) {if (this.handlerMappings null) {//没有合适的handler返回失败return createNotFoundError();}return Flux.fromIterable(this.handlerMappings)//mapping.getHandler是关键方法根据handlerMapping找到对应的handler.concatMap(mapping - mapping.getHandler(exchange)).next().switchIfEmpty(createNotFoundError())//invokeHandler是关键方法调用处理逻辑.flatMap(handler - invokeHandler(exchange, handler))//处理结果写出.flatMap(result - handleResult(exchange, result));}private MonoHandlerResult invokeHandler(ServerWebExchange exchange, Object handler) {if (this.handlerAdapters ! null) {for (HandlerAdapter handlerAdapter : this.handlerAdapters) {if (handlerAdapter.supports(handler)) {//查找合适的handlerAdapter处理默认会调用到SimpleHandlerAdapter#handlereturn handlerAdapter.handle(exchange, handler);}}}return Mono.error(new IllegalStateException(No HandlerAdapter: handler));}private MonoVoid handleResult(ServerWebExchange exchange, HandlerResult result) {return getResultHandler(result).handleResult(exchange, result).checkpoint(Handler result.getHandler() [DispatcherHandler]).onErrorResume(ex -result.applyExceptionHandler(ex).flatMap(exResult - {String text Exception handler exResult.getHandler() , error\ ex.getMessage() \ [DispatcherHandler];return getResultHandler(exResult).handleResult(exchange, exResult).checkpoint(text);}));}private HandlerResultHandler getResultHandler(HandlerResult handlerResult) {if (this.resultHandlers ! null) {for (HandlerResultHandler resultHandler : this.resultHandlers) {if (resultHandler.supports(handlerResult)) {return resultHandler;}}}throw new IllegalStateException(No HandlerResultHandler for handlerResult.getReturnValue());}handlerMappings的注入类看下图最后通过RoutePredicateHandlerMapping找到合适的处理类。handlerMappings中的其他几种Mapping方式是别的策略或者配置时会用到可以思考是怎么用的。 先来看看mapping.getHandler的处理逻辑默认会调用到org.springframework.web.reactive.handler.AbstractHandlerMapping#getHandler Overridepublic MonoObject getHandler(ServerWebExchange exchange) {//getHandlerInternal根据exchange真正去查找合适的处理handler根据上面解释//getHandlerInternal调用到RoutePredicateHandlerMapping类中去return getHandlerInternal(exchange).map(handler - {if (logger.isDebugEnabled()) {logger.debug(exchange.getLogPrefix() Mapped to handler);}//跨域处理if (hasCorsConfigurationSource(handler)) {ServerHttpRequest request exchange.getRequest();CorsConfiguration config (this.corsConfigurationSource ! null ? this.corsConfigurationSource.getCorsConfiguration(exchange) : null);CorsConfiguration handlerConfig getCorsConfiguration(handler, exchange);config (config ! null ? config.combine(handlerConfig) : handlerConfig);if (!this.corsProcessor.process(config, exchange) || CorsUtils.isPreFlightRequest(request)) {return REQUEST_HANDLED_HANDLER;}}return handler;});}现在调用到了org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping#getHandlerInternal方法中这里一个关键点就来了。Predicates断言是路由配置的关键根据predicates的结果满足的话就会转发请求到对应的Router配置的uri上。 Overrideprotected Mono? getHandlerInternal(ServerWebExchange exchange) {// dont handle requests on management port if set and different than server portif (this.managementPortType DIFFERENT this.managementPort ! null exchange.getRequest().getURI().getPort() this.managementPort) {return Mono.empty();}exchange.getAttributes().put(GATEWAY_HANDLER_MAPPER_ATTR, getSimpleName());//lookupRoute(exchange)去查找满足断言条件的路由Routerreturn lookupRoute(exchange)// 满足的router会被组装到exchange中然后返回webHandler.flatMap((FunctionRoute, Mono?) r - {exchange.getAttributes().remove(GATEWAY_PREDICATE_ROUTE_ATTR);if (logger.isDebugEnabled()) {logger.debug(Mapping [ getExchangeDesc(exchange) ] to r);}exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, r);return Mono.just(webHandler);}).switchIfEmpty(Mono.empty().then(Mono.fromRunnable(() - {exchange.getAttributes().remove(GATEWAY_PREDICATE_ROUTE_ATTR);if (logger.isTraceEnabled()) {logger.trace(No RouteDefinition found for [ getExchangeDesc(exchange) ]);}})));}protected MonoRoute lookupRoute(ServerWebExchange exchange) {return this.routeLocator.getRoutes()// 遍历所有的Router此行r.getPredicate().apply(exchange)是验证是否满足断言要求// 满足的Router会被返回.concatMap(route - Mono.just(route).filterWhen(r - {// add the current route we are testingexchange.getAttributes().put(GATEWAY_PREDICATE_ROUTE_ATTR, r.getId());return r.getPredicate().apply(exchange);})// instead of immediately stopping main flux due to error, log and// swallow it.doOnError(e - logger.error(Error applying predicate for route: route.getId(),e)).onErrorResume(e - Mono.empty()))// .defaultIfEmpty() put a static Route not found// or .switchIfEmpty()// .switchIfEmpty(Mono.Routeempty().log(noroute)).next()// TODO: error handling.map(route - {if (logger.isDebugEnabled()) {logger.debug(Route matched: route.getId());}validateRoute(route, exchange);return route;});/** TODO: trace logging if (logger.isTraceEnabled()) {* logger.trace(RouteDefinition did not match: routeDefinition.getId()); }*/}apply调用进入org.springframework.cloud.gateway.handler.AsyncPredicate.DefaultAsyncPredicate#apply方法查看delegate.test(t)调用的实现类可以发现所有断言的调用此处根据我们配置的断言规则调用对应的断言返回Boolean。 通过断言拿到对应的handler后回到DispatcherHandler#handle方法接下来调用invokeHandler(exchange, handler) //这个handler 是 FilteringWehHandler private MonoHandlerResult invokeHandler(ServerWebExchange exchange, Object handler) {if (this.handlerAdapters ! null) {for (HandlerAdapter handlerAdapter : this.handlerAdapters) {if (handlerAdapter.supports(handler)) {//使用SimpleHandlerAdapter来处理return handlerAdapter.handle(exchange, handler);}}}return Mono.error(new IllegalStateException(No HandlerAdapter: handler));}然后调用org.springframework.web.reactive.result.SimpleHandlerAdapter#handle Overridepublic MonoHandlerResult handle(ServerWebExchange exchange, Object handler) {WebHandler webHandler (WebHandler) handler;//handler是FilteringWehHandler所以调用到FilteringWehHandler.handleMonoVoid mono webHandler.handle(exchange);return mono.then(Mono.empty());}org.springframework.cloud.gateway.handler.FilteringWebHandler#handle Overridepublic MonoVoid handle(ServerWebExchange exchange) {Route route exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);//取出之前匹配的Router取出filters如果配置了的话ListGatewayFilter gatewayFilters route.getFilters();//GatewayFilter和globalFilter合并并按order排序ListGatewayFilter combined new ArrayList(this.globalFilters);combined.addAll(gatewayFilters);// TODO: needed or cached?AnnotationAwareOrderComparator.sort(combined);if (logger.isDebugEnabled()) {logger.debug(Sorted gatewayFilterFactories: combined);}//进入过滤链调用filtersreturn new DefaultGatewayFilterChain(combined).filter(exchange);}Overridepublic MonoVoid filter(ServerWebExchange exchange) {return Mono.defer(() - {if (this.index filters.size()) {GatewayFilter filter filters.get(this.index);//index 每次1设置到chain中传递到下一次filter下一次filter时取就是next的filterDefaultGatewayFilterChain chain new DefaultGatewayFilterChain(this,this.index 1);//filter链执行return filter.filter(exchange, chain);}else {return Mono.empty(); // complete}});}filter链很重要是spring cloud gateway的扩展点可以做扩展逻辑比如权限校验登录认证日志等。默认情况下的filter链如下需要关注一下LoadBalancerClientFilter和NettyRoutingFilter org.springframework.cloud.gateway.filter.LoadBalancerClientFilter#filter OverrideSuppressWarnings(Duplicates)public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {URI url exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR);//使用协议 http还是lbString schemePrefix exchange.getAttribute(GATEWAY_SCHEME_PREFIX_ATTR);if (url null|| (!lb.equals(url.getScheme()) !lb.equals(schemePrefix))) {return chain.filter(exchange);}// 保存原始请求urladdOriginalRequestUrl(exchange, url);if (log.isTraceEnabled()) {log.trace(LoadBalancerClientFilter url before: url);}//根据注册中心的信息使用负载均衡算法找一个可用的服务final ServiceInstance instance choose(exchange);if (instance null) {throw NotFoundException.create(properties.isUse404(),Unable to find instance for url.getHost());}URI uri exchange.getRequest().getURI();// if the lb:scheme mechanism was used, use scheme as the default,// if the loadbalancer doesnt provide one.String overrideScheme instance.isSecure() ? https : http;if (schemePrefix ! null) {overrideScheme url.getScheme();}//替换成真实服务器的地址后续调用使用URI requestUrl loadBalancer.reconstructURI(new DelegatingServiceInstance(instance, overrideScheme), uri);if (log.isTraceEnabled()) {log.trace(LoadBalancerClientFilter url chosen: requestUrl);}exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, requestUrl);return chain.filter(exchange);}org.springframework.cloud.gateway.filter.NettyRoutingFilter#filter 处理http和https请求的发送 OverrideSuppressWarnings(Duplicates)public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {URI requestUrl exchange.getRequiredAttribute(GATEWAY_REQUEST_URL_ATTR);String scheme requestUrl.getScheme();if (isAlreadyRouted(exchange)|| (!http.equals(scheme) !https.equals(scheme))) {return chain.filter(exchange);}setAlreadyRouted(exchange);ServerHttpRequest request exchange.getRequest();final HttpMethod method HttpMethod.valueOf(request.getMethodValue());final String url requestUrl.toASCIIString();HttpHeaders filtered filterRequest(getHeadersFilters(), exchange);final DefaultHttpHeaders httpHeaders new DefaultHttpHeaders();filtered.forEach(httpHeaders::set);boolean preserveHost exchange.getAttributeOrDefault(PRESERVE_HOST_HEADER_ATTRIBUTE, false);Route route exchange.getAttribute(GATEWAY_ROUTE_ATTR);//发送请求FluxHttpClientResponse responseFlux httpClientWithTimeoutFrom(route).headers(headers - {headers.add(httpHeaders);// Will either be set below, or later by Nettyheaders.remove(HttpHeaders.HOST);if (preserveHost) {String host request.getHeaders().getFirst(HttpHeaders.HOST);headers.add(HttpHeaders.HOST, host);}}).request(method).uri(url).send((req, nettyOutbound) - {if (log.isTraceEnabled()) {nettyOutbound.withConnection(connection - log.trace(outbound route: connection.channel().id().asShortText() , inbound: exchange.getLogPrefix()));}return nettyOutbound.send(request.getBody().map(dataBuffer - ((NettyDataBuffer) dataBuffer).getNativeBuffer()));}).responseConnection((res, connection) - {// Defer committing the response until all route filters have run// Put client response as ServerWebExchange attribute and write// response later NettyWriteResponseFilterexchange.getAttributes().put(CLIENT_RESPONSE_ATTR, res);exchange.getAttributes().put(CLIENT_RESPONSE_CONN_ATTR, connection);ServerHttpResponse response exchange.getResponse();// put headers and status so filters can modify the responseHttpHeaders headers new HttpHeaders();res.responseHeaders().forEach(entry - headers.add(entry.getKey(), entry.getValue()));String contentTypeValue headers.getFirst(HttpHeaders.CONTENT_TYPE);if (StringUtils.hasLength(contentTypeValue)) {exchange.getAttributes().put(ORIGINAL_RESPONSE_CONTENT_TYPE_ATTR,contentTypeValue);}setResponseStatus(res, response);// make sure headers filters run after setting status so it is// available in responseHttpHeaders filteredResponseHeaders HttpHeadersFilter.filter(getHeadersFilters(), headers, exchange, Type.RESPONSE);if (!filteredResponseHeaders.containsKey(HttpHeaders.TRANSFER_ENCODING) filteredResponseHeaders.containsKey(HttpHeaders.CONTENT_LENGTH)) {// It is not valid to have both the transfer-encoding header and// the content-length header.// Remove the transfer-encoding header in the response if the// content-length header is present.response.getHeaders().remove(HttpHeaders.TRANSFER_ENCODING);}exchange.getAttributes().put(CLIENT_RESPONSE_HEADER_NAMES,filteredResponseHeaders.keySet());response.getHeaders().putAll(filteredResponseHeaders);return Mono.just(res);});Duration responseTimeout getResponseTimeout(route);if (responseTimeout ! null) {responseFlux responseFlux.timeout(responseTimeout, Mono.error(new TimeoutException(Response took longer than timeout: responseTimeout))).onErrorMap(TimeoutException.class,th - new ResponseStatusException(HttpStatus.GATEWAY_TIMEOUT,th.getMessage(), th));}return responseFlux.then(chain.filter(exchange));}以上就是请求进来的处理过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

源码站友情链接是外链吗

#pragma 求助编辑 pragma - 必应词典美[prɡmə]英[prɡmə]n.〔计〕杂注网络编译指示;显示编译指示;特殊指令 百科名片 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些…

网站中的游戏是怎么做的手机更新wordpress

基于Springboot开发的JavaWeb作业查重系统[附源码] 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统 &a…

网站是怎样建立的流程是什么个人博客系统毕业设计论文

转载自 一次动态代理的填坑之旅 背景 想在现有的接口加上熔断降级或者限流的功能,比较好的方式是通过注解的方式,并基于动态代理进行实现,下面代码是Rhino的实现 Rhino public class ServiceImpl {Degrade(rhinoKey "syncMethod-0&…

手机怎么制作网站教程步骤微信公号嵌入网站开发

目录 1、获取桌面路径 法一:利用winshell库 法二:利用winreg库 2、获取系统盘符 3、获取电脑用户名 4、获取软件自启动存放目录 1、获取桌面路径 法一:利用winshell库 import winshell print(winshell.desktop()) 法二:利…

侧边栏jquery网站后台自己做的网站怎么删除

如何退出Activity?如何安全退出已调用多个Activity的Application?对于单一Activity的应用来说,退出很简单,直接finish()即可。当然,也可以用killProcess()和System.exit()这样的方法。但是,对于多Activity的…

泗阳做网站长春代做网站

1、在首页新品、热卖、精品等调用商品销售打开 includes/lib_goods.php在文件尾部?>前添加以下代码:function get_buy_sum($goods_id){$sql "select sum(goods_number) from " . $GLOBALS[ecs]->table(order_goods) . " AS g ,".$GLOBA…

中创高科官方网站wordpress 邮件代码

Python 类变量和成员变量类与对象的方法我们已经讨论了类与对象的功能部分,现在我们来看一下它的数据部分。事实上,它们只是与类和对象的名称空间 绑定 的普通变量,即这些名称只在这些类与对象的前提下有效。有两种类型的 域 ——类的变量和对…

橙色的网站中小型网站建设与管理设计总结

x现在没时间,留个坑 转载于:https://www.cnblogs.com/smzd/p/11634665.html

郴州做网站公司室内设计资源网

通过添加语言,你可以更改用于在 Windows、应用和 Web 中读取和写入的语言。添加语言若要更改你的 Windows 显示语言或者添加键盘以进行键入,首先要将一种语言添加到语言列表中。从屏幕右边缘向中间轻扫,点击“设置”,然后点击“更…

宁波专业外贸网站建设做网站的具体步骤

274. H 指数 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 **h 指数。 根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她&a…

易销云建站公司东莞seo优化公司

题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则…

企业网站建设知乎丽水建设公司网站

家人们 今天从老杨那里又学到新东西了&#xff01; 赶紧来看看吧 第一个方法&#xff1a; // 使用ref声明一个变量const tel useRef(null)const pass useRef(null) 再给input 内标签属性里面绑定 ref{变量名} <inputclassName{style.inputs}type"text"placeh…

网站设计英语WordPress文章图片怎么上传

根据Github Trendings的统计&#xff0c;今日(2023-12-23统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目6C项目2C项目1Jupyter Notebook项目1HTML项目1Go项目1非开发语言项目1 免费API集体清单 创建周期…

免费的企业网页制作网站北京备案网站负责人

1.引言   随着网络技术的飞速发展和普及&#xff0c;进入了信息大爆炸的时代。信息无处不在&#xff0c;给我们的学习生活带来了诸多便捷&#xff0c;由于堪称海量的信息量&#xff0c;我们从中获取有用的信息变得困难&#xff0c;解决这一难题就是要对这些大量的信息进行分…

域名cn是个什么网站微信网站怎么建立

单片机串口通过查询接收数据,同时具备接收超时、异常判断,常规通用处理算法实现;1、实现过程 (1)初始化串口:首先,需要配置串口的基本参数,如波特率、数据位、停止位和校验位等。这通常涉及到GPIO引脚的配置(如PA2为发送引脚,PA3为接收引脚),以及USART的初始化。 …

个人网站制作代码网站怎么加友情链接

详见&#xff1a; http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp61 在不同地域的用户访问网站的响应速度存在差异,为了提高用户访问的响应速度、优化现有Internet中信息的流动,需要在用户和服务器间加入中间层CDN. 使用户能以最快的速度&#xff0c;从最接近用…

路由器可以做网站服务器吗wordpress 分类列表插件

CAN总线由其高可靠和实时性被广泛应用于新能源汽车、轨道交通、医疗、工程机械等行业&#xff0c;本文介绍CAN总线关闭对新能源汽车的功能和安全性能产生的影响&#xff0c;并针对工程师关注的问题&#xff0c;提供有效的解决方案。2020年10月28日全球汽车峰会中展示了未来新能…

织梦网站名称修改wordpress怎么接入支付

多语言应用开发中本地化信息对照表。包含区域编号、本地化名称、英语名称、中文名称、国家地区码、语言代码和流通币种等。区域编号本地化名称英语名称中文名称国家地区语言流通币种排序id-idBahasa IndonesiaIndonesian印度尼西亚语IDidIDR1ms-myBahasa MelayuMalay (Malaysia…

自贡网站制作在线制作网站源码

第十二章 Linux系统管理&#xff08;进程管理、工作管理和系统定时任务&#xff09;&#xff08;二&#xff09; 十、Linux 终止进程&#xff08;kill命令&#xff09; Linux kill命令详解&#xff1a;终止进程 kill 从字面来看&#xff0c;就是用来杀死进程的命令&#xff…

网站系统管理员模块广西上林建设局网站

前言&#xff1a; 介绍员工信息&#xff1a;一个小型公司的人员信息管理系统 某小型公司&#xff0c;主要有四类人员&#xff1a;经理、技术人员、销售经理和推销员。现在&#xff0c;需要存储这些人员的姓名、编号、级别、当前薪水。计算月薪总额并显示全部信息人员编号基数为…