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   

  • 相关阅读:
    windows下前端开发工具遇到的问题总结(yeoman bower grunt)
    gurnt js css 压缩合并
    PyCharm中的Console调整字体大小
    PyCharm中的Console自动换行
    requests模块demo
    http状态码
    查找入职员工时间排名倒数第三的员工所有信息
    查找最晚入职员工的所有信息
    xrange与range之间的区别
    给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。
  • 原文地址:https://www.cnblogs.com/loongsoft/p/7544358.html
Copyright © 2011-2022 走看看