用javaConfig的方式配置dubbo多注册中心
应用背景
由于项目采用分布式集群部署架构,现有需求场景如下:
1.在某一模块项目下用dubbo调用其他 zookeeper 注册中心内已注册好的服务,因此在项目启动时应配置两个甚至多个注册中心来进行服务调用。
2.项目在开发环境中开发人员可以自定义指定服务从哪个注册中心中调用服务。
创建DubboConfig
// 提供方应用信息,用于计算依赖关系,name必须唯一
@Bean
public ApplicationConfig application() {
ApplicationConfig applicationConfig = new ApplicationConfig();
// telnet 命令
applicationConfig.setQosPort(PropertiesUtil.getInt("protocol.port", 22222) + 10);
applicationConfig.setName(PropertiesUtil.getString("registry.name"));
applicationConfig.setLogger("slf4j");
return applicationConfig;
}
//配置第一个注册中心
@Bean
public RegistryConfig registry() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress(PropertiesUtil.getString("address"));
registryConfig.setProtocol(PropertiesUtil.getString("registry"));
registryConfig.setFile(PropertiesUtil.getString("cache.dir") + "/dubbo-"
+ PropertiesUtil.getString("registry.name") + ".cache");
return registryConfig;
}
//配置第二个注册中心
@Bean
public RegistryConfig newregistry() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress(PropertiesUtil.getString("address2"));
registryConfig.setProtocol(PropertiesUtil.getString("registry"));
registryConfig.setFile(PropertiesUtil.getString("cache.dir") + "/dubbo-"
+ PropertiesUtil.getString("registry.name") + ".cache");
//设置非默认注册中心
registryConfig.setDefault(false);
return registryConfig;
}
ConsumerConfig(服务消费方配置)
@Configuration
static class ConsumerConfig extends DubboConfig {
@Bean
public ConsumerConfig consumer() {
ConsumerConfig consumerConfig = new ConsumerConfig();
//设置负载均衡策略
consumerConfig.setLoadbalance("leastactive");
List<RegistryConfig> registryConfigs = new ArrayList<>(2);
//第一个(默认)
registryConfigs.add(registry());
//第二个
registryConfigs.add(newregistry());
//添加多个配置中心
consumerConfig.setRegistries(registryConfigs);
consumerConfig.setTimeout(PropertiesUtil.getInt("request.timeout", 20000));
consumerConfig.setRetries(PropertiesUtil.getInt("consumer.retries", 0));
consumerConfig.setCheck(false);
return consumerConfig;
}
}
Service接口配置
//方式一(注解方式)
//如果不在DubboConfig类中的@Bean加载配置中心时定义beanName,则默认使用该方法名称,否则使用指定的beanName进行注册,即registry值
@Reference(registry="newregistry")
private StudentService studentService;
//方式二(xml配置文件方式)
<dubbo:reference id="studentService" interface="org.liu.service.StudentService " registry="newregistry"
check="false" />
//service接口
@Autowired
private StudentService studentService;
//方式三(@Reference方式)
//使用该方式可以省略DubboConfig、ConsumerConfig两个文件的配置,直接调用远程服务注入远程服务对象,前提是需要知道被调用服务的详细地址和端口号
@Reference(url = "dubbo://192.168.49.121:18081")
private StudentService studentService;
完成以上配置后就可以从一个项目中同时调用两个 zookeeper服务注册中心中的服务实现远程方法调用,也可以进行自定义registry值来选择调用调用哪个配置中心里的服务。
参考资料
http://dubbo.apache.org/en-us/