Thrift架构~动态Thrift插件的注入

简介:

先说AOP

说到注入,大家就会想起来IoC和AOP,确实如些,这一讲中,我们通过unity来实现对thrift插件的动态注入,事实上,这个功能在以后的项目中经常要用到,比如,你将一些功能分发到指定服务器,而这些服务器的功能是可以动态调整的,每台服务器的插件功能都不相同,这时,如果你有新的插件开发好后,如果不使用AOP的思想,那简直就是灾难!试想,有100个客户端的程序,你将会把新的程序和插件一个个的重新安装到100个客户端电脑上,这是无可厚非的,但如果有了AOP思想,那么,客户端的程序可以实现根据配置文件动态去加载BIN下的DLL的功能,这是吸引人的,呵呵。

再说Thrift容器

Thrift的动态插件需要有一个统一的入口,即所有thrift插件都装到这个入口容器中,事实上,这就是AOP方法拦截的思想,将这些插件的执行控制在某个方法的执行之前或者之后,这是一种巧妙的设计,它解决了不断生产出来的插件的装载问题。

Thrift容器设计,核心代码

Thrift容器有着自己的特色,它需要有一个端口,一个传输协议,和一批动态被加载的Handle,即处理程序(或者叫“插件),我们来看一个代码:

    /// <summary>
    /// Thrift容器规范
    /// </summary>
    public interface IThriftHandle
    {
        /// <summary>
        /// 处理程序
        /// </summary>
        void Handle();
    }
    /// <summary>
    /// 为thrift提供的插件容器
    /// </summary>
    public class ThriftHandle : IThriftHandle
    {
        /// <summary>
        /// 插件处理器的集合,每当一个插件被激活,
        /// 在拦截Hanle()之前,都会前自己的Processor
        /// 添加到MultiplexedProcessor中
        /// </summary>
        public readonly static TMultiplexedProcessor MultiplexedProcessor = new TMultiplexedProcessor();
   
        public void Handle()
        {
            //远程登陆调用
            new Thread(() =>
            {
                var serverTransport = new TServerSocket(9800);
                var server1 = new TThreadedServer(MultiplexedProcessor, serverTransport);
                Console.WriteLine("开启扩展服务...");
                server1.Serve();
            }).Start();
        }

OK,我们看到了容器代码之后,对于具体的thrift插件,只要调用MultiplexedProcessor属性的register方法即可完成插件的注册了,而这部分的代码都是在DLL项目里完成的,即一个插件,一个DLL,或者一组类型的插件,一个DLL,这也符合面向对象的原则,即每个插件的职责都是单一的。

看个thrift插件的例子,一个远程命令调用的例子:

    /// <summary>
    /// 远程命令拦截器
    /// </summary>
    public class RemoteCommandBehavior : Project.InterceptionBehaviors.InterceptionBase
    {
        public override IMethodReturn Invoke(
            IMethodInvocation input,
            GetNextInterceptionBehaviorDelegate getNext)
        {
            Console.WriteLine("远程命令调用开始...");
            //注册thrift插件到thrift容器
            ThriftHandle.MultiplexedProcessor.RegisterProcessor("RemoteCommandHandler", new RemoteCommandService.Processor(new RemoteCommandHandler()));
            return getNext().Invoke(input, getNext);
        }
    }

RemoteCommandBehavior所对应的Handle处理程序我就省略了,呵呵。

看一下AOP Thrift插件的图示

下一讲,我们将分析一下,如何通过thrift实现大文件的断点续传,敬请收看!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:Thrift架构~动态Thrift插件的注入,如需转载请自行联系原博主。

目录
相关文章
|
6月前
|
缓存 测试技术 数据中心
【计算机架构】计算 CPU 动态功耗 | 集成电路成本 | SPEC 基准测试 | Amdahl 定律 | MIPS 性能指标
【计算机架构】计算 CPU 动态功耗 | 集成电路成本 | SPEC 基准测试 | Amdahl 定律 | MIPS 性能指标
254 0
|
存储 关系型数据库 MySQL
MySQL的插件式的存储引擎架构是什么意思?底层原理是什么?
MySQL的插件式的存储引擎架构是什么意思?底层原理是什么?
226 0
|
2月前
|
Web App开发 JavaScript 前端开发
分析网站架构:浏览器插件
分析网站架构:浏览器插件
|
7月前
|
Web App开发 Java 测试技术
2022 PlantUML 这款 IDEA 插件能搞,流程图、架构图,N种图... 简直神器!
2022 PlantUML 这款 IDEA 插件能搞,流程图、架构图,N种图... 简直神器!
360 0
|
8月前
|
运维 负载均衡 OceanBase
第四章:OceanBase集群技术架构(动态扩容和缩容)
第四章:OceanBase集群技术架构(动态扩容和缩容)
348 0
|
8月前
|
负载均衡 虚拟化 数据中心
变形金刚外传0x10-另一种采用双上联冗余的动态路由架构
过去的半个多月,笔者一直在研究实践NSX DC与非vSphere环境集成的场景。精力有限,停更了两个星期,现在重新出发,继续聊一聊NSX DC中的NSX-T。
变形金刚外传0x10-另一种采用双上联冗余的动态路由架构
|
8月前
|
测试技术 网络架构
变形金刚外传0x09-采用双上联冗余的动态路由架构
在之前0x08的分享中,我向各位演示了采用BGP动态路由协议实现物理-逻辑网络互通的基本配置。让我们再来回顾一下:
变形金刚外传0x09-采用双上联冗余的动态路由架构
|
10月前
|
安全 测试技术 Linux
Cloud Kernel SIG 月度动态:支持龙芯和申威架构,合入两个内存新特性
Cloud Kernel SIG 月度动态送达,一键了解 6 月各项目进展。
|
11月前
|
前端开发 JavaScript 中间件
手把手教你手写 Vite Server(二)—— 插件架构设计(下)
手把手教你手写 Vite Server(二)—— 插件架构设计(下)
300 0