热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vb网页客户端发送请求给winform服务端_一次网页性能调优实践

在公司产品中发现某个网页加载速度比较慢,打开F12查看“网络”发现有大概300个并发请求,包括html,js,image&#

在公司产品中发现某个网页加载速度比较慢,打开F12查看“网络”发现有大概300个并发请求,包括html,js,image,API等,而且很多请求都会排队很长时间,在Chrome中观察每次最多是并发处理6个请求,所以可能是浏览器的行为导致了并发请求处理慢,在网上找到了官方解释,每个浏览器有同域名请求的最大并发限制。如果同时只有6个并发连接数数量,那网页打开的时候只能依赖于这6条线程,前面如果有打开慢的内容,就会直接影响到后面的内容打开。如果同时有更多的并发连接数,这样就会大大的提高网页加载速度。但是浏览器为什么限制并发请求数呢?有过多线程编程经验的开发人员应该明白这个道理,如果浏览器启用太多的线程,线程上下文切换会带来很大的系统开销,过多的连接也会导致操作系统的TCP/IP协议栈资源迅速耗尽,因此负责任的浏览器才有对请求并发数的限制。

浏览器的限制

一些主流浏览器对HTTP 1.1和HTTP 1.0的最大并发连接数目,可以参考如下表格:
浏览器HTTP /1.0HTTP /1.1
IE(6,7)24
IE866
Firefox66
Safari44
Chrome66
Opera44

我们通过修改配置也能修改并发连接数,IE就可以通过修改注册表来修改最大并发连接数,很多客户端软件可以修改电脑的最大连接数,比如:迅雷、暴风影音等。

问题分析

既然每种浏览器对于HTTP /1.0和HTTP /1.1都有限制,而且是因为请求排队导致网页加载慢。因此,一种方法是重构代码,尽量把多个请求合并成一个请求,减少请求数。第二种方法就是突破浏览器同源请求并发数的限制。第一种方法,改动比较大,服务器和前端程序都需要重构,代价比较大。因此想从第二种方案入手,了解到HTTP/2可能是一种方案,因为HTTP/2使用的是多路复用技术,支持在同一个TCP连接上发送无限个HTTP请求,且这些请求的生命期可以重叠,因此避免了同源并发个数限制的问题。

初识HTTP/2

HTTP/2 (原名HTTP/2.0)即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。是自1999年http1.1发布后的首个更新。HTTP 2.0在2013年8月进行首次合作共事性测试。在开放互联网上HTTP 2.0将只用于https://网址,而 http://网址将继续使用HTTP/1,目的是在开放互联网上增加使用加密技术,以提供强有力的保护去遏制主动攻击。DANE RFC6698允许域名管理员不通过第三方CA自行发行证书。HTTP/2使用的是SPDY协议,下面是维基百科的定义
SPDY(发音如英语:speedy),一种开放的网络传输协议,由Google开发,用来发送网页内容。基于传输控制协议(TCP)的应用层协议 。Google最早是在Chromium中提出的SPDY协议。目前已经被用于Google Chrome浏览器中来访问Google的SSL加密服务。SPDY并不是首字母缩略字,而仅仅是"speedy"的缩写。SPDY现为Google的商标。
SPDY当前并不是一个标准协议,但SPDY的开发组已经开始推动SPDY成为正式标准(现为互联网草案,HTTP/2主要以SPDY技术为主。Google Chrome,Mozilla Firefox,Opera和Internet Explorer[]均已支持SPDY协议。SPDY协议类似于HTTP,但旨在缩短网页的加载时间和提高安全性。SPDY协议通过压缩、多路复用和优先级来缩短加载时间。

HTTP/2优势

多路复用

请求都是通过一个 TCP 连接并发完成。HTTP/1.x 虽然能利用一个连接完成多次请求,但是多个请求之间是有先后顺序的,后面发送的请求必须等待上一个请求返回才能发送响应。这会很容易导致后面的请求被阻塞,而 HTTP/2 做到了真正的并发请求。同时, 流还支持优先级和流量控制。

压缩头部

HTTP/2 对消息头采用 HPACK 进行压缩传输,能够节省消息头占用的网络的流量。而 HTTP/1.x 每次请求,都会携带大量冗余头信息,浪费了很多带宽资源。头压缩能够很好的解决该问题。

二进制传输

HTTP/2 采用二进制格式传输数据,而非 HTTP/1.x 的文本格式。二进制格式在协议的解析和优化扩展上带来更多的优势和可能。HTTP/2引入二进制数据帧和流的概念,其中帧对数据进行顺序标识,浏览器收到数据之后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况。同样是因为有了序列,服务器就可以并行的传输数据,这就是流所做的事情。

Server Push

服务端能够更快的把资源推送给客户端。例如服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 再发送这些请求。当客户端需要的时候,它已经在客户端了。
比如说你有一个网站,所有的页面都会在一个名为 styles.css 的外部样式表中,定义各种样式。当用户向服务器请求 index.html 时,我们可以在发送 index.html 的同时,向用户推送 styles.css。afdff9091b0a17de1877f5b72859ecc3.png相比等待服务器发送 index.html,然后等待浏览器请求并接收 styles.css,用户现在只需等待1次服务器响应,就可在初次请求同时使用 index.html 和 styles.css。

Nginx中HTTP/2配置

HTTP/2大部分浏览器都已经支持,大部分的Web Server都可以配置,比如Tomcat,Nginx,IIS等。我们的项目使用的是Nginx,下面我介绍一下在Nginx中如何配置HTTP2.
步骤一,安装Nginx
Nginx支持HTTP2需要满足以下三个条件:
  • nginx的版本必须在1.9.5以上
  • openssl的版本必须在1.0.2e及以上
  • Nginx中需要添加--with-http_v2_module模块
  • 必须有自签证书或者CA证书,支持HTTPS
我项目中使用的是openrestry,使用的是Docker安装,镜像来自docker-openresty,包括了with-http_v2_module和openssl,都已经满足HTTP/2的要求,只需要配置自签证书。可以通过以下命令查看你的环境下的Nginx是否满足要求。

/usr/local/nginx/sbin/nginx -V 048ac6101b91d89414a6b29e74b82c24.png

步骤二,生成自签证书

1: 到需要放置证书的目录(选在nginx的conf目录下就可以),建立服务器的私钥(此过程需输入密码短语)
openssl genrsa -des3 -out server.key 10242: 创建证书签名请求csr
openssl req -new -key server.key -out server.csr3:对于使用上面私钥启动具有ssl功能的nginx,有必要移除输出的密码
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key4: 使用上面的私钥和CSR对证书进行签名
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

步骤三,配置证书

    server {listen       443 ssl;server_name  localhost;ssl_certificate     server.crt;ssl_certificate_key  server.key;
    }

步骤四,配置HTTP/2
配置HTTP/2比较简单,如下

    server {listen       443 ssl http2;server_name  localhost;ssl_certificate     server.crt;ssl_certificate_key  server.key;
    }

步骤五,验证配置是否生效
使用Chrome打开网站,检查Protocol是否是h2,默认浏览器没有显示Protocol这一列,右键列头,选中Protocol,Protocol这一列会出现,如果没有生效,会显示http/1.1,如果生效,则会显示h2,如下图。034bd91f2f9e7ec7f29330e69e6e3248.png

写在最后

HTTP/2 除了突破了浏览器并发请求数的限制外,还带来另外一个好处。传统网页性能优化的常用方法是JS合并,通过JS打包工具,比如webpacker,把多个js文件打包成一个JS文件,然后前端请求时只需请求一个js文件,大大减少了HTTP的请求次数。但也会导致一个问题,任意一个js文件发生了修改,都会重新打包,浏览器会重新请求服务器,而不是从缓存中加载,但HTTP/2,模块就可以单独的压缩上线,而不影响其他没有修改的模块。

参考文章

https://segmentfault.com/a/1190000011172823
https://www.cnblogs.com/bugutian/p/6628455.html
https://blog.csdn.net/wetest_tencent/article/details/78808337




推荐阅读
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • Cosmos生态系统为何迅速崛起,波卡作为跨链巨头应如何应对挑战?
    Cosmos生态系统为何迅速崛起,波卡作为跨链巨头应如何应对挑战? ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • Python全局解释器锁(GIL)机制详解
    在Python中,线程是操作系统级别的原生线程。为了确保多线程环境下的内存安全,Python虚拟机引入了全局解释器锁(Global Interpreter Lock,简称GIL)。GIL是一种互斥锁,用于保护对解释器状态的访问,防止多个线程同时执行字节码。尽管GIL有助于简化内存管理,但它也限制了多核处理器上多线程程序的并行性能。本文将深入探讨GIL的工作原理及其对Python多线程编程的影响。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 高端存储技术演进与趋势
    本文探讨了高端存储技术的发展趋势,包括松耦合架构、虚拟化、高性能、高安全性和智能化等方面。同时,分析了全闪存阵列和中端存储集群对高端存储市场的冲击,以及高端存储在不同应用场景中的发展趋势。 ... [详细]
  • This feature automatically validates new regions using the AWS SDK, ensuring compatibility and accuracy. ... [详细]
  • 应用链时代,详解 Avalanche 与 Cosmos 的差异 ... [详细]
  • 本章介绍了TCP/IP协议族中的链路层,其主要功能是为IP模块发送和接收IP数据报。链路层还支持一些辅助性协议,如ARP。此外,本文详细探讨了不同类型的链路层技术及其应用。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • 精选在线API编辑工具推荐
    本文将介绍几款优秀的在线API编辑工具,包括它们的功能特点和使用方法,帮助开发者提高工作效率。 ... [详细]
  • 七款高效编辑器与笔记工具推荐:KindEditor自动换行功能解析
    本文推荐了七款高效的编辑器与笔记工具,并详细解析了KindEditor的自动换行功能。其中,轻笔记QingBiJi是一款完全免费的记事本软件,用户可以通过其简洁的界面和强大的功能轻松记录和管理日常事务。此外,该软件还支持多平台同步,确保用户在不同设备间无缝切换。 ... [详细]
author-avatar
王言
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有