Dubbo消费端可以让我们在调用远程服务时本身是无感知的,就像在本地调用方法一样。
消费端主要内容有配置初始化、服务订阅和创建代理对象。
消费端的核心类是ReferenceBean,ReferenceBean继承了ReferenceConfig类,实现了FactoryBean、InitializingBean、DisposableBean和ApplicationContextAware接口。
配置初始化相关
Dubbo核心类ReferenceConfig继承了AbstractReferenceConfig、AbstractInterfaceConfig、AbstractMethodConfig和AbstractConfig类。
AbstractConfig:配置解析的工具方法和公共方法。
AbstractMethodConfig:封装了配置文件标签中方法级别的相关属性。
AbstractInterfaceConfig:封装了配置文件标签中接口级别的相关属性。
AbstractReferenceConfig:封装了引用实例的默认配置,比如检查服务实例是否存在,是否使用泛化接口、版本号等。
ReferenceConfig:封装了全局配置,包括接口名、方法配置、默认配置等。
服务订阅和创建代理对象相关
服务订阅流程是先判断当前的服务是本地服务还是远程的;根据SPI找到对应的Protocol类,生成对应的URL协议;与注册中心进行交互,“watch”相应的节点。
Invoker代表一个可执行的对象,可以是本地执行类的Invoker,比如provider端的服务实现类,通过反射实现最终的方法调用。也可以是一个远程通信执行类的Invoker, consumer端通过接口与provider端进行远程通信,provider端利用本地Invoker执行相应的方法并返回结果。还可以是聚合Invoker, consumer调用端可以将多个Invoker聚合成一个Invoker执行操作。
Protocol是通信协议,默认的Protocol是DubboProtocol,通过Protocol创建Invoker对象,默认的也就是DubboInvoker。
RegistryProtocol用于服务注册和订阅,涉及以下几个关键类。
ZooKeeperRegistry:负责与ZooKeeper进行交互。
RegistryProtocol:从注册中心获取可用服务,或者将服务注册到ZooKeeper,然后提供服务或调用代理。
RegistryDirectory:维护所有可用的远程Invoker或本地的Invoker。这个类实现了NotifyListner。
NotifyListener:负责RegistryDirectory和ZooKeeperRegistry的通信。
FailbackRegistry:继承自Registry,实现了失败重试机制。
ProxyFactory对于Consumer端来说是通过ProxyFactory创建调用接口的代理对象,对于Provider端来说主要是包装本地执行的Invoker类。ProxyFactory接口的实现类有JdkProxyFactory和JavassistProxyFactory,而默认是JavassistProxyFactory。JdkProxyFactory是利用JDK自带的Proxy来动态代理目标对象的远程通信Invoker类。JavassistProxyFactory是利用Javassit字节码技术来创建的远程通信Invoker类。
在ZooKeeper中,Dubbo的节点为根节点,第二层为接口层存放服务类的全路径,第三层是服务提供者和服务消费者集合,第四层为各自的注册地址。
在RegistryProtocol类的refer方法中主要通过getRegistry方法获取ZooKeeperRegistry实例,并将ZooKeeperRegistry实例以参数的方式传入doRefer方法;通过FailbackRegistry实例的register方法调用ZooKeeperRegistry实例的doRegister方法实现消费者的地址注册;通过FailbackRegistry实例的subscribe方法调用ZooKeeperRegistry实例的doSubscribe方法实现订阅服务;接着返回默认的集群和容错Invoker实例,最终会使用InvokerInvocationHandler将服务接口包装成一个代理类并返回。我们在调用服务接口的时候就会触发代理类,通过代理类实现服务路由、服务选取,以及与服务提供者Provider端的远程通信,这些过程服务调用者是无法感知的,就像在应用中调用本地方法一样简单。
网友评论