RPC服务框架设计无非涉及四个大方面:
IO模型:NIO , BIO
序列化方式:Java原生,FastJson,Hessian,Jackson等等
线程模型:单线程处理每个socket连接 , 采用reactor 模式
代理对象的生成:JDK 动态代理,Javassist等字节码增强工具。
dubbo 核心机制
Bean加载机制(指代业务代码类):采用Spring Schema 机制 对具体的业务类来进行配置 http://my.oschina.net/robinyao/blog/478050
插件扩展机制:采用类似JDK SPI思想来对框架具体实现机制来进行配置,不依赖sping。
dubbo 代理
JDK动态代理,或Javassist字节码技术生产代理,把本地方法调用转为远程调用,即通过DubboInvoker 来触发方法调用。
代理工厂会提供一个生成ProxyInvoker方法(AbstractProxyInvoker),来供上层触发调用。
dubbo 远程调用
dubbo远程调用协议包括默认的dubbo协议,HessianProtocol,HttpProtocol,InjvmProtocol,MemcachedProtocol等等。
这里以dubbo协议来说明。
DubboProtocol协议采用netty协议来进行网络传输。
客户端: 把请求内容封装在RpcInvocatioin中, 通过调用Invoker(DubboInvoker)上的invoke方法,
然后由ExchangeClient调用具体的NettyTransporter发起网络调用。NettyTransporter具体封装Netty通讯,包括服务提供端监听服务,客户端发起请求。
服务提供端:在服务启动的时候,服务器端会把具体的服务通过ProxyFactory生产Invoker(AbstractProxyInvoker)供exporter调用,该invoker 直接可以在proxy(指代服务提供端本地proxy)对象上对服务的具体实现调用。每个服务url对应一个exporter,通过该exporter 可以得到invoker
dubbo 调用数据流
其中Invocation 封装了调用的方法名 参数 参数类型等基本信息。
Invoker是发起调用的实体,Invoker(DubboInvoker)实现类会封装ExchangeClient发起远程调用(包含异步,同步,oneWay方式)。ExchangeClient实现对channel,心跳等封装。远程调用通讯方式包含netty,mina,grizzly,zookeeper,p2p 实现方式。
在服务提供端 ExchangeServer,ExchangeHandler 负责对所有连接的Channel管理:心跳,添加,移除 channel,及采用哪种具体protocol进行具体接收发送消息。
ExchangeClient,ExchangeServer,ExchangeHandler 这一层是对下边具体的通讯层包装。
未完待续。。。。(dubbo 负载 ,集群,监控)
http://my.oschina.net/robinyao/blog/489487