kestrel java_Kestrel Web 服务器学习笔记

本文详细介绍了Kestrel,一个基于libuv的跨平台Web服务器,用于ASP.NET Core。Kestrel的工作原理包括对libuv的封装、I/O事件队列和线程管理,以及内存池的使用。此外,还展示了如何配置Kestrel,如设置最大连接数、请求大小限制等。
摘要由CSDN通过智能技术生成

前言:

ASP.NET Core 已经不是啥新鲜的东西,很多新启的项目都会首选 Core 做开发;

而 Kestrel 可以说是微软推出的唯一真正实现跨平台的 Web 服务器了;

Kestrel 利用一个名为 KestrelEngine 的网络引擎实现对请求的监听、接收和响应;

Ketrel 之所以具有跨平台的特质,源于 KestrelEngine 是在一个名为 libuv 的跨平台网络库上开发的;

Kestrel is a cross-platform web server for ASP.NET Core based on libuv, a cross-platform asynchronous I/O library;

一、Kesterl 基本工作原理

Kestrel 是进程内服务器,以一个包形式提供,自身不能单独运行,与 IIS 不同,它必须 HOST 在一个 .NET 的 WEB 应用程序中。

它内部封装了对 libuv 的调用,但不是 libuv 库简单的封装库。Kestrel 是个精简的,高效的 Http Server。

(粗暴流程图)

085759ca556d9a49ed4ee212b4b981f3.png

(基础架构图)

3f521efc1365dd655af32a593635d4f8.png

libuv:

作为I/O底层,屏蔽各系统底层实现差异,为windows下,通过IOCP实现异步;linux下通过epoll实现异步。提供一个主程序和主循环。

I/O 事件队列:

对应Libuv的工作队列,为了利用现代服务器的多核处理器,适当的队列数量将提高更大的I/O吞吐能力。

Kestrel默认为每两个CPU核心设置一个I/O事件队列,但至少有一个I/O事件队列。每个队列对应一个托管线程,该线程不属于线程池。

用户可以设置队列个数,通过设置KestrelServerOptions.ThreadCount即可,最多设置 16个。

Kestrel线程:

事件队列对应的托管线程,主要控制读取事件的循环机制:每次事件循环处理8个事件,然后等待下一次循环。

非托管内存池:

这是在 .NET 运行环境分配的非托管内存池,申请的比较大块的堆内存,仅在首次请求或者池剩余空间不足时分配,

后续请求可以复用,不受GC管理。管理内存页的数据结构采用链表方式。以获取大块连续空间的方式增长。遵循读完后立即释放的处理原则。

(结构图)

e4c2fa27e2048220762eeccc0b6a11b7.png

二、Kesterl 的使用、配置

前面说过了,Kesterl 是进程内服务器,默认情况下在 Core 项目中由 Program.cs 启动;

public static void Main(string[] args)

{

BuildWebHost(args).Run();

}public static IWebHost BuildWebHost(string[] args) =>WebHost.CreateDefaultBuilder(args)

.UseStartup()

.UseKestrel(options=>{

options.Listen(IPAddress.Loopback,5000);

options.Listen(IPAddress.Loopback,5001, listenOptions =>{

listenOptions.UseHttps("testCert.pfx", "testPassword");

});

})

.Build();

配置客户端最大连接、请求大小等信息

.UseKestrel(options =>{

options.Limits.MaxConcurrentConnections= 100;

options.Limits.MaxConcurrentUpgradedConnections= 100;

options.Limits.MaxRequestBodySize= 10 * 1024;

options.Limits.MinRequestBodyDataRate=

new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));

options.Limits.MinResponseDataRate=

new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));

options.Listen(IPAddress.Loopback,5000);

options.Listen(IPAddress.Loopback,5001, listenOptions =>{

listenOptions.UseHttps("testCert.pfx", "testPassword");

});

})

参考:

学习笔记参考自:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x#tabpanel_N8uGZe26A-_aspnetcore1x

http://www.cnblogs.com/vipyoumay/p/7525478.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值