ReferenceBean.afterPropertiesSet
ReferenceConfig.init
ReferenceConfig.createProxy
invoker = Protocol.refer(interfaceClass, urls.get(0))
getClients(url)
initClient(url)
Exchangers.connect(url ,requestHandler)
Transporters.connect()
NettyTransporter.connect()
NettyClient.doConnect()
(T) proxyFactory.getProxy(invoker)
Invoker
維護(hù)和遠(yuǎn)程服務(wù)建立的鏈接。充當(dāng)client執(zhí)行具體的遠(yuǎn)程調(diào)用。每個新的invoker只需要覆寫 doInvoke 即可
protected abstract Result doInvoke(Invocation invocation);
Protocol
export函數(shù):暴露服務(wù)。DubboProtocol的openServer/bind/open
refer函數(shù):獲取invoker(connect,建立鏈接等)
// 服務(wù)實(shí)現(xiàn)
XxxService xxxService = new XxxServiceImpl();
// 當(dāng)前應(yīng)用配置
ApplicationConfig application = new ApplicationConfig();
application.setName("xxx");
// 連接注冊中心配置
RegistryConfig registry = new RegistryConfig();
registry.setAddress("10.20.130.230:9090");
registry.setUsername("aaa");
registry.setPassword("bbb");
// 服務(wù)提供者協(xié)議配置
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName("dubbo");
protocol.setPort(12345);
protocol.setThreads(200);
// 注意:ServiceConfig為重對象,內(nèi)部封裝了與注冊中心的連接,以及開啟服務(wù)端口
// 服務(wù)提供者暴露服務(wù)配置
ServiceConfig<XxxService> service = new ServiceConfig<XxxService>(); // 此實(shí)例很重,封裝了與注冊中心的連接,請自行緩存,否則可能造成內(nèi)存和連接泄漏
service.setApplication(application);
service.setRegistry(registry); // 多個注冊中心可以用setRegistries()
service.setProtocol(protocol); // 多個協(xié)議可以用setProtocols()
service.setInterface(XxxService.class);
service.setRef(xxxService);
service.setVersion("1.0.0");
// 暴露及注冊服務(wù)
service.export();
ref
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85
// 當(dāng)前應(yīng)用配置
ApplicationConfig application = new ApplicationConfig();
application.setName("yyy");
// 連接注冊中心配置
RegistryConfig registry = new RegistryConfig();
registry.setAddress("10.20.130.230:9090");
registry.setUsername("aaa");
registry.setPassword("bbb");
// 注意:ReferenceConfig為重對象,內(nèi)部封裝了與注冊中心的連接,以及與服務(wù)提供方的連接
// 引用遠(yuǎn)程服務(wù)
ReferenceConfig<XxxService> reference = new ReferenceConfig<XxxService>(); // 此實(shí)例很重,封裝了與注冊中心的連接以及與提供者的連接,請自行緩存,否則可能造成內(nèi)存和連接泄漏
reference.setApplication(application);
reference.setRegistry(registry); // 多個注冊中心可以用setRegistries()
reference.setInterface(XxxService.class);
reference.setVersion("1.0.0");
// 和本地bean一樣使用xxxService
XxxService xxxService = reference.get(); // 注意:此代理對象內(nèi)部封裝了所有通訊細(xì)節(jié),對象較重,請緩存復(fù)用