插件的“动态替换”

简介: 设想这样一种场景:我们的服务系统提供一系列的功能服务,而以后会有更多新的功能服务增加进来,也可能出现功能服务需要被更改或移除的情况。对于这样的服务系统,一个常见的基本的要求就是,在添加/移除/更新功能服务的时候不能停止的服务系统的运行。

    设想这样一种场景:我们的服务系统提供一系列的功能服务,而以后会有更多新的功能服务增加进来,也可能出现功能服务需要被更改或移除的情况。对于这样的服务系统,一个常见的基本的要求就是,在添加/移除/更新功能服务的时候不能停止的服务系统的运行。通常,将每一项服务封装成一个插件Dll,可以非常容易地实现“插件热插拔”(关于插件的基础信息,参见这里),但是插件的“热替换”(“动态替换”)却成了一个问题。原因在于,当我们从服务系统中卸载插件Dll的时候,实际上服务系统仍然持有该Dll的底层引用,这时如果你尝试删除或覆盖这个Dll,windows就会给出类似“该Dll正在被使用”的信息。

    那么如何解决这个问题了?我觉得至少有两种方案:
(1)使用AppDomain。在一个新的AppDomain中加载插件,然后通过卸载这个AppDomain就可以干净地从服务系统中卸载该AppDomain中的插件Dll。这种方案的缺陷是需要管理众多的AppDomain(因为你有众多的功能服务),而且跨AppDomain的通信都是以Remoting的方式进行的,这将为我们的系统引入不少本不必要的麻烦。如果你有兴趣也可以尝试一下这种方案,而我更喜欢用第二种。

(2)在内存中复制插件Dll,然后加载内存中的Dll。这样,硬盘上的Dll就可以随意地被覆盖或删除了。以前我们是直接从硬盘加载插件Dll,就像这样:

Assembly asm  =  Assembly.LoadFrom(addinFilePath) ;   

    现在,我们需要转个弯:

                Assembly asm  = null ;  
 
              
                //
先将插件拷贝到内存缓冲
                 byte [] addinStream  =   null  ;                    
                
if (FileHelper.ReadFileToBuff(addinFilePath , out  addinStream))
                {
                    asm 
=  Assembly.Load(addinStream) ;  // 加载内存中的Dll
                }

    
    这样就解决了插件的“动态替换”的问题。

目录
相关文章
|
存储 运维 数据可视化
低代码平台中的“模型驱动”与“表单驱动”有何区别?
低代码是近几年比较火的一种应用程序快速开发方式,它能帮助用户在开发软件的过程中大幅减少手工编码量,并通过可视化组件加速应用程序的高效交付。(低代码的定义来自Forrester报告,被认为是低代码一词的起源)。
低代码平台中的“模型驱动”与“表单驱动”有何区别?
|
Java 数据库连接 数据库
MybatisPlus中IService接口有什么用?
MybatisPlus中IService接口有什么用?
329 0
|
机器学习/深度学习 自然语言处理 算法
对话系统之用户模拟器最新进展
学术界做了大量的研究工作,从最基础的 bi-gram 模型 [4],到经典实用的 Agenda-based的方法 [2],再到最近基于深度学习的用户模型 [9, 10],用户模拟器的效果得到了显著提升,也为对话模型的训练提供了有效的方法。
1963 0
对话系统之用户模拟器最新进展
|
消息中间件 存储 运维
基于云基础设施快速部署 RocketMQ 5.0 集群
如何解决在云基础设施上部署 RocketMQ 时面临多节点部署带来的高操作成本等诸多挑战?快来了解 RocketMQ Operator 是怎样支撑 RocketMQ 集群在云基础设施上的自动化运维与管理吧!
1253 0
基于云基础设施快速部署 RocketMQ 5.0 集群
|
Kubernetes 负载均衡 Dubbo
微服务应用如何实现无损上下线|学习笔记(一)
快速学习微服务应用如何实现无损上下线
微服务应用如何实现无损上下线|学习笔记(一)
|
存储 JSON 缓存
低代码渲染那些事
低代码渲染是什么? 在了解低代码渲染之前,我们先来了解一下低代码渲染是什么? 首先,我们来考虑一下,低代码是什么? 比如下图阿里内部的某低代码平台,阿里对外的低代码产品有宜搭。他们都是通过可视化,即拖拽、配置,再加上很少的代码来设计出页面。
1413 0
低代码渲染那些事
|
SQL 存储 数据采集
DataWorks数据建模 - 一揽子数据模型管理解决方案 | 《一站式大数据开发治理DataWorks使用宝典》
在当下的商业环境中,正确的数据治理策略对于数据增值是非常重要的。据统计,企业的数据一直都在以每年50%的速度增长,因此企业数据治理与整合的难度就不断加大了。 DataWorks一直以来都致力于成为用户更方便、更快捷地进行数据开发与数据治理的好帮手。此次发布的数据建模,是对已有数据治理领域能力的补齐,为用户带来了在数据开发前,实施事前治理的能力。
2748 0
DataWorks数据建模 - 一揽子数据模型管理解决方案 | 《一站式大数据开发治理DataWorks使用宝典》
|
SQL 运维 DataWorks
DataWorks数据服务介绍及最佳实践 | 《一站式大数据开发治理DataWorks使用宝典》
DataWorks作为一站式大数据开发治理平台,构建了从数据集成、数据开发、数据服务到应用开发的全链路解决方案。在整个大数据链路中,数据服务将数仓、数据库和数据应用进行串联,形成了一座数据与应用之间的桥梁。数据服务通过将数据封装成数据API的方式,可以为个人、团队及企业提供全面的数据开放及共享能力。借助这个平台,用户能够统一管理面向内外部的API服务。数据服务提供了向下对接数据源、向上支撑业务应用的有效连接。
3423 1
DataWorks数据服务介绍及最佳实践 | 《一站式大数据开发治理DataWorks使用宝典》
|
存储 监控 NoSQL
干货 | 一文搞懂全链路监控:方案概述与比较(下)
干货 | 一文搞懂全链路监控:方案概述与比较
2107 0
干货 | 一文搞懂全链路监控:方案概述与比较(下)