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