[dubbo]spi是啥?dubbo的spi是怎么实现的?
一、spi是啥
spi是啥?dubbo的spi是怎么实现的?
spi简单来说就是Service Provider Interface。说明了是什么意思呢?比如说你有个接口,现在这个接口有3个实现类。那么在系统运行的时候,这个接口到底选择哪个实现类呢?这就需要SPI啦。需要根据指定的配置或者默认的配置,去找到对应的实现类加载进来。然后用这个实现类的实例对象。
接口A——>实现A1,实现A2,实现A3。我们配置一下让接口A实现A2。在系统运行的时候,会加载你的配置,用实现A2实例化一个对象来提供服务。
spi机制一般说用在哪呢?插件扩展的场景。比如说你开发的是一个给别人使用的开源框架。如果你想让别人自己写个插件,插到你的开源框架里,扩展某个功能。
经典的思想体现,大家平时都用,比如说jdbc。java定义了一套jdbc的接口,但是java没有提供jdbc的实现类。实际项目跑的时候要使用jdbc的哪些实现类呢?比如mysql,你就讲mysql-jdbc-connector引入进来;oracle,你就将oracle-jdbc-connector引入进来。在系统跑的时候,碰到你使用的jdbc的接口,它会在底层使用你引入的那个jar中的实现类。
比如时候,可以扩展负载均衡算法。
二、实际项目中的应用
dubbo的spi扩展实现。 调用拦截扩展filter 。具体参考dubbo官网filter。
接下来再贴一篇Filter隐式传参。
场景:比如说A系统调用B系统的方法test(a,b)。现迭代一版需求,test方法需要借助参数c才能完成。也就是需要额外提供test(a,b,c)方法。(dubbo提供的接口不能直接扩展参数。假如扩展参数,B系统部署了2台服务,先部署B服务,新代码上线后,A服务调用B服务的新代码就会出错)。
我们系统中A调用B传参继承公共BaseapiRequest,它包含了requestID、user、以及一些公参(比如当前渠道号、安卓还是ios,p参数等)。