首先在客户端启动时会从注册中心拉去和订阅对应的服务列表,Cluster会把拉取到的服务列表聚合成一个cluster,每次RPC调用前会通过Directory#list获取providers地址(已经生成好的invoker列表),获取这些服务列表给后续路由和负载均衡使用,框架内部另外一个实现Directory接口是RegistryDirectory类,它和接口名是一对一的关系,主要负责拉取和订阅服务提供者,动态配置和路由项
在dubbo发起服务调用时,所有路由和负载均衡都是在客户端实现的,客户端服务调用会先触发路由操作,然后将路由结果得到的服务列表作为负载均衡参数,经过负载均衡后会选出一台机器进行RPC调用,客户端经过路由和负载均衡后,会将请求交给底层I/O线程池(Netty)处理,I/O线程池主要负责处理读写,序列化和反序列化操作,非阻塞,线程池分为两种,一种是io线程池,一种是业务线程池
目前Dubbo将服务调用和Telnet调用做了端口复用,在编解码层做了适配,在Telnet调用时,会新建立一个TCP连接,传递接口,方法和JSON格式的参数进行服务调用,Telnet和正常RPC调用不一样的地方是序列化和反序列化的方式,telnet使用fastjson而不是hession