一、MBR、ObjRef、RealProxy、TransparentProxy 在真正进入PIAB之前,我们现来谈论一些与之相关的、必要的背景知识。 RealProxy根据ObjRef创建,通过RealProxy创建TransparentProxy。 当进行远程调用的时候,Client直接和TransparentProxy打交道,对TransparentProxy的调用将会Forward到RealProxy,RealProxy通过Remoting Infrastructure 我们在创建一个Factory Class,用于创建TransparentProxy。 最后通过RealProxy返回一个TransparentProxy。
在默认的情况下,EnterLib的PIAB采用基于TransparentProxy/RealProxy的机制实现对方法调用的拦截,进而实现了对横切关注点(Crosscutting Concern)的动态注入 我亲自在我自己开发的基于TransparentProxy/RealProxy的AOP框架(《自己动手创建迷你版AOP框架》)中经过验证,让抽象类继承MarshalByRefObject,并基于该抽象类创建一个可被拦截的 TransparentProxy对象是可以实现的。
四、RealProxy/TransparentProxy RealProxy/TransparentProxy是.NET Framework时代一种常用的方法拦截方案。 proxy.Invoke() == 1); Debug.Assert(Indicator.Injected == true); } } 五、DispatchProxy RealProxy/TransparentProxy
四、RealProxy/TransparentProxy RealProxy/TransparentProxy是.NET Framework时代一种常用的方法拦截方案。 proxy.Invoke() == 1); Debug.Assert(Indicator.Injected == true); } } 五、DispatchProxy RealProxy/TransparentProxy
InstanceBuidler:由于我们需根据InterceptingRealProxy<T>对象创建TransparentProxy,并通过TransparentProxy进行方法的调用,CallHandler InstanceBuilder用于方便的创建TransparentProxy对象。 三、具体实现 现在我们来详细分析实现的细节。 最后返回InterceptingRealProxy<T>对象的TransparentProxy对象。
而前者具有两种不同的实现:TransparentProxy/RealProxy的方式和Reflection Emit的方式。 此外,不知道读者有没有注意,上面的实现方式仅仅提供一种拦截方式,即基于TransparentProxy的方式,有兴趣的读者可以再作一些扩展,实现对拦截方式的定制。
这几年搞云原生的同学,基本都绕不开两个词:透明代理(TransparentProxy)Sidecar模式很多团队一上来就:“上ServiceMesh吧!可观测、限流、熔断全都有!”
最后,将服务调用的结果或抛出的异常通过TransparentProxy返回给客户端代码。 ?
PIAB提供了不同的方法劫持机制,最为典型的就是基于TransparentProxy(可以参考我的PIAB系列文章)和代码生成(比如动态生成一个继承自目标类型的子类,通过Override掉相应的Virtual
PIAB提供了不同的方法劫持机制,最为典型的就是基于TransparentProxy(可以参考我的PIAB系列文章)和代码生成(比如动态生成一个继承自目标类型的子类,通过Override掉相应的Virtual
Close)和终止(Abort)操作,我们采用基于AOP的方式实现服务的调用,将这些操作封装到一个自定义的RealProxy中,并通过ServiceProxyFactory<T>创建该RealProxy的TransparentProxy
Utility.Create<T>方法创建客户端进行服务调用必须的相关组件对象,通过这些对象连同该方法的参数(消息版本和服务目的地址)创建ServiceRealProxy<T>对象,最终返回的是该RealProxy的TransparentProxy