Apache Dubbo is a powerful RPC framework for building enterprise-grade microservices with service discovery, load balancing, and fault tolerance.
—
Apache Dubbo provides comprehensive Spring Boot integration through auto-configuration, annotations, and properties-based configuration. This enables seamless integration with Spring Boot applications and Spring ecosystem components.
Dubbo Spring Boot starter provides automatic configuration and component registration.
/**
* Main Dubbo auto-configuration class
*/
@Configuration
@ConditionalOnProperty(prefix = DUBBO_PREFIX, name = "enabled", matchIfMissing = true)
@ConditionalOnClass(DubboBootstrap.class)
@EnableConfigurationProperties({DubboConfigurationProperties.class})
@Import({DubboConfigConfiguration.class, DubboServiceConfiguration.class})
public class DubboAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DubboBootstrap dubboBootstrap() {
return DubboBootstrap.getInstance();
}
@Bean
@ConditionalOnProperty(prefix = DUBBO_APPLICATION_PREFIX, name = "name")
@ConditionalOnMissingBean
public ApplicationConfig applicationConfig(DubboConfigurationProperties properties) {
return properties.getApplication();
}
@Bean
@ConditionalOnMissingBean
public DubboLifecycleComponentApplicationListener dubboLifecycleComponentApplicationListener() {
return new DubboLifecycleComponentApplicationListener();
}
}
/**
* Dubbo configuration properties binding
*/
@ConfigurationProperties(prefix = DUBBO_PREFIX)
public class DubboConfigurationProperties {
public static final String DUBBO_PREFIX = "dubbo";
private ApplicationConfig application = new ApplicationConfig();
private ModuleConfig module = new ModuleConfig();
private RegistryConfig registry = new RegistryConfig();
private ProtocolConfig protocol = new ProtocolConfig();
private MonitorConfig monitor = new MonitorConfig();
private ProviderConfig provider = new ProviderConfig();
private ConsumerConfig consumer = new ConsumerConfig();
private ConfigCenterConfig configCenter = new ConfigCenterConfig();
private MetadataReportConfig metadataReport = new MetadataReportConfig();
private MetricsConfig metrics = new MetricsConfig();
private SslConfig ssl = new SslConfig();
// Multiple configurations support
private Map<String, ApplicationConfig> applications = new HashMap<>();
private Map<String, ModuleConfig> modules = new HashMap<>();
private Map<String, RegistryConfig> registries = new HashMap<>();
private Map<String, ProtocolConfig> protocols = new HashMap<>();
private Map<String, ProviderConfig> providers = new HashMap<>();
private Map<String, ConsumerConfig> consumers = new HashMap<>();
// Getters and setters...
public ApplicationConfig getApplication() { return application; }
public void setApplication(ApplicationConfig application) { this.application = application; }
public Map<String, RegistryConfig> getRegistries() { return registries; }
public void setRegistries(Map<String, RegistryConfig> registries) { this.registries = registries; }
public Map<String, ProtocolConfig> getProtocols() { return protocols; }
public void setProtocols(Map<String, ProtocolConfig> protocols) { this.protocols = protocols; }
}Main annotation for enabling Dubbo functionality in Spring applications.
/**
* Enable Dubbo functionality annotation
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Import(DubboComponentScanRegistrar.class)
public @interface EnableDubbo {
/**
* Base packages to scan for Dubbo components
* @return Base package names
*/
String[] scanBasePackages() default {};
/**
* Base package classes to scan for Dubbo components
* @return Base package classes
*/
Class<?>[] scanBasePackageClasses() default {};
/**
* Multiple registries support
* @return Whether to support multiple registries
*/
boolean multipleConfig() default true;
}
/**
* Dubbo component scan registrar
*/
public class DubboComponentScanRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
// Register Dubbo component scanners
Set<String> packagesToScan = getPackagesToScan(importingClassMetadata);
registerServiceAnnotationBeanPostProcessor(packagesToScan, registry);
registerReferenceAnnotationBeanPostProcessor(registry);
}
}Usage Examples:
@SpringBootApplication
@EnableDubbo(scanBasePackages = "com.example.service")
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
// Alternative with base package classes
@EnableDubbo(scanBasePackageClasses = {ServiceConfig.class, ReferenceConfig.class})
public class DubboConfiguration {
}Annotation for marking Spring beans as Dubbo service providers.
/**
* Dubbo service provider annotation
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Inherited
public @interface DubboService {
/** Service interface class */
Class<?> interfaceClass() default void.class;
/** Service interface name */
String interfaceName() default "";
/** Service version */
String version() default "";
/** Service group */
String group() default "";
/** Service path */
String path() default "";
/** Export flag */
boolean export() default true;
/** Service token */
String token() default "";
/** Service deprecated flag */
boolean deprecated() default false;
/** Service dynamic flag */
boolean dynamic() default true;
/** Access log */
String accesslog() default "";
/** Execute limit */
int executes() default -1;
/** Registration flag */
boolean register() default true;
/** Service weight */
int weight() default -1;
/** Document URL */
String document() default "";
/** Service delay */
int delay() default -1;
/** Service tags */
String tag() default "";
/** Service timeout (ms) */
int timeout() default -1;
/** Service retry times */
int retries() default -1;
/** Load balance strategy */
String loadbalance() default "";
/** Enable async invocation */
boolean async() default false;
/** Protocol names */
String[] protocol() default {};
/** Monitor */
String monitor() default "";
/** Validation */
String validation() default "";
/** Compression */
String compression() default "";
/** Serialization */
String serialization() default "";
/** Cache */
String cache() default "";
/** Filter */
String[] filter() default {};
/** Listener */
String[] listener() default {};
/** Parameters */
Parameter[] parameters() default {};
/** Application bean name */
String application() default "";
/** Module bean name */
String module() default "";
/** Provider bean name */
String provider() default "";
/** Protocol bean names */
String[] protocols() default {};
/** Monitor bean name */
String[] monitors() default {};
/** Registry bean names */
String[] registries() default {};
}
/**
* Parameter annotation for service configuration
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Parameter {
String key();
String value();
}Usage Examples:
// Basic service provider
@DubboService
public class GreeterServiceImpl implements GreeterService {
@Override
public String sayHello(String name) {
return "Hello, " + name + "!";
}
}
// Advanced service provider configuration
@DubboService(
version = "1.0.0",
group = "production",
timeout = 5000,
retries = 2,
loadbalance = "roundrobin",
protocol = {"dubbo", "rest"},
filter = {"validation", "cache"},
parameters = {
@Parameter(key = "cache.size", value = "1000"),
@Parameter(key = "validation.enabled", value = "true")
}
)
public class UserServiceImpl implements UserService {
@Override
public User getUserById(Long id) {
// Implementation
}
}
// Service with specific registries
@DubboService(registries = {"registry1", "registry2"})
public class PaymentServiceImpl implements PaymentService {
// Implementation
}Annotation for injecting Dubbo service references into Spring beans.
/**
* Dubbo service reference annotation
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
public @interface DubboReference {
/** Service interface class */
Class<?> interfaceClass() default void.class;
/** Service interface name */
String interfaceName() default "";
/** Service version */
String version() default "";
/** Service group */
String group() default "";
/** Service URL */
String url() default "";
/** Client type */
String client() default "";
/** Generic service */
String generic() default "";
/** Injvm */
boolean injvm() default true;
/** Check */
boolean check() default true;
/** Init */
boolean init() default false;
/** Lazy */
boolean lazy() default false;
/** Sticky */
boolean sticky() default false;
/** Reconnect */
String reconnect() default "";
/** Stub */
String stub() default "";
/** Proxy */
String proxy() default "";
/** Cluster */
String cluster() default "";
/** Connections */
int connections() default -1;
/** Callbacks */
int callbacks() default -1;
/** On connect */
String onconnect() default "";
/** On disconnect */
String ondisconnect() default "";
/** Owner */
String owner() default "";
/** Layer */
String layer() default "";
/** Retry times */
int retries() default -1;
/** Load balance */
String loadbalance() default "";
/** Async */
boolean async() default false;
/** Active limit */
int actives() default -1;
/** Sent */
boolean sent() default true;
/** Mock */
String mock() default "";
/** Validation */
String validation() default "";
/** Timeout */
int timeout() default -1;
/** Cache */
String cache() default "";
/** Filter */
String[] filter() default {};
/** Listener */
String[] listener() default {};
/** Parameters */
Parameter[] parameters() default {};
/** Application bean name */
String application() default "";
/** Module bean name */
String module() default "";
/** Consumer bean name */
String consumer() default "";
/** Monitor bean name */
String monitor() default "";
/** Registry bean names */
String[] registries() default {};
/** Protocol */
String protocol() default "";
}Usage Examples:
// Basic service consumer
@RestController
public class UserController {
@DubboReference
private UserService userService;
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
}
// Advanced reference configuration
@Service
public class OrderService {
@DubboReference(
version = "1.0.0",
group = "production",
timeout = 3000,
retries = 2,
loadbalance = "leastactive",
cluster = "failover",
async = true,
check = false
)
private PaymentService paymentService;
@DubboReference(
url = "dubbo://localhost:20880/InventoryService",
timeout = 5000
)
private InventoryService inventoryService;
public void createOrder(Order order) {
// Use injected services
paymentService.processPayment(order.getPayment());
inventoryService.reserveItems(order.getItems());
}
}
// Method injection
@Component
public class NotificationService {
private EmailService emailService;
@DubboReference(version = "2.0.0")
public void setEmailService(EmailService emailService) {
this.emailService = emailService;
}
}Spring Boot configuration properties for Dubbo settings.
/**
* Application properties configuration mapping
*/
public class DubboConfigurationProperties {
// Application configuration
@NestedConfigurationProperty
private ApplicationConfig application = new ApplicationConfig();
// Protocol configurations
private Map<String, ProtocolConfig> protocols = new HashMap<>();
// Registry configurations
private Map<String, RegistryConfig> registries = new HashMap<>();
// Provider configurations
private Map<String, ProviderConfig> providers = new HashMap<>();
// Consumer configurations
private Map<String, ConsumerConfig> consumers = new HashMap<>();
// Configuration center
@NestedConfigurationProperty
private ConfigCenterConfig configCenter = new ConfigCenterConfig();
// Metadata report
@NestedConfigurationProperty
private MetadataReportConfig metadataReport = new MetadataReportConfig();
// Metrics configuration
@NestedConfigurationProperty
private MetricsConfig metrics = new MetricsConfig();
// SSL configuration
@NestedConfigurationProperty
private SslConfig ssl = new SslConfig();
// Tracing configuration
@NestedConfigurationProperty
private TracingConfig tracing = new TracingConfig();
}Configuration Examples:
# Application configuration
dubbo.application.name=my-dubbo-app
dubbo.application.version=1.0.0
dubbo.application.owner=development-team
dubbo.application.organization=my-company
# Protocol configuration
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.protocol.threads=200
dubbo.protocol.serialization=hessian2
# Multiple protocols
dubbo.protocols.dubbo.name=dubbo
dubbo.protocols.dubbo.port=20880
dubbo.protocols.rest.name=rest
dubbo.protocols.rest.port=8080
dubbo.protocols.rest.server=netty
# Registry configuration
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.registry.timeout=5000
dubbo.registry.check=true
# Multiple registries
dubbo.registries.zk1.address=zookeeper://127.0.0.1:2181
dubbo.registries.zk1.group=dubbo
dubbo.registries.nacos1.address=nacos://127.0.0.1:8848
dubbo.registries.nacos1.group=DEFAULT_GROUP
# Provider defaults
dubbo.provider.timeout=3000
dubbo.provider.retries=2
dubbo.provider.loadbalance=roundrobin
# Consumer defaults
dubbo.consumer.timeout=5000
dubbo.consumer.retries=3
dubbo.consumer.check=false
# Configuration center
dubbo.config-center.address=zookeeper://127.0.0.1:2181
dubbo.config-center.group=dubbo
dubbo.config-center.check=true
# Metrics
dubbo.metrics.enabled=true
dubbo.metrics.port=9090
dubbo.metrics.protocol=prometheus
# SSL/TLS
dubbo.ssl.enabled=true
dubbo.ssl.client-key-cert-chain-path=client.crt
dubbo.ssl.client-private-key-path=client.key
dubbo.ssl.client-trust-cert-collection-path=ca.crt
# QoS
dubbo.application.qos-enable=true
dubbo.application.qos-port=22222
dubbo.application.qos-accept-foreign-ip=falseYAML configuration:
dubbo:
application:
name: my-dubbo-app
version: 1.0.0
owner: development-team
qos-enable: true
qos-port: 22222
protocols:
dubbo:
name: dubbo
port: 20880
threads: 200
rest:
name: rest
port: 8080
server: netty
registries:
zk1:
address: zookeeper://127.0.0.1:2181
timeout: 5000
check: true
nacos1:
address: nacos://127.0.0.1:8848
group: DEFAULT_GROUP
provider:
timeout: 3000
retries: 2
loadbalance: roundrobin
consumer:
timeout: 5000
retries: 3
check: false
config-center:
address: zookeeper://127.0.0.1:2181
group: dubbo
metrics:
enabled: true
protocol: prometheus
port: 9090Integration with Spring Boot Actuator for monitoring and management.
/**
* Dubbo actuator auto-configuration
*/
@Configuration
@ConditionalOnClass({Endpoint.class, DubboBootstrap.class})
@ConditionalOnProperty(prefix = "management.endpoint.dubbo", name = "enabled", matchIfMissing = true)
public class DubboActuatorAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DubboEndpoint dubboEndpoint() {
return new DubboEndpoint();
}
@Bean
@ConditionalOnMissingBean
public DubboHealthIndicator dubboHealthIndicator() {
return new DubboHealthIndicator();
}
@Bean
@ConditionalOnMissingBean
public DubboMetadataEndpoint dubboMetadataEndpoint() {
return new DubboMetadataEndpoint();
}
}
/**
* Dubbo endpoint for actuator
*/
@Component
@Endpoint(id = "dubbo")
public class DubboEndpoint {
@ReadOperation
public Map<String, Object> dubbo() {
Map<String, Object> result = new HashMap<>();
result.put("application", getDubboApplication());
result.put("protocols", getDubboProtocols());
result.put("registries", getDubboRegistries());
result.put("services", getDubboServices());
result.put("references", getDubboReferences());
return result;
}
@ReadOperation
public Map<String, Object> services() {
return getDubboServices();
}
@ReadOperation
public Map<String, Object> references() {
return getDubboReferences();
}
@ReadOperation
public Map<String, Object> configs() {
Map<String, Object> configs = new HashMap<>();
configs.put("application", getDubboApplication());
configs.put("protocols", getDubboProtocols());
configs.put("registries", getDubboRegistries());
return configs;
}
}
/**
* Dubbo health indicator
*/
@Component
public class DubboHealthIndicator implements HealthIndicator {
@Override
public Health health() {
DubboBootstrap bootstrap = DubboBootstrap.getInstance();
if (!bootstrap.isStarted()) {
return Health.down()
.withDetail("status", "Dubbo is not started")
.build();
}
return Health.up()
.withDetail("status", "Dubbo is running")
.withDetail("services", getExportedServicesCount())
.withDetail("references", getReferencedServicesCount())
.build();
}
}Actuator Endpoints:
# Enable Dubbo actuator endpoints
management.endpoints.web.exposure.include=health,info,dubbo
management.endpoint.dubbo.enabled=true
management.endpoint.health.show-details=always
# Access endpoints:
# GET /actuator/dubbo - Overall Dubbo information
# GET /actuator/dubbo/services - Exported services
# GET /actuator/dubbo/references - Service references
# GET /actuator/dubbo/configs - Configuration details
# GET /actuator/health - Include Dubbo health statusTesting utilities for Dubbo Spring Boot applications.
/**
* Dubbo test annotation for integration tests
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@SpringBootTest
@ExtendWith(SpringExtension.class)
public @interface DubboTest {
/** Test application properties */
String[] properties() default {};
/** Test profiles */
String[] profiles() default {};
/** Enable embedded registry */
boolean embeddedRegistry() default true;
/** Registry port for testing */
int registryPort() default -1;
}
/**
* Mock Dubbo service annotation
*/
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MockDubboService {
/** Service interface */
Class<?> value();
/** Service version */
String version() default "";
/** Service group */
String group() default "";
}Testing Examples:
@DubboTest(
properties = {
"dubbo.application.name=test-app",
"dubbo.registry.address=N/A",
"dubbo.protocol.port=-1"
},
embeddedRegistry = false
)
class UserServiceTest {
@MockDubboService(UserService.class)
private UserService mockUserService;
@DubboReference
private UserService userService;
@Test
void testGetUser() {
// Mock service behavior
when(mockUserService.getUserById(1L))
.thenReturn(new User(1L, "Test User"));
// Test service call
User user = userService.getUserById(1L);
assertEquals("Test User", user.getName());
}
}
// Integration test with embedded registry
@DubboTest
@TestPropertySource(properties = {
"dubbo.application.name=integration-test",
"dubbo.registry.address=zookeeper://localhost:2181"
})
class DubboIntegrationTest {
@DubboReference
private GreeterService greeterService;
@Test
void testServiceIntegration() {
String result = greeterService.sayHello("Integration Test");
assertNotNull(result);
assertTrue(result.contains("Integration Test"));
}
}Spring Boot application lifecycle integration with Dubbo.
/**
* Dubbo lifecycle management
*/
@Component
public class DubboLifecycleComponentApplicationListener
implements ApplicationListener<ApplicationEvent> {
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ContextRefreshedEvent) {
// Start Dubbo when Spring context is refreshed
onContextRefreshedEvent((ContextRefreshedEvent) event);
} else if (event instanceof ContextClosedEvent) {
// Stop Dubbo when Spring context is closed
onContextClosedEvent((ContextClosedEvent) event);
}
}
private void onContextRefreshedEvent(ContextRefreshedEvent event) {
DubboBootstrap bootstrap = DubboBootstrap.getInstance();
if (!bootstrap.isStarted()) {
bootstrap.start();
}
}
private void onContextClosedEvent(ContextClosedEvent event) {
DubboBootstrap bootstrap = DubboBootstrap.getInstance();
if (bootstrap.isStarted()) {
bootstrap.stop();
}
}
}
/**
* Graceful shutdown configuration
*/
@Configuration
public class DubboShutdownConfiguration {
@Bean
public ApplicationListener<ContextClosedEvent> dubboShutdownHook() {
return event -> {
// Graceful shutdown with timeout
DubboBootstrap bootstrap = DubboBootstrap.getInstance();
if (bootstrap.isStarted()) {
bootstrap.await(); // Wait for ongoing requests
bootstrap.stop(); // Stop Dubbo
}
};
}
}Complete Spring Boot Application Example:
@SpringBootApplication
@EnableDubbo(scanBasePackages = "com.example")
public class DubboSpringBootApplication {
public static void main(String[] args) {
// Enable graceful shutdown
System.setProperty("dubbo.shutdown.hook", "true");
SpringApplication app = new SpringApplication(DubboSpringBootApplication.class);
app.setRegisterShutdownHook(true);
app.run(args);
}
// Optional: Custom configuration
@Bean
@Primary
public ApplicationConfig applicationConfig() {
ApplicationConfig config = new ApplicationConfig();
config.setName("spring-boot-dubbo-app");
config.setVersion("1.0.0");
config.setQosEnable(true);
return config;
}
}
// Service provider
@DubboService
@Component
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
}
// Service consumer
@RestController
public class UserController {
@DubboReference
private UserService userService;
@GetMapping("/api/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = userService.getUserById(id);
return user != null ? ResponseEntity.ok(user) : ResponseEntity.notFound().build();
}
}Install with Tessl CLI
npx tessl i tessl/maven-org-apache-dubbo--dubbo