大纲模块分包原则框架扩展原则模型划分原则接口分离原则组件协作原则功能演进原则R P CR e m o 'n gB u s i n e s sreferreceivedrequest connect bindconnectbindsendreplyinvokeinvokeencode merge write readgetProxygetInvokerexportreferdecode serializeselect listregister getExecutor noEfygetRegistrynoEfylist invoke invoke Provider Consumer ExporterInterfaceProxyFilterInvoker InvokerFilter ImplementClientServer TransporterLoadBalanceProtocolNoEfyListenerRegistryProtocolRegistryExchange ServiceSerializaEon Inherit Init Dubbo F rameworkDependDubboInvoker DubboProtocol DubboExporterInterface Class ProxyFactoryInvokerProxy ReferenceConfigServiceConfigConfig Call Cluster CodecObjectOutput ObjectInput Exchanger TransportSerialize Directory ClusterThreadPoolRegistryProtocol U s e r A P IC o n t r i b u t o r S P I RegistryFactory RegistryDirectorydeserialize exportinvokeinvokeinvoke export ChannelHandlerExchangeHandlerRouterRouterFactoryMonitor Monitor MonitorFactory route MonitorFilterExchangeSerever ExchangeClient count referreceived getMonitorStart get exportinvokeinvokenewsubscribe Dispatcher getRouter dispatchDubboHandler merge getRoutergetRegistrygetMonitorwrap connect connect bindbind模块分包原则 • 复用度– 包中的类应该有同样的重用可能性,– 紧密协作的类应该放在一个包。
– 对于变化因子,包中的类应全改或全不改,– 变化应在包内终止,而不传播到其它包。
– 发布的粒度和复用度相同。
• 稳定度– 被依赖的包应该总是比依赖者更稳定,– 不要让一个稳定的包依赖于不稳定包。
– 单向依赖,无环依赖。
• 抽象度– 越稳定的包应该越抽象,– 稳定的包不抽象将导致扩展性极差,– 抽象的包不稳定将导致其依赖包跟随变化。
稳定不稳定非常不稳定抽象具体 packageimport c om.foo.*• I = C e / (Ca + C e)I: I nstabilityCa: Afferent C oupling (Used b y p ackges)Ce: Efferent C oupling (Depend u pon p ackges)• A = N a / N cA: A bstractnessNa: N umber o f a bstract c lassesNc: N umber o f c lasses (Include a bstractclasses)JDepend • D = a bs(1 -‐ I -‐ A) * s in(45)D: D istanceI: I nstabilityA: A bstractness大纲模块分包原则框架扩展原则模型划分原则接口分离原则组件协作原则功能演进原则平等对待第三方• Dogfooding– 框架自己的功能也要扩展点实现– 甚至微核的加载方式也可以扩展• Autowire– 装配逻辑由扩展点之间互助完成– 杜绝硬编码的桥接和中间代码• Cascading– 层叠扩展粒度,逐级细分– 由大的扩展点加载小的扩展点• Law o f D emeter– 只与触手可及的扩展点交互,间接转发 – 保持行为单一,输入输出明确Dogfooding Autowire最少化概念模型• Filter -‐> C hain?– Result filter(Chain c, I nvocaEon i);• return c.doNext(i);– Result i nvoke(Invoker v, I nvocaEon i) • return v.invoke(i);Proxy InvokerProxy Filter Chain Filter InvokerProxy Filter Invoker Filter Invoker• 微核心,插件式,平等对待第三方。
第一步• 每个扩展点只封装一个变化因子,最大化复用。
第二步• 全管道式设计,框架自身逻辑,均使用截面拦截实现。
第三步• 最少概念,一致性概念模型。
第四步• 分层,增量式扩展,而不是扩充式扩展。
第五步大纲模块分包原则框架扩展原则模型划分原则接口分离原则组件协作原则功能演进原则核心领域模型划分原则 • 服务域– 指产品主要功能入口,同时负责实体域和会话域的生命周期管理。
– Velocity的Engine– Spring的BeanFactory• 实体域– 表示你要操作的对象模型,不管什么产品,总有一个核心概念,大家都绕围它转。
– Velocity的Template– Spring的Bean• 会话域– 表示每次操作瞬时状态,操作前创建,操作后销毁。
– Velocity的Context– Spring的InvocaEonServiceSessionEnEtyinitrun行为状态混杂• 如果不看文档,你很难猜到它的用法,这个类集实体域,会话域,服务域于一身,非常复杂,即表示任务本身(实体域),也包含执行过程的状态(会话域),同时也具有主动执行能力(服务域)。
数据传递隐晦• 比如:doInBackground()的返回值是给done()方法用的,而且要通过get()方法获取到返回值。
全局有状态• 这个类和Thread类一样,只能执行一次,多次执行是无效的,因为其有状态,所以这样做是正确的。
实体域• Task表示任务本身• TaskListener为事件通知,所有的UI操作均放在Listener里处理• TaskAdapter同时实现Task接口和TaskListener接口会话域• TaskContext为互上下文,保存执行过程中的状态• TaskEvent为事件信息服务域• TaskExecutor提供执行能力,为执行入口• TaskService做为SPI,这样就可以同时适配Swing/AWT和大纲模块分包原则框架扩展原则模型划分原则接口分离原则组件协作原则功能演进原则API & S PI• Dubbo A PI– ServiceConfig– ReferenceConfig– RpcContext • Dubbo S PI– Protocol– Transporter– LoadBalanceAPISPI FrameworkUser DeveloperAPI 可配置,一定可编程 • 配置用于简化常规使用• 编程接口用于框架集成<dubbo:service i nterface="com.alibaba.xxx.XxxService“v ersion="1.0.0” r ef="xxxService"/>ServiceConfig s ervice = n ew S erviceConfig(); service.setInterface("com.alibaba.xxx.XxxService"); service.setVersion("1.0.0"); service.setRef(xxxService);service.export();博客:h[p:///blog/949527大纲模块分包原则框架扩展原则模型划分原则接口分离原则组件协作原则功能演进原则管道 v.s. 派发 • 管道– 组合行为– 主功能以截面实现– 比如:Servlet • 派发– 策略行为– 主功能以事件实现– 比如: Swing行为A行为B行为C 行为A行为B行为C控制器分布 v.s. 共享 • 分布– 在行为交互为主的系统是适用– 状态通过行为传递 • 共享– 在以管理状态为主的系统中适用– 状态通过仓库共享行为A行为B行为C 状态A状态B状态C行为A行为B行为C状态A状态B状态C共享仓库Dubbo调用过程拦截Proxy Filter Invoker ImplFilter InvokerProtocolcontext deprecated collect generic acEvelimit monitor future…token excepEon echo accesslog trace classloader executelimit …Reactor v.s. P roactorReactorHandlerHandler Source Proactor Handler Sourceloop register eventeventpublish publishDubbo 暴露/引用/调用事件FrameworkListenerListenerListenerListener onreturnoninvoke invoke referexportreferred exported destroyedunexported。