继续看服务的暴露
1.入参为invoker,然后从invoker中获取providerUtl,解析出key
2.从本地缓存bounds中,获取exporter,如果没有,就先根据入参originInvoker生成invokerDelegete
3.然后调用DubboProtocol.export(), 还是先从invoker中获取url,根据url生成serviceKey,再根据url和key,创建出exporter
4.生成exporter后,就放入到exporterMap中
5.继续看核心方法 operServer,首先根据入参url获取地址address,然后获取参数isServer,为true的时候,才从serverMap中获取server。获取不到,就调用createServer,如果能获取到server,就调用server.reset进行重置
6.继续看核心方法createServer
7.给服务提供者的url增加属性,包括只读,心跳,server(netty),编码方式为DubboCodec
8.通过调用Exchangers.bind(url, requestHandler) 来创建出server,会创建出一个HeaderExchangeServer
9.本质上是调用Transporter.bind()方法实现,直
10.NettyServer的doOpen方法,依旧是创建boss和worker两个线程池,然后创建出对应的channelFactory,再创建ServerBootStrap
11.根据NettyHandler获取channels,并且继续创建出pipeline,把decoder,encoder和handler都加入到pipeline中
++++++++++++++++++++++++++++++++++++++++++++++++
1.各协议的比较
协议名称 | 实现描述 | 连接 | 使用场景 |
dubbo | 传输:mina、netty、grizzy 序列化:dubbo、hessian2、java、json | dubbo缺省采用单一长连接和NIO异步通讯 | 1.传入传出参数数据包较小 2.消费者 比提供者多 3.常规远程服务方法调用 4.不适合传送大数据量的服务,比如文件、传视频 |
rmi | 传输:java rmi 序列化:java 标准序列化 | 连接个数:多连接 连接方式:短连接 传输协议:TCP/IP 传输方式:BIO | 1.常规RPC调用 2.与原RMI客户端互操作 3.可传文件 4.不支持防火墙穿透 |
hessian | 传输:Serverlet容器 序列化:hessian二进制序列化 | 连接个数:多连接 连接方式:短连接 传输协议:HTTP 传输方式:同步传输 | 1.提供者比消费者多 2.可传文件 3.跨语言传输 |
http | 传输:servlet容器 序列化:表单序列化 | 连接个数:多连接 连接方式:短连接 传输协议:HTTP 传输方式:同步传输 | 1.提供者多余消费者 2.数据包混合 |
webservice | 传输:HTTP 序列化:SOAP文件序列化 | 连接个数:多连接 连接方式:短连接 传输协议:HTTP 传输方式:同步传输 | 1.系统集成 2.跨语言调用 |
thrift | 与thrift RPC实现集成,并在基础上修改了报文头 | 长连接、NIO异步传输 | |
远程暴露流程:
先向本地注册表注册服务提供者,然后向注册中心注册自己服务
#openServer(url)
方法,启动通信服务器
#createServer(url)
方法,创建并启动通信服务器
- 构造方法,发起暴露,将自己添加到
exporterMap
中。 -
#unexport()
方法,取消暴露,将自己移除出exporterMap
中