CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-org-apache-dubbo--dubbo

Apache Dubbo is a powerful RPC framework for building enterprise-grade microservices with service discovery, load balancing, and fault tolerance.

Pending
Overview
Eval results
Files

spring-boot.mddocs/

Spring Boot Integration

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.

Capabilities

Auto-Configuration

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; }
}

Enable Dubbo Annotation

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 {
}

Service Provider Annotation

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
}

Service Consumer Annotation

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;
    }
}

Configuration Properties

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=false

YAML 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: 9090

Spring Boot Actuator Integration

Integration 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 status

Spring Boot Test Support

Testing 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"));
    }
}

Lifecycle Management

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

docs

clustering.md

configuration.md

extensions.md

index.md

metadata.md

registry.md

rpc-core.md

serialization.md

spring-boot.md

tile.json