图解Dubbo,六种扩展机制详解( 三 )


AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Main.class);PrintService printService = ExtensionLoader.getExtensionLoader(PrintService.class).getExtension("console");printService.print("hello world!"); 在以上示例代码中 , 我们通过getExtension()方法来获取PrintService接口的实现类 。getExtension()方法中的参数为扩展点的name属性 , 该属性值默认为“default” 。
在本示例中我们将name的值设置为“console” , 因此即使用了我们自定义的扩展点实现类 。
四、Dubbo的自定义扩展点机制1、什么是自定义扩展点机制

Dubbo的自定义扩展点机制是在SPI扩展机制的基础上 , 增加了自定义扩展点的实现方式 。通过Dubbo的扩展机制 , 我们可以通过配置文件切换Dubbo内部的实现方式 , 但是对于用户自己实现的功能模块 , 如何进行扩展呢?
这里就需要用到自定义扩展点机制了 。
下图是自定义扩展点机制的详细时序图:
图解Dubbo,六种扩展机制详解

文章插图
自定义扩展点机制
在上图中:
  1. 用户首先将自己实现的扩展点注册到Dubbo中;
  2. 然后在需要使用该扩展点的时候 , Dubbo会根据扩展点的名称进行查找并返回相应的扩展点实例;
  3. 通过这样的机制 , 用户可以灵活地扩展Dubbo的功能 , 同时也可以让Dubbo更加适应不同的业务场景 。
自定义扩展点的核心思想就是:“面向接口编程 , 实现类实现接口 , 接口与实现类通过扩展点Binder关联 。”
其中 , Binder的定义可以参考以下的代码:
public interface ExtensionFactory {// 返回一个扩展点的代理对象<T> T getExtension(Class<T> type, String name) throws IllegalStateException;}public interface ExtensionLoader<T> {T getExtension(String name);}public interface ExtensionBinder<T> {// 绑定void bind(T instance);// 获取绑定的扩展对象T get();}public interface ExtensionLoaderListener {void onLoad();}2、自定义扩展点机制的使用示例为了更好地理解Dubbo的自定义扩展点机制 , 我们可以通过一个简单的示例来演示其使用方法 。假设我们有一个接口HelloService , 我们想要通过自定义扩展点机制 , 为这个接口添加一个实现类 。
首先 , 我们需要创建一个实现类HelloServiceImpl , 该实现类需要实现HelloService接口 。
接着 , 我们需要在resources/META-INF/dubbo目录下创建一个名为com.xxx.HelloService的文件 , 该文件中需要指定HelloService接口的实现类名称 。
helloService=com.xxx.HelloServiceImpl 
接下来 , 我们需要在代码中获取HelloService接口的实例 。这可以通过以下方式实现:
ExtensionLoader<HelloService> loader = ExtensionLoader.getExtensionLoader(HelloService.class);HelloService helloService = loader.getExtension("helloService");helloService.sayHello(); 
其中 , getExtensionLoader()方法用于获取扩展点的ExtensionLoader实例 , getExtension()方法用于 获取具体的扩展实例 。
在上面的代码中 , 我们通过“helloService”这个名称获取到了实现了HelloService接口的HelloServiceImpl实例 , 并调用了其中的sayHello()方法 。
通过上述示例 , 我们可以看出 , 使用Dubbo的自定义扩展点机制非常简单 , 只需要在配置文件中指定实现类的名称 , 然后通过getExtensionLoader()和getExtension()方法获取实例即可 。
3、Dubbo的自定义扩展点机制的实现示例在Dubbo的自定义扩展点机制中 , 最核心的是ExtensionLoader类和ExtensionFactory类
其中 , ExtensionLoader用于加载和管理扩展实例 , ExtensionFactory用于创建扩展实例
下面 , 我们将通过一个简单的示例 , 演示Dubbo的自定义扩展点机制的具体实现方式 。
首先 , 我们需要定义一个扩展点接口:
public interface HelloService {String sayHello(String name);} 
接着 , 我们需要实现该接口的一个实现类:
@SPI("helloWorld")public class HelloWorldService implements HelloService {@Overridepublic String sayHello(String name) {return "Hello, " + name;}}


推荐阅读