大家好,  我发起了一个 .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. 利用include动作实现参数传递

    <%--程序string.jsp--%> <%@ page language="java" import="java.util.*" page ...

  2. [Spring-AOP-XML] 利用Spirng中的AOP和XML进行事务管理

    Spring中的AOP进行事务管理有三种方式 A.自定义事务切面 利用AspectJ来编写事务,我们一般把这个切面作用在service层中.其他代码在下面 编写一个Transaction实现类,通过S ...

  3. vue中七牛插件使用

    <template> <div id="cxUpload" class="cx-upload"> <button id=" ...

  4. urlencode urldecode

    1.urlencode()函数原理就是首先把中文字符转换为十六进制,然后 在每个字符前面加一个标识符%. urldecode()函数与urlencode()函 数原理相反,用于解码已编码的 URL 字 ...

  5. FCC JS基础算法题(8):Slasher Flick(截断数组)

    题目描述: 返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始. 这个题目有两个方法,都比较简单,用slice方法: function slasher(arr, howMany) { // 请 ...

  6. mysql基础查询语法

    一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.group by子句通常和count( ...

  7. Python 内置函数2

    print(list("胡辣汤")) lst = ["河南话", "四川话", "东北", "山东" ...

  8. 安卓 dex 通用脱壳技术研究(二)

    0x03 DexHunter代码分析 DexHunter 实现中,只需要修改一处文件:dalvik\vm\native\dalvik_system_DexFile.cpp 下面是BeyondCompa ...

  9. php操作redis(转)

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis支持的数据类型有 Stirng(字符串), Lis ...

  10. jQuery的位置信息

    <head> <meta charset="UTF-8"> <title>jquery的位置信息</title> <style ...