sofa-rpc 的SPI机制和dubbo的SPI机制都是同源于java的SPI,通过SPI你可以在不改变内核任何源码的情况下进行扩展,甚至替换组件。
java的spi,可以通过博文
https://docs.oracle.com/javase/tutorial/ext/basics/spi.html 与https://www.developer.com/java/article.php/3848881/Service-Provider-Interface-Creating-Extensible-Java-Applications.htm 对其基本了解。
sofa-rpc 的SPI的功能主要关键点:
(1)引入注解@Extensible
代表这个抽象类或者接口是可扩展的,可以配置指定自定义扩展文件名称,默认就是全类名;扩展类是否使用单例,默认使用。
(2)引入注解@Extension
标识该类是一个扩展实现类,可以指定扩展点的名字,也可以在扩展点文件中指定,不过同时指定,名字必须相同。
(3)扩展点配置文件默认路径:META-INF/services/sofa-rpc/、META-INF/services/
当然,sofa-rpc也支持自定义这些路径(除非必要,建议按默认约定)。路径当然和java 和dubbo的路径是不同的。
(4)ExtensionClass:
代码扩展接口实现类,从配置文件读取路径,并结合注解Extension而生成的。
(5)ExtensionLoader
一个可扩展接口类,对应一个加载器;主要职责是从配置路径中读取并实例化一个可扩展接口的所有实现类。
(6)ExtensionLoaderFactory
ExtensionLoader的工程类,并且做了ExtensionLoader的缓存。
sofa-rpc 已知的扩展:
具体例子见:https://github.com/alipay/sofa-rpc/wiki/Extension-Loader
及https://github.com/sdcuike/sofa-rpc-demo/blob/master/src/main/java/com/sdcuike/extensionloader/DemoSeviceLoaderMain.java