Dubbo可以通過Spring xml中配置宰掉、Spring Annotation以及Api的方式來啟動懈糯。服務(wù)提供方最終啟動的核心邏輯為ServiceConfig.export(),調(diào)用方的核心邏輯為ReferenceConfig.get(),本文主要分析不同的方式啟動到核心邏輯之心的過程个从,至于啟動到后續(xù)細節(jié)將在后續(xù)文章中發(fā)布格二。
1.Api啟動方式
通過Api啟動是Dubbo最不常用的啟動方式瑰剃,因為暴露了一些實現(xiàn)細節(jié)齿诉,但是確是最直接的啟動方式,是理解Spring的兩種方式啟動的基礎(chǔ)晌姚,所以在這里先進行介紹粤剧。
1.基礎(chǔ)配置類
Dubbo使用大量配置類來保存服務(wù)的配置信息,最關(guān)鍵(也是必須進行配置)的幾個配置類如下:
ServiceConfig:服務(wù)提供方的服務(wù)配置挥唠,包含了應(yīng)用配置ApplicationConfig抵恋、使用協(xié)議配置ProtocolConfig、注冊中心配置RegistryConfig等多種配置宝磨,服務(wù)通過ServiceConfig.export進行暴露弧关。
ReferenceConfig:服務(wù)調(diào)用方的調(diào)用配置,包含了應(yīng)用配置ApplicationConfig唤锉、注冊中心配置RegistryConfig等多種配置世囊,ReferenceConfig不用配置ProtocolConfig,服務(wù)發(fā)布者的信息是從注冊中心獲取的窿祥。
ApplicationConfig:應(yīng)用配置類茸习,配置應(yīng)用的基本信息如應(yīng)用名,版本號壁肋,組織名等
RegistryConfig:注冊中心号胚,配置連接的注冊中心信息,地址浸遗,
dubbo常用的注冊中心有Zookeeper,Redis,Multicast等
ProtocolConfig:服務(wù)協(xié)議配置猫胁,配置服務(wù)接口使用的協(xié)議,如dubbo跛锌、http等弃秆,服務(wù)暴露的端口等届惋。
2.服務(wù)發(fā)布端啟動流程
主要是配置好ServiceConfig,RegistryConfig菠赚,ApplicationConfig脑豹,ProtocolConfig的基本信息,然后通過ServiceConfig.export()進行發(fā)布衡查,代碼如下:
ServiceConfig<TestService> serviceConfig = new ServiceConfig<TestService>();
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);
//服務(wù)端接口實現(xiàn)邏輯
serviceConfig.setRef(new TestServiceImpl());
3.服務(wù)引用方啟動流程
主要是配置好ReferenceConfig瘩欺,RegistryConfig,ApplicationConfig的信息拌牲,調(diào)用ReferenceConfig.get()獲取代理對象進行遠程調(diào)用俱饿,代碼如下:
ReferenceConfig<TestService> referenceConfig = new ReferenceConfig<TestService>();
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注冊中心來進行服務(wù)注冊和發(fā)現(xiàn)的,服務(wù)提供方和調(diào)用方解耦塌忽,并且能夠動態(tài)上下線和負載均衡拍埠,是比較好的實現(xiàn)方式,如果不想引人注冊中心土居,還可以在調(diào)用方寫死發(fā)布方URL進行直連枣购。
ReferenceConfig<TestService> referenceConfig = new ReferenceConfig<TestService>();
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);
//設(shè)置直連的地址,協(xié)議擦耀,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啟動時調(diào)用ServiceConfig.export()和ReferenceConfig.get()來發(fā)布和引用服務(wù):
配置如下:
發(fā)布端:
<dubbo:application name="provider"/>
<dubbo:registry address="zookeeper://ip:2181" timeout="3000"/>
<dubbo:protocol name="dubbo" port="20880" host="127.0.0.1"/>
<dubbo:service interface="com.provider.service.TestService" class="com.provider.service.TestServiceImpl"/>
調(diào)用端:
<dubbo:application name="consumer"/>
<dubbo:registry address="zookeeper://ip:2181" timeout="3000"/>
<dubbo:reference interface="com.provider.service.TestService" id="dbRef"/>
ServiceConfig, ReferenceConfig在spring中通過子類ServiceBean和ReferenceBean來實現(xiàn),這樣能夠通過實現(xiàn)Spring bean的生命周期函數(shù)來進行相應(yīng)處理垮抗。
3.Spring 注解配置啟動
和xml配置類似氏捞,通過注解的方式向spring注入ApplicationConfig,RegistryConfig冒版,ProtocolConfig液茎,ServiceConfig,ReferenceConfig等bean辞嗡,在spring配置類上注解@EnableDubbo來啟用dubbo捆等,@DubboComponentScan來配置db組件目錄,@Service注解被發(fā)布的接口實現(xiàn),@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");
}
}
調(diào)用方:
@Component
public class AnoConsumer {
@Reference
TestService mTestService;
public void test()
{
mTestService.test();
}
}