大家好,  我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain  用于 热更新 。

简单的说, 原理就是 类似 Asp.net 那样 让 当前 WebApp 运行在一个 App Domain 中,

当 WebApp 的 Bin 目录 或者 Web.config 被更新时, 就会 创建一个 新的 App Domain,

我们把 这个 新的 App Domain 称之为  “New Domain”,

把 原来的 正在运行的 App Domain 称之为  “Old Domain” ,

然后, 将 更新后的 程序(Bin目录 ,  Web.config)  运行在 New Domain 下,

然后, 等 Old Domain 里把 已经在 处理的 请求 都 处理 完成后,  就 停止 和 销毁 Old Domain 。

这样就可以 实现 在线热更新,或者 运行中热更新,

也不需要考虑 更新文件 后 要 重启 应用程序 等问题 。

这个项目里 包含 3 个 部分 :

1  一个 Host 框架 for Kestrel,   这是 Asp.net 的部分

2  一个 Host 框架 for Windows Service,    这是 Windows Service 的部分

3  一个 Host 框架 for Linux AP ,  就相当于是  Linux 上的  Windows Service, 我不知道 Linux 上的 Windows Service 叫什么, 就叫 AP 好了

1 的 原理就是 把   Kestrel 作为一个 应用(AP), 通过 Host 创建一个 App Domain , 让 Kestrel 运行在这个 App Domain 里,

有更新的话, 就像上面说的,  创建一个 New Domain , 让 更新后的 程序 运行在 New Domain,

同时 等 Old Domain 处理完 请求, 则 停止 和 销毁 Old Domain 。

2 , 3  的 原理 类似 。

至于 Shadow Domain, 也许是指 New Domain, 也许是指 Old Domain, 我记不清了……  反正都讲得通 。哈哈哈

Shadow Domain 这个项目 的 意义 在于 为 ServerFul 架构 提供了支持,

有关 ServerFul 架构, 请参考我写的另一篇文章  《我发起了一个支持 ServerFul 架构的 .Net 开源项目 ServerFulManager》

https://www.cnblogs.com/KSongKing/p/9899199.html

同时, 像 ServerFul 架构一样, 简化了 服务器集群管理 的 工作, 比如 不需要考虑 重启应用, 只需要 覆盖文件, 省去了 编写脚本 重启应用 等工作, 以及 避免了 使用 容器(比如 Docker)等 复杂技术 。

不过 实际 实现起来 问题 也很多 。 比如 Kestrel, 按照上述的原理, Old Domain 要处理完当前已经在处理的请求 才会 停止和销毁 。

而 是否已处理完请求 这只有 Kestrel 自己才知道 , 所以 ShadowDomain 大概要 Kestrel 自己来实现才行 。

而 一台计算机(操作系统)上 端口号 是不能重复的, 所以 我们又不能 在 原来的 Kestrel 还在运行的时候 另外启动一个 Kestrel 进程,

So …… 。

至于 IIS 托管 的 Kestrel, 情况可能更复杂 ……  。

所以, 还是 写个脚本吧  ~!  写个脚本 来 控制 Kestrel 的 启动 停止, 这不算难, 这也是 ServerFul 架构 。

不过这里又引出一个 额外的问题,  就是 如果要 Kestrel 不间断更新(不停机更新) 的话,  怎么办 ?

大概要 增加 一台 备机,  做一个 主备 或者 负载均衡,

不过这在 云计算 和 虚拟化技术 普及 的 今天,  应该不是 大问题 。

我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新的更多相关文章

  1. 我发起了一个 .Net Core 平台上的 分布式缓存 开源项目 ShareMemory 用于 取代 Redis

    Redis 的 安装 是 复杂 的, 使用 是 复杂 的, Redis 的 功能 是 重型 的, Redis 本身的 技术实现 是 复杂 的 . Redis 是用 C 写的, C 语言 编写的代码需要 ...

  2. 我发起了一个 支持 ServerFul 架构 的 .Net 开源项目 ServerFulManager

    大家好,  我发起了一个 支持 ServerFul 架构 的 .Net 开源项目 ServerFulManager . ServerFulManager 的 目标 是 实现一个 支持 ServerFu ...

  3. 我发起了一个 .Net 平台上的 开源项目 知识图谱 Babana Map 和 文本文件搜索引擎 Babana Search

    起因 也是 前几天 有 网友 在 群 里发了   知识图谱   相关的文章, 还有 有 网友 问起   NLog -> LogStash -> Elastic Search  的 问题, ...

  4. 我发起了一个 用 C# 写 的 浏览器 开源项目 HtmlCore

    我之前还发起过一个 项目, 名字也叫 HtmlCore, 见 <我发起了一个 .Net 开源 跨平台 GUI (界面开发框架)项目 HtmlCore>  https://www.cnblo ...

  5. 我发起了一个 用 物理服务器 和 .Net 平台 构建云平台 的 .Net 开源项目

    大家好 , 我发起了一个 用 物理服务器 和 .Net 平台 构建云平台 的 .Net 开源项目 . 对 , 用 物理服务器 和 .Net 平台 构建 云平台 . 通过 .Net 构建 分布式 计算集 ...

  6. ImageSharp一个专注于NetCore平台图像处理的开源项目

    今天大家分享的是一个专注于NetCore平台图像处理的开源项目,老实说为这篇文章取名字想了5分钟,可能是词穷亦或是想更好的表达出这款开源项目的作用:这个项目在图像处理方面有很多功能,如:缩放,裁剪,绘 ...

  7. GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。

    1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便 ...

  8. 微人事 star 数超 10k,如何打造一个 star 数超 10k 的开源项目

    看了下,微人事(https://github.com/lenve/vhr)项目 star 数超 10k 啦,松哥第一个 star 数过万的开源项目就这样诞生了. 两年前差不多就是现在这个时候,松哥所在 ...

  9. 使用cvs或svn从sourceforge上获取开源项目的方法[转载]

    著名开源软件网站(www.sourceforge.net)上面的开源项目,大部分使用的管理工具为cvs或svn. 这两种软件的代表客户端程序是wincvs和tortoiseSVN.   1.cvs C ...

随机推荐

  1. 解决无法创建 JPA 工程的问题

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7703803.html ------------------------------------ ...

  2. android 应用程序中执行Linux 命令

    ADB 无线调试命令son = "setprop service.adb.tcp.port 5555\n" + "stop adbd\n" + "st ...

  3. sptring boot 修改默认Banner

    一.自定义banner 启动Spring Boot项目时,在控制台或日志中会默认显示一个Banner,如图所示: 在我们的项目中更希望使用自己的Banner,这样看起来更帅写,但是这对于程序员来说并不 ...

  4. Linux 配置selenium + webdriver 环境

    1.ubuntu 自带了python, 可以打开终端输入python 回车后如果显示版本信息就说明已经安装 2.安装安装python setup tools apt-get install pytho ...

  5. Oracle 用户 表 表空间之间的关系和管理

    文献地址: https://blog.csdn.net/jmilk/article/details/51599260 https://www.cnblogs.com/roger112/p/768530 ...

  6. C点滴成海----函数声明、函数定义、函数原型

    一.函数声明 1.格式 函数体去掉函数定义中的内容再加上分号,如下所示: 返回值类型 函数名( 类型 形参, 类型 形参… ); 返回值类型 函数名( 类型, 类型…); 2.特点 函数声明只是对编译 ...

  7. PHPexcel 导入import 数据到 mysql: mysql 查询数据是否存在, 如果存在返回id, 不存在, 插入返回id. 2) mysql_query , mysql_connect, mysql_select_db, mysql_error, mysql_num_rows,mysql_close

    一: 要求: 上面的图表 中的数据插入到 3张表中. 1)t_vide_warehourse 分类表: 此表中包含 一级分类 和二级分类.  二级分类是一级分类的子级. 2)t_video_info  ...

  8. 解决At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs

    在写spring security小程序时遇到  At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug l ...

  9. python 爬虫第三方库

    这个列表包含与网页抓取和数据处理的Python库 网络 通用 urllib -网络库(stdlib). requests -网络库. grab – 网络库(基于pycurl). pycurl – 网络 ...

  10. python day10 参数,命名空间

    一.函数的参数--动态传参 1.动态接收位置参数 1.1在参数位置编写*表示接收任意多个内容 def chi(*food): print("我要吃", food) chi(&quo ...