使用Dubbo,基本都是在Spring的基礎(chǔ)上剔蹋。但其實(shí)Dubbo本身是不依賴Spring的,通過API的方式來看Dubbo寞宫,可以更直接。
Provider端
// 服務(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();
從上面的代碼可以看出ServiceConfig是RPC服務(wù)的承載,內(nèi)部包含了:
ApplicationConfig: 應(yīng)用相關(guān)的配置信息厕氨,用于admin或者monitor端能夠區(qū)分看到不同應(yīng)用的情況进每。
RegistryConfig: 注冊中心,這個service在export的時候命斧,會在這個注冊中心進(jìn)行服務(wù)注冊田晚。
ProtocolConfig:協(xié)議配置,本地service的調(diào)用參數(shù)和結(jié)果最終都會通過socket來進(jìn)行傳輸国葬,協(xié)議就是把傳輸層做了抽象封裝贤徒。
其他service相關(guān)的配置:接口、引用胃惜、版本號等泞莉。
Consumer端
// 當(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ù)用
與provider端類似糠惫,consumer端的protocol跟provider端保持一致的疫剃,因此這里不用在consumer端指定。