热门标签 | 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




推荐阅读
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
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社区 版权所有