Dubbo的几种启动方式

Dubbo可以通过Spring xml中配置、Spring Annotation以及Api的方式来启动。服务提供方最终启动的核心逻辑为ServiceConfig.export(),调用方的核心逻辑为ReferenceConfig.get(),本文主要分析不同的方式启动到核心逻辑之心的过程,至于启动到后续细节将在后续文章中发布。

1.Api启动方式

通过Api启动是Dubbo最不常用的启动方式,因为暴露了一些实现细节,但是确是最直接的启动方式,是理解Spring的两种方式启动的基础,所以在这里先进行介绍。

1.基础配置类

Dubbo使用大量配置类来保存服务的配置信息,最关键(也是必须进行配置)的几个配置类如下:
ServiceConfig:服务提供方的服务配置,包含了应用配置ApplicationConfig、使用协议配置ProtocolConfig、注册中心配置RegistryConfig等多种配置,服务通过ServiceConfig.export进行暴露。
ReferenceConfig:服务调用方的调用配置,包含了应用配置ApplicationConfig、注册中心配置RegistryConfig等多种配置,ReferenceConfig不用配置ProtocolConfig,服务发布者的信息是从注册中心获取的。
ApplicationConfig:应用配置类,配置应用的基本信息如应用名,版本号,组织名等
RegistryConfig:注册中心,配置连接的注册中心信息,地址,
dubbo常用的注册中心有Zookeeper,Redis,Multicast等
ProtocolConfig:服务协议配置,配置服务接口使用的协议,如dubbo、http等,服务暴露的端口等。

2.服务发布端启动流程

主要是配置好ServiceConfig,RegistryConfig,ApplicationConfig,ProtocolConfig的基本信息,然后通过ServiceConfig.export()进行发布,代码如下:

ServiceConfig serviceConfig = new ServiceConfig();
        ApplicationConfig application = new ApplicationConfig("api-provider");
        serviceConfig.setApplication(application);
        ProtocolConfig protocol = new ProtocolConfig();
        protocol.setName("dubbo");
        protocol.setPort(20880);
        serviceConfig.setProtocol(protocol);
        RegistryConfig registry = new RegistryConfig();
        registry.setAddress("zookeeper://ip:2181");
        registry.setTimeout(3000);
        serviceConfig.setRegistry(registry);
serviceConfig.setInterface(TestService.class);
                //服务端接口实现逻辑
        serviceConfig.setRef(new TestServiceImpl());

3.服务引用方启动流程

主要是配置好ReferenceConfig,RegistryConfig,ApplicationConfig的信息,调用ReferenceConfig.get()获取代理对象进行远程调用,代码如下:

ReferenceConfig referenceConfig = new ReferenceConfig();
        ApplicationConfig application = new ApplicationConfig("consumer-api");
        referenceConfig.setApplication(application);
        RegistryConfig registry = new RegistryConfig();
        registry.setAddress("zookeeper://ip:2181");
        registry.setTimeout(3000);
        referenceConfig.setRegistry(registry);
        referenceConfig.setInterface(TestService.class);
        TestService test = referenceConfig.get()

4.接口直连

以上代码是通过zookeeper注册中心来进行服务注册和发现的,服务提供方和调用方解耦,并且能够动态上下线和负载均衡,是比较好的实现方式,如果不想引人注册中心,还可以在调用方写死发布方URL进行直连。

ReferenceConfig referenceConfig = new ReferenceConfig();
ApplicationConfig application = new ApplicationConfig("consumer-api");
referenceConfig.setApplication(application);
RegistryConfig registry = new RegistryConfig();
//禁用注册中心
registry.setAddress(RegistryConfig.NO_AVAILABLE);
registry.setTimeout(3000);
referenceConfig.setRegistry(registry);
referenceConfig.setInterface(TestService.class);
//设置直连的地址,协议,ip和端口,组装成url格式
referenceConfig.setUrl("dubbo://localhost:20880");
TestService test = referenceConfig.get()

2.Spring xml配置启动

了解了Api启动方式,对Spring启动dubbo的理解就比较容易了,主要是配置ApplicationConfig,RegistryConfig,ProtocolConfig,ServiceConfig,ReferenceConfig成为spring的bean,然后在spring启动时调用ServiceConfig.export()和ReferenceConfig.get()来发布和引用服务:
配置如下:
发布端:





调用端:




ServiceConfig, ReferenceConfig在spring中通过子类ServiceBean和ReferenceBean来实现,这样能够通过实现Spring bean的生命周期函数来进行相应处理。

3.Spring 注解配置启动

和xml配置类似,通过注解的方式向spring注入ApplicationConfig,RegistryConfig,ProtocolConfig,ServiceConfig,ReferenceConfig等bean,在spring配置类上注解@EnableDubbo来启用dubbo,@DubboComponentScan来配置db组件目录,@Service注解被发布的接口实现,@Reference来饮用远程接口。
提供方:

@Configuration
@EnableDubbo
@DubboComponentScan("com.test")
public class SpringCfg {
    public static void main(String[] args)
    {
        ApplicationContext ac = new AnnotationConfigApplicationContext(SpringCfg.class);
        LockSupport.park();
    }
    
    @Bean("dubbo-provider")
    public ApplicationConfig apc()
    {
        ApplicationConfig apc = new ApplicationConfig();
        apc.setName("dubbo-provider");
        return apc;
    }
    
    @Bean("dubbo")
    public ProtocolConfig pc()
    {
        ProtocolConfig apc = new ProtocolConfig();
        apc.setName("dubbo");
        apc.setPort(20880);
        return apc;
    }
    
    @Bean
    public RegistryConfig rc()
    {
        RegistryConfig rc = new RegistryConfig();
        rc.setAddress("zookeeper://ip:2181");
        return rc;
    }
}
@Service
public class DubboService implements TestService{
    @Override
    public void test() {
        System.err.println("test");
    }

}

调用方:

@Component
public class AnoConsumer {
    @Reference
    TestService mTestService;
    
    public void test()
    {
        mTestService.test();
    }
}

你可能感兴趣的:(Dubbo的几种启动方式)