最近有这么个需求:做自动化的接口测试的时候需要动态更改zookper的配置
以前用过Dubbo 但没有使用过Dubbo的API,于是查看了dubbo的官方教程 地址(http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85)
下边是官方给的例子
(1) 服务提供者:
importcom.alibaba.dubbo.rpc.config.ApplicationConfig;
importcom.alibaba.dubbo.rpc.config.RegistryConfig;
importcom.alibaba.dubbo.rpc.config.ProviderConfig;
importcom.alibaba.dubbo.rpc.config.ServiceConfig;
importcom.xxx.XxxService;
importcom.xxx.XxxServiceImpl;
// 服务实现
XxxService xxxService =newXxxServiceImpl();
// 当前应用配置
ApplicationConfig application =newApplicationConfig();
application.setName("xxx");
// 连接注册中心配置
RegistryConfig registry =newRegistryConfig();
registry.setAddress("10.20.130.230:9090");
registry.setUsername("aaa");
registry.setPassword("bbb");
// 服务提供者协议配置
ProtocolConfig protocol =newProtocolConfig();
protocol.setName("dubbo");
protocol.setPort(12345);
protocol.setThreads(200);
// 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
// 服务提供者暴露服务配置
ServiceConfig service =newServiceConfig();// 此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏
service.setApplication(application);
service.setRegistry(registry);// 多个注册中心可以用setRegistries()
service.setProtocol(protocol);// 多个协议可以用setProtocols()
service.setInterface(XxxService.class);
service.setRef(xxxService);
service.setVersion("1.0.0");
// 暴露及注册服务
service.export();
(2) 服务消费者:
importcom.alibaba.dubbo.rpc.config.ApplicationConfig;
importcom.alibaba.dubbo.rpc.config.RegistryConfig;
importcom.alibaba.dubbo.rpc.config.ConsumerConfig;
importcom.alibaba.dubbo.rpc.config.ReferenceConfig;
importcom.xxx.XxxService;
// 当前应用配置
ApplicationConfig application =newApplicationConfig();
application.setName("yyy");
// 连接注册中心配置
RegistryConfig registry =newRegistryConfig();
registry.setAddress("10.20.130.230:9090");
registry.setUsername("aaa");
registry.setPassword("bbb");
// 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接
// 引用远程服务
ReferenceConfig reference =newReferenceConfig();// 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
reference.setApplication(application);
reference.setRegistry(registry);// 多个注册中心可以用setRegistries()
reference.setInterface(XxxService.class);
reference.setVersion("1.0.0");
// 和本地bean一样使用xxxService
XxxService xxxService = reference.get();// 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用
官方给的这个例子本以为可以直接套用 可现实就是这么残酷,用不了,于是开启了自己的探索之路
public static voidmain(String[] args)throwsException {
ClassPathXmlApplicationContext context =newClassPathXmlApplicationContext(newString[] {"applicationContext.xml"});
context.start();
// 当前应用配置
ApplicationConfig application =newApplicationConfig();
application.setName("hehe_consumer");
// 连接注册中心配置
RegistryConfig registry =newRegistryConfig();
//这里一定要有 zookeeper://
registry.setAddress("zookeeper://192.168.0.79:2181");
// 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接
// 引用远程服务
ReferenceConfig reference =newReferenceConfig();// 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
reference.setApplication(application);
reference.setRegistry(registry);// 多个注册中心可以用setRegistries()
reference.setInterface(UserService.class);
reference.setVersion("1.0");
reference.setGroup("usercenter_soa_pro");
// 和本地bean一样使用xxxService
UserService userService =reference.get();// 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用
UserDto userById = userService.getUserById(1);
System.out.println(newGson().toJson(userById));
System.in.read();
}
}