zoukankan      html  css  js  c++  java
  • Kestrel Web 服务器学习笔记

    前言:

      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。

      (粗暴流程图)

      

      (基础架构图)

      

       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管理。管理内存页的数据结构采用链表方式。以获取大块连续空间的方式增长。遵循读完后立即释放的处理原则。

       (结构图)

      


    二、Kesterl 的使用、配置

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

    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }
    
    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .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   

  • 相关阅读:
    1026 Table Tennis (30)
    1029 Median
    1025 PAT Ranking (25)
    1017 Queueing at Bank (25)
    1014 Waiting in Line (30)
    1057 Stack (30)
    1010 Radix (25)
    1008 Elevator (20)
    字母大小写转换
    Nmap的基础知识
  • 原文地址:https://www.cnblogs.com/loongsoft/p/7544358.html
Copyright © 2011-2022 走看看