Dubbo's extension point loading system improves upon Java's standard SPI (Service Provider Interface) by addressing several limitations:
- Java SPI instanitates all implementations at once, potentially wasting resources on unused extensions
- Java SPI doesn't properly handle extension loading failures, making troubleshooting difficult
- Dubbo adds support for IoC (Inversion of Control) and AOP (Aspect-Oriented Programming) features
Key Features of Dubbo Extension Points
Dubbo uses two primary annotations for extension points:
@SPI - Marks an interface as extensible
@Adaptive - Can be applied to classes or methods
The @Adaptive annotation has two usage patterns:
- On classes (rare, used only for special cases like AdaptiveCompiler)
- On interface methods (common, generates dynamic adapter code)
Example Interface with Extension Points
@SPI(RandomLoadBalance.NAME)
public interface LoadBalancer {
@Adaptive("loadbalance")
<T> Invoker<T> select(List<Invoker<T>> providers,
URL endpoint,
Invocation call) throws RpcException;
}
Implementing a Dubbo Extension
To create a custom extension in Dubbo:
- Create an implementation class:
public class CustomBalancer extends AbstractLoadBalancer {
@Override
protected <T> Invoker<T> chooseProvider(List<Invoker<T>> providers,
URL endpoint,
Invocation call) {
// Implementation logic here
return null;
}
}
- Create a configuration file in
META-INF/dubbo/:
customBalancer=com.example.balance.CustomBalancer
- Load and use the extension:
public class BalancerTest {
public static void main(String[] args) {
LoadBalancer balancer = ExtensionLoader
.getExtensionLoader(LoadBalancer.class)
.getExtension("customBalancer");
System.out.println(balancer.getClass().getName());
}
}