05. Dubbo中的Adaptive
1. 什么是Adaptive功能
Dubbo中的Adaptive功能,主要解决的问题是如何动态的选择具体的扩展点。通过getAdaptiveExtension
统一对指定接口对应的所有扩展点进行封装,通过URL的方式对扩展点来进行动态选择。(dubbo中所有的注册信息都是通过URL的形式进行处理的)这里同样采用相同的方式进行实现。
2. 实现方式
前置内容参考:Dubbo中的SPI中的3.1节。
2.1
在dubbo_spi_demo_api
的com.dxh.service.HelloService
中新增一个方法,该方法有一个参数URL
(import org.apache.dubbo.common.URL),且该方法使用@Adaptive注解。
package com.dxh.service;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.extension.Adaptive;
import org.apache.dubbo.common.extension.SPI;
//这里的“增加的dog”是默认值
@SPI("dog")
public interface HelloService {
String sayHello();
@Adaptive
String sayHello(URL url);
}
2.2
新增了方法,所以补充实现类
2.3
在dubbo_spi_demo_main
中新建类
package com.dxh;
import com.dxh.service.HelloService;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.extension.ExtensionLoader;
public class DubboSpiMainTestAdaptive {
public static void main(String[] args) {
HelloService adaptiveExtension = ExtensionLoader.getExtensionLoader(HelloService.class).getAdaptiveExtension();
URL url = URL.valueOf("test://localhost/hi?hello.service=human");
String hello = adaptiveExtension.sayHello(url);
System.out.println(hello);
}
}
注释:
- 因为在这里只是临时测试,所以为了保证URL规范,前面的信息均为测试值即可,关键的点在于
hello.service
参数,这个参数的值指定的就是具体的实现方式。关于为什么叫hello.service
是因为这个接口的名称,其中后面的大写部分被dubbo自动转码为.
分割。 - 通过
getAdaptiveExtension
来提供一个统一的类来对所有的扩展点提供支持(底层对所有的扩展点进行封装)。 - 调用时通过参数中增加
URL
对象来实现动态的扩展点使用。
=
号后面的内容就是之前META_INF.dubbo中配置的key
通过@SPI("dog")
配置默认值,这样url中如果不传?
后面的就以默认值为准