大家好,  我发起了一个 .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. JavaScript示例

    <!DOCTYPE html> <html> <head> <title>单击按钮事件示例</title> <script langu ...

  2. Thread.join方法的解析(转)

    原文链接:https://www.cnblogs.com/huangzejun/p/7908898.html 1. join() 的示例和作用 1.1 示例 1 // 父线程 2 public cla ...

  3. 创建自己的docker基础镜像

    1.下载镜像 centos7 docker pull centos: 2.创建容器加载镜像 docker run -i -t --name centos7 centos: docker run 参数详 ...

  4. UVALive - 6434 (贪心)

    题目链接:https://vjudge.net/problem/UVALive-6434 题意:给你n个数字,要你把这n个数字分成m组,每一组的消耗值定义为改组最大值和最小值之差,要求这m组的消耗值总 ...

  5. Ajax 以及 前端JSP页面如何查看数值

    $.ajax({ url: ctx + "/unit/rsdl/qyjy/getDljgCode", type: "post", success: functi ...

  6. wait_activity

    wait_activity(self, activity, timeout, interval=1): android特有的 返回的True 或 False :Agrs: - activity - 需 ...

  7. Oracle 12c 容器讲解

    Oracle 12c一个重要新特性是插接式数据库. 插接式数据库由一个使用 CDB(Container Database)选项创建的容器数据库和一个或多个 PDB(Pluggable Database ...

  8. TensorFlow函数:tf.truncated_normal

    tf.truncated_normal函数 tf.truncated_normal( shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, ...

  9. ubuntu 安装php ,apache 问题总结

    1.apache没有权限 修改log   cd  /var/www chmod -R 777 html/ 2. The bootstrap/cache directory must be presen ...

  10. JAVA中将byte[]数组转成16进制字符串

    方法一: /** * byte数组转化为16进制字符串 * @param bytes * @return */ public static String byteToHexString(byte[] ...