前言
網(wǎng)上有很多SpringBoot與dubbo的配置,不過多是靜態(tài)寫死address地址的。如何動態(tài)從配置中心獲取address配置?本篇文章可能會幫到你
靜態(tài)address配置方式
靜態(tài)dubbo的配置方式有很多。比如application.properties的配置方式:
dubbo.registry.id=cms
dubbo.registry.protocol=zookeeper
dubbo.registry.address=192.168.222.107
這種方式也是網(wǎng)上文章最常見的配置方式。
如果address地址是動態(tài)從配置中心獲取呢?
動態(tài)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;
上面代碼是我自己公司項目獲取動態(tài)配置的方式。 你們可以根據(jù)自己的具體情況調(diào)整從配置中心獲取配置的方式。
@CcmsMapper是我公司自己的注解,目的是從配置中心拉取對應(yīng)的配置。
請根據(jù)自己的情況把該類調(diào)整成自己獲取配置中心配置的代碼。 但是要保證有成員變量,注意成員變量的名字,后面會根據(jù)變量名來注冊對應(yīng)id的dubbo-register。(是不是靜態(tài)都無所謂)
2.根據(jù)拉取的配置動態(tài)加載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. 循環(huán)配置類的成員變量,生成對應(yīng)的RegistryConfig,Id為成員變量名。
3. 將生成的RegistryConfig集合注冊。
用bean的方式動態(tài)注冊register
@Configuration
public class DubboConfig {
@Bean(name = "cms")
public RegistryConfig registryConfig() {
RegistryConfig reg = new RegistryConfig(CCmsRegister.cms,"zookeeper");
return reg;
}
}
這種是使用bean的方式注冊,不過缺點很明顯。如果你的應(yīng)用要注冊多個dubbo-register,就要寫多個類似的bean。