首页 > 其他分享 >mormot2 http服务器的实现

mormot2 http服务器的实现

时间:2023-01-17 09:22:11浏览次数:62  
标签:HTTP 使用 http mORMot 线程 mormot2 服务器 net

mormot2 http服务器的实现

mORMot 2 采用了mORMot 1 源代码中的所有 HTTP 服务器类。然后包括一些新的“异步”服务器。
它们都继承自THttpServerGeneric父类。

HTTP 服务器在几个单元中实现:

  • mORMot.net.server.pas提供了/HTTP/1.1服务器,THttpServerSocket/1.1服务器over Windows http.sys模块,over Windows http.sys模块;THttpServerTHttpApiServerTHttpApiWebSocketServer
  • mORMot .net.ws.server.pas提供TWebSocketServerRest服务器,它使用 WebSockets 作为传输方式,但在其之上启用类似 REST 的阻塞请求/应答协议,具有可选的双向通知,使用单线程 -每个连接服务器;
  • mORMot .net.async.pas提供了新的THttpAsyncServer事件驱动的 HTTP 服务器;
  • mORMot .net.ws.async.pas提供新的TWebSocketAsyncServerRest服务器,它使用 WebSockets 作为传输方式,但在其之上启用类似 REST 的阻塞请求/应答协议,具有可选的双向通知,使用事件驱动服务器。

在 Windows 上,http.sys模块为您提供了非常好的稳定性,并使用与 IIS 和 DotNet 使用的相同的以 Windows 为中心的服务器发布方式。如果需要,您甚至可以在多个服务之间共享同一个端口。

我们基于套接字的服务器是跨平台的,可以在 Windows 和 POSIX(Linux、BSD、MacOS)上编译和运行。他们为 HTTP/1.0 的短期请求使用线程池,在 HTTP/1.1 上为每个连接使用一个线程。所以它们应该在像 nginx 这样的反向代理后面使用,它可以使用mORMot通过 HTTP/1.0 传输,但保持高效的 HTTP/1.1 或 HTTP/2.0 与客户端通信。

 

mORMot .net.async.pasmORMot .net.ws.async.pas都是mORMot 2的新功能。它们使用事件驱动模型,即使用快速 API(如 Linux 上的 epoll)跟踪打开的连接,并且只有当实际有新数据挂起时才使用线程池。

永远的事件

异步套接字访问和事件循环是最佳服务器可伸缩性的关键。对于THttpServerSocket每个 HTTP/1.1 或 WebSockets 连接使用一个线程的常规类,我们的异步类(例如THttpAsyncServer)可以有数千个并发客户端,CPU 和 RAM 资源消耗最少。

mORMot 2 网络核心中,即在单元mORMot.net.sock.pas,我们定义了一个抽象的事件驱动类:

TPollSockets

根据操作系统的不同,它将使用底层的低级系统调用来模拟epoll api 。

事件非常抽象,实际上只是每个连接上的基本 R/W 操作,与“标签”相关联,这很可能是与套接字/连接相关联的类指针:

然后在这些基本的套接字驱动事件之上编写了全新的 HTTP/1.0、HTTP/1.1 和 WebSockets 堆栈。它们没有阻塞线程,而是使用内部状态机,它比线程轻得多,甚至比协程/goroutine 更轻。每个连接只是一个类实例,它维护每个客户端/服务器通信的状态,并访问它自己的套接字。

 

mORMot异步 TCP 服务器默认有一个线程接受连接,一个线程轮询未决事件(调用GetOne方法),然后一组专用线程使用读/写/关闭事件(通过GetOnePending方法)。我们使用了尽可能多的非阻塞结构,我们通过重复使用相同的缓冲区来最小化内存分配,例如用于标头或小响应,我们在每种情况下都尽可能选择最好的锁,以便该服务器可以很好地平滑地扩展。而且使用简单,因为处理一个新的协议就像继承和编写一个新的连接类一样简单。

我们的异步服务器类现在看起来稳定且快速(据报道比 nginx 快两倍,比 nodejs 快六倍!)。
但当然,与任何新的复杂代码一样,它们可能是警告。其中一些已经被识别和修复——正如我们论坛中所报告的那样。因此,欢迎反馈,nginx、haproxy 或 caddy 反向代理前端在生产环境中始终是一个好主意。

编写这些服务器所花的时间比预览的要多,有时还很痛苦。因为调试多线程进程并不容易,尤其是在多个操作系统上。操作系统之间存在一些细微差别,可能会导致意外阻塞或性能下降。但我们为与同类最佳服务器相比的结果感到自豪。仍然在现代 pascal 代码和开源软件中。

不要犹豫,看看源代码,并尝试一些示例。像往常一样,欢迎在我们的论坛中
提供 反馈。

标签:HTTP,使用,http,mORMot,线程,mormot2,服务器,net
From: https://www.cnblogs.com/hnxxcxg/p/17056961.html

相关文章

  • Jmeter学习:采样器--http 请求采样器/Websocket 采样器/dubug 采样器
    一、http请求采样器功能:通过该组件,我们可以进行Http采样 Basic常用参数已经在截图上。GET请求可将参数填写在Parameters中。参数:FollowRedirescts和Rediect......
  • 网络协议-http访问网站
    (1)HTTP访问网站简要描述:1.在无任何缓存的情况下,先通过DNS服务器来解析域名对应的IP地址;2.PC的浏览器通过解析出来的服务器地址与服务器发起TCP三次握手建立TCP会话;3......
  • 分析HttpServletRequest的sessionId不一致的原因
    事情是这样的:在接口①存入session,接着在接口②获取session,结果:同一个key,却打印为空!!!为何不同?一、从session的原理上来看:session的工作原理就是依靠cookie来做支撑,第一次使用r......
  • 真正“搞”懂HTTP协议08之重定向
    我们知道,用来传输页面的协议就是HTTP协议,全称是超文本传输协议,而浏览器展示的页面则是用HTML编写的,HTML的全称则是超文本标记语言。你看,都叫做超文本,我在第一篇文章的......
  • 黯然微信小程序杂记(一):从服务器获取数据 后端语言php
    黯然学编程之微信小程序杂记(一):从服务器获取数据后端语言php​​一、功能描述​​​​二、服务器、数据库与微信小程序逻辑的关系​​​​服务器​​​​数据库​​​​与......
  • http协议缓存详解
    浏览器端强制缓存,http响应头expires和cache-control是设置缓存的重要参数expires设置到期时间点,这是http1.0的产物,对于客户端时间和服务器端有时差的情况,会导致缓......
  • WebServerz支持Http post get
       <webServices><protocols><addname="HttpPost"/><addname="Documentation"/><addname="HttpSoap"/><addnam......
  • 10GB以上超大文件上传和断点续传服务器的实现
    ​ 最近遇见一个需要上传超大大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现。在某些业务中,大文件上传是一个比较重要的......
  • ubuntu20.04搭建Nginx+rtmp服务器
    1.ubuntu20.04安装Nginx代理服务器安装nginxsudoaptupdatesudoaptinstallnginx安装完成后,Nginx将会自动被启动。运行下面的命令来验证:   测试安装在网页......
  • 【跨域报错解决方案】Access to XMLHttpRequest at ‘http://xxx.com/xxx‘ from orig
    错误背景描述:在使用ajax调用api接口的时候:发生错误如下​​​AccesstoXMLHttpRequestat‘http://xxxx.com/xxx’fromorigin‘null’hasbeenblockedbyCORSpolic......