.NET 云原生架构师训练营(ASP .NET Core 整体概念推演)--学习笔记
演化与完善整体概念
- ASP .NET Core 整体概念推演
- 整体概念推演到具体的形式
ASP .NET Core 整体概念推演
ASP .NET Core 其实就是通过 web framework 处理 HTTP 请求并提供 HTTP 响应
web framework 由程序员使用,它包括 ASP .NET Core,Express,spring 等等组成
这样我们就完成了对 ASP .NET Core 的底层建模,接下来对 HTTP 请求和 HTTP 响应进行细化
对于原始 HTTP 请求,服务器通过监听配置对 IP 端口进行监听
IP 端口与 Socket 网络建立连接,Socket 网络连接分为 input stream 和 output stream
input stream 接收并转化 HTTP 请求连接(C# 可识别),包括 HTTPContext
HTTP 请求连接经过处理之后生成 output stream
整体概念推演到具体的形式
Endpoint 有一个 Options 配置,用于配置 Socket
TransportFactory 分为 SocketTransportFactory 和 LiburyTransportFactory
TransportFactory 绑定 ConnectionListener,ConnectionListener 监听 Socket 请求
基于 Socket 创建 SocketConnection,组成 ConnectionContext
创建之后通过 Start 方法,开始接收发送请求,对应 Socket 网络连接的 output stream 到处理之前的过程
接下来通过源码找到上述的过程:https://github.com/dotnet/aspnetcore/
在 src/Servers/Kestrel/Kestrel 目录下有一个 WebHostBuilderKestrelExtensions 的扩展方法注入了 KestrelServerImpl
services.AddSingleton<IServer, KestrelServerImpl>();
KestrelServerImpl 是继承自 IServer 的接口,IServer 是在 Hosting 中的,在 IServer 中有一个 StartAsync 的方法
Task StartAsync<TContext>(IHttpApplication<TContext> application, CancellationToken cancellationToken) where TContext : notnull;
在 KestrelServerImpl 的 StartAsync 方法中我们可以找到一个 OnBind 的方法
async Task OnBind(ListenOptions options, CancellationToken onBindCancellationToken)
在这个 OnBind 方法中可以看到整个 options 在 ListenOptions 里面,而在 ListenOptions 里面可以看到 EndPoint 属性
public EndPoint EndPoint { get; internal set; }
监听实际上会被拆解成好几个方法,首先是一个绑定的方法,把 EndPoint 传入到 TransportManager 的绑定方法
options.EndPoint = await _transportManager.BindAsync(options.EndPoint, multiplexedConnectionDelegate, options, onBindCancellationToken).ConfigureAwait(false);
TransportManager 的绑定方法使用了 TransportFactory 的绑定方法
var transport = await _multiplexedTransportFactory.BindAsync(endPoint, features, cancellationToken).ConfigureAwait(false);
TransportFactory 是一个 IConnectionListenerFactory,它有两个实现:SocketTransportFactory,LiburyTransportFactory
在 SocketTransportFactory 的绑定方法中会产生一个 SocketConnectionListener 的监听器
var transport = new SocketConnectionListener(endpoint, _options, _logger);
SocketConnectionListener 是由 SocketConnectionListenerFactory 产生的,SocketConnectionListenerFactory 继承自 IConnectionListenerFactory
创建 SocketConnectionListener 监听器之后调用 StartAcceptLoop 方法传入 connectionListener
StartAcceptLoop(new GenericConnectionListener(transport), c => connectionDelegate(c), endpointConfig);
在 StartAcceptLoop 方法中开始接收
var acceptLoopTask = connectionDispatcher.StartAcceptingConnections(connectionListener);
在 StartAcceptingConnections 中调用了 listener 的 AcceptAsync 方法接收
var connection = await listener.AcceptAsync();
SocketConnectionListener 的 AcceptAsync 方法会产生一个 ConnectionContext
public ValueTask<ConnectionContext?> AcceptAsync(CancellationToken cancellationToken = default)
这个 ConnectionContext 由 SocketConnectionContextFactory 创建
return _factory.Create(acceptSocket);
Create 方法创建了一个 SocketConnection,这个连接里面有 InputOptions 和 OutputOptions
var connection = new SocketConnection(socket,
_memoryPool,
setting.Scheduler,
_logger,
setting.SocketSenderPool,
setting.InputOptions,
setting.OutputOptions,
waitForData: _options.WaitForDataBeforeAllocatingBuffer);
创建之后直接启动,这是一个自启动的过程
connection.Start();
在 StartAcceptingConnections 得到 SocketConnection 后创建 KestrelConnection,创建之后的转化由 _connectionDelegate 执行
var kestrelConnection = new KestrelConnection<T>(
id, _serviceContext, _transportConnectionManager, _connectionDelegate, connection, Log);
在 KestrelConnection 的执行方法 ExecuteAsync 里面,调用了 _connectionDelegate
await _connectionDelegate(connectionContext);
接下来全部交给 HttpConnectionMiddleware 处理,看一下如何在 KestrelServerImpl 中构建创建
options.UseHttpServer(ServiceContext, application, options.Protocols, addAltSvcHeader);
var connectionDelegate = options.Build();
在 UseHttpServer 中创建 HttpConnectionMiddleware
var middleware = new HttpConnectionMiddleware<TContext>(serviceContext, application, protocols, addAltSvcHeader);
在 HttpConnectionMiddleware 中开启 HttpConnectionContext 的执行
var httpConnectionContext = new HttpConnectionContext(
connectionContext.ConnectionId,
protocols,
altSvcHeader,
connectionContext,
_serviceContext,
connectionContext.Features,
memoryPoolFeature?.MemoryPool ?? System.Buffers.MemoryPool<byte>.Shared,
localEndPoint,
connectionContext.RemoteEndPoint as IPEndPoint);
httpConnectionContext.Transport = connectionContext.Transport;
var connection = new HttpConnection(httpConnectionContext);
return connection.ProcessRequestsAsync(_application);
在 ProcessRequestsAsync 中开始 requestProcessor 的 Context 的转化协议
public async Task ProcessRequestsAsync<TContext>(IHttpApplication<TContext> httpApplication) where TContext : notnull
作业
在了解完 asp .net core 第2层的架构之后, 从 HttpConnectionMiddleware 开始,把 KestrelConnection 到 HttpContext 的转化过程用OPD 进行细化
课程链接
https://appsqsyiqlk5791.h5.xiaoeknow.com/v1/course/video/v_5f39bdb8e4b01187873136cf?type=2
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。
.NET 云原生架构师训练营(ASP .NET Core 整体概念推演)--学习笔记的更多相关文章
- .NET 云原生架构师训练营(模块二 基础巩固 安全)--学习笔记
2.8 安全 认证 VS 授权 ASP .NET Core 认证授权中间件 认证 JWT 认证 授权 认证 VS 授权 认证是一个识别用户是谁的过程 授权是一个决定用户可以干什么的过程 401 Una ...
- .NET 云原生架构师训练营(权限系统 RGCA 开发任务)--学习笔记
目录 目标 模块拆分 OPM 开发任务 目标 基于上一讲的模块划分做一个任务拆解,根据任务拆解实现功能 模块拆分 模块划分已经完成了边界的划分,边界内外职责清晰 OPM 根据模块拆分画出 OPM(Ob ...
- .NET 云原生架构师训练营(权限系统 代码实现 ActionAccess)--学习笔记
目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...
- .NET 云原生架构师训练营(权限系统 代码实现 EntityAccess)--学习笔记
目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...
- .NET 云原生架构师训练营(权限系统 代码实现 Identity)--学习笔记
目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...
- .NET 云原生架构师训练营(权限系统 代码实现 WebApplication)--学习笔记
目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.WebA ...
- .NET 云原生架构师训练营(权限系统 系统演示 ActionAccess)--学习笔记
目录 模块拆分 环境配置 默认用户 ActionAccess 模块拆分 环境配置 mysql migration mysql docker pull mysql docker run -p 3306: ...
- .NET 云原生架构师训练营(权限系统 系统演示 EntityAccess)--学习笔记
目录 模块拆分 EntityAccess 模块拆分 EntityAccess 实体权限 属性权限 实体权限 创建 student https://localhost:7018/Student/dotn ...
- .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记
目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...
随机推荐
- oracle extract
select extract(year from systimestamp) year ,extract(month from systimestamp) month ...
- springboot-使用AOP日志拦截实现
一 前言 借助spring的AOP功能,我们可以将AOP应用至全局异常处理,全局请求拦截等,本篇文章的核心功能就是使用AOP实现日志记录,比如哪些用户进行了哪些操作,对于一个成功的项目这是必须记录的, ...
- javascript将平行的拥有上下级关系的数据转换成树形结构
转换函数 var Littlehow = {}; /** * littlehow 2019-05-15 * 平行数据树形转换器 * @type {{format: tree.format, sort: ...
- jQuery - 按回车键触发跳转
键盘事件有三种: keyup:按键按下去,抬上来后,事件才生效 (推荐) keydown:按键按下去就生效 keypress:与 keydown 事件类似,当按钮被按下时,会发生该事件,与 keydo ...
- SQL注入 (1) SQL注入类型介绍
SQL注入 SQL注入介绍与分类 1. 什么是sql注入 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 2. sql注入类型 按照注入 ...
- 如何用three.js实现数字孪生、3D工厂、3D工业园区、智慧制造、智慧工业、智慧工厂-第十课
文章前,先聊点啥吧. 最近元宇宙炒的挺火热,在所有人都争相定义元宇宙的时候,资本就开始着手入场了.当定义明确,全民皆懂之后,风口也就过去了. 前两天看到新闻,新世界CEO宣布购入最大的数字地块,这块虚 ...
- 论文翻译:2021_A Perceptually Motivated Approach for Low-complexity, Real-time Enhancement of Fullband Speech
论文地址:一种低复杂度实时增强全频带语音的感知激励方法 论文代码 引用格式:A Perceptually Motivated Approach for Low-complexity, Real-tim ...
- ORA-31633:unable to create master table "DP.SYS_EXPORT_FULL_11" ORA-01658
问题描述:在进行数据泵进行数据库备份的时候,但是导出命令报错,环境是19C 4节点的rac 一体机.目前磁盘空间需要清理,清理之前先备份一下数据库 ORA-31626:job does not exi ...
- 【教程】OBS直播推流教程(Windows & macOS)
OBS Open Broadcaster Software | OBS (obsproject.com) Windows直播推流教程 Windows下OBS直播推流非常简单,本教程将会介绍,具体步骤如 ...
- [BUUCTF]PWN——others_babystack
others_babystack 附件 步骤: 例行检查,64位程序,开了挺多保护 本地试运行一下程序 64位ida载入,看main函数 1是read函数,存在栈溢出:2是puts函数,3退出 利用思 ...