dubbo中可以适配其它的rpc协议和注册中心,对于有些企业自定义rpc的(我厂目前就是这样,用的非常难受),也可以将其适配到dubbo
dubbo中的SPI
先从dubbo中的spi说起,dubbo为每个关键接口都提供了spi的支持,包括Router, Registry, Protocol等,对于扩展接口,比如Registry,会有一个RegistryFactory,这个RegistryFactory接口被标记了@SPI注解,表示此接口是一个扩展点,代码如下:
在META-INF/dubbo.internal/下会有以接口名为文件名的文件,其中配置的是扩展点的实现类:
其中是扩展点的配置,className的格式:
适配RPC
想要适配RPC,最简单的方式就是实现两个扩展:
- 是否需要使用特定的注册中心逻辑,如果需要,则实现RegistryFactory扩展点
- 实现Protocol扩展点,用于支持RPC协议
实现方式非常简单,首先自定义RegistryFactory:
此factory的getRegistry方法返回自定义的CustomRegistry,用于处理服务注册和服务发现:
最后在META-INF/dubbo/internal下准备spi配置文件:
添加com.alibaba.dubbo.registry.RegistryFactory文件,其中配置上面的RegistryFactory:
custom=com.xxx.dubbo.CustomRegistryFactory
到此,注册中心逻辑的扩展已经完成,Protocol的扩展逻辑与此类似,只需要实现Protocol扩展点,自定义的Protocol可从AbstractProxyProtocol类继承,Protocol接口如下:
其中两个主要方法:
- export方法用于暴漏远程服务,比如监听端口开启服务
- refer用于引用服务,即创建表示某个远程地址的服务的Invoker对象,Invoker对象中封装远程调用的逻辑