继续看服务的暴露

dubbo 检查是否注册成功 dubbo注册流程_dubbo 检查是否注册成功

1.入参为invoker,然后从invoker中获取providerUtl,解析出key

2.从本地缓存bounds中,获取exporter,如果没有,就先根据入参originInvoker生成invokerDelegete

3.然后调用DubboProtocol.export(), 还是先从invoker中获取url,根据url生成serviceKey,再根据url和key,创建出exporter

4.生成exporter后,就放入到exporterMap中

dubbo 检查是否注册成功 dubbo注册流程_序列化_02

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()方法实现,直

dubbo 检查是否注册成功 dubbo注册流程_dubbo 检查是否注册成功_03

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异步传输   

 

远程暴露流程:

dubbo 检查是否注册成功 dubbo注册流程_dubbo 检查是否注册成功_04

dubbo 检查是否注册成功 dubbo注册流程_dubbo 检查是否注册成功_05



先向本地注册表注册服务提供者,然后向注册中心注册自己服务

#openServer(url) 方法,启动通信服务器

#createServer(url) 方法,创建并启动通信服务器

  • 构造方法发起暴露,将自己添加到 exporterMap 中。
  • #unexport() 方法,取消暴露,将自己移除出 exporterMap 中