前言
网上有很多SpringBoot与dubbo的配置,不过多是静态写死address地址的。如何动态从配置中心获取address配置?本篇文章可能会帮到你
静态address配置方式
静态dubbo的配置方式有很多。比如application.properties的配置方式:
dubbo.registry.id=cms
dubbo.registry.protocol=zookeeper
dubbo.registry.address=192.168.222.107
这种方式也是网上文章最常见的配置方式。
如果address地址是动态从配置中心获取呢?
动态address配置方式
1. 从配置中心拉去配置
@Configuration
@Slf4j
public class CCmsRegister {
public CCmsRegister(){
log.info("-----------ccmsRegister");
CcmsIndependent.add(this);
}
@CcmsMapper(group="dubbo-conf",name="cms.zk")
public static String cms;
上面代码是我自己公司项目获取动态配置的方式。 你们可以根据自己的具体情况调整从配置中心获取配置的方式。
@CcmsMapper
是我公司自己的注解,目的是从配置中心拉取对应的配置。
请根据自己的情况把该类调整成自己获取配置中心配置的代码。 但是要保证有成员变量,注意成员变量的名字,后面会根据变量名来注册对应id的dubbo-register。(是不是静态都无所谓
)
2.根据拉取的配置动态加载dubbo-register
@Configuration
public class DubboConfig {
@Autowired
private CCmsRegister cCmsRegister;
public DubboConfig(){
registryConfig();
}
public void registryConfig() {
Field[] fields = CCmsRegister.class.getFields();
List<RegistryConfig> list = new ArrayList<>();
try {
for(Field field: fields){
RegistryConfig registryConfig = new RegistryConfig((String)field.get(cCmsRegister),"zookeeper");
registryConfig.setId(field.getName());
list.add(registryConfig);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
ConfigManager.getInstance().addRegistries(list);
}
}
上面代码的目的是:
1. 反射出配置类的成员变量信息
2. 循环配置类的成员变量,生成对应的RegistryConfig
,Id为成员变量名。
3. 将生成的RegistryConfig
集合注册。
用bean的方式动态注册register
@Configuration
public class DubboConfig {
@Bean(name = "cms")
public RegistryConfig registryConfig() {
RegistryConfig reg = new RegistryConfig(CCmsRegister.cms,"zookeeper");
return reg;
}
}
这种是使用bean的方式注册,不过缺点很明显。如果你的应用要注册多个dubbo-register,就要写多个类似的bean。