Dubbo多注冊中心配置


Dubbo常用的注冊中心有Zookeeper、Nacos、Redis,目前項目中使用Zookeeper作為注冊中心。
service-xxx-dubbo.xml配置如下:

<dubbo:application name="${dubbo.applicationName}" />
<dubbo:registry protocol="${dubbo.registryProtocol}" address="${dubbo.registryAddress}" port="${dubbo.registryPort}" register="${dubbo.register}" />
<dubbo:protocol name="${dubbo.protocolName}" port="${dubbo.protocolPort}" threadpool="${dubbo.protocolThreadpool}" threads="${dubbo.protocolThreads}" />
<dubbo:provider delay="-1" retries="0" />
<dubbo:consumer timeout="${dubbo.consumerTimeout}" retries="${dubbo.consumerRetries}" check="${dubbo.consumerCheck}" />
<dubbo:service ref="xxxService" interface="com.biz.XxxService" />
...

這里用占位符配置,便於區分開發、測試、線上不同的環境,通過springboot的不同環境yml可配置。
指定使用本地開發環境配置:

spring:
  profiles:
    active: local

本地配置如下:

dubbo:
  applicationName: service-xxx
  protocolName: dubbo
  protocolPort: 20001
  protocolThreadpool: fixed
  protocolThreads: 500
  registryProtocol: zookeeper
  registryAddress: 192.168.x.x
  registryPort: 2181
  register: false
  consumerTimeout: 5000
  consumerRetries: 0
  consumerCheck: false

在實際項目中,可能有多個測試環境,有的時候某個服務可能只想部署一個,但希望在多個環境都使用它。
比如某個基礎服務各測試環境通用,或者某個迭代不頻繁的項目為了節約資源只希望部署一個公用。
這時可使用Dubbo支持的多注冊中心配置,例如在xml配置多個<dubbo:registry>
為了開發、線上版本僅使用一個配置中心,即xml里僅配置一個<dubbo:registry>
這里通過Spring的Bean來配置多個中心,並且僅在測試環境生效。

package cn.wine.ms.search.support.dubbo.config;

import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 測試環境dubbo配置,同時注冊到測試環境2,測試環境3的zookeeper
 * 測試環境1的zookeeper在service-xxx-dubbo.xml配置
 *
 * @author cdfive
 */
@ConditionalOnProperty(value = "spring.profiles.active", havingValue = "test")
@Configuration
public class DubboConfig {

    /**
     * 測試環境2的zookeeper配置
     */
    @Bean
    public RegistryConfig registryConfigTest2() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setProtocol("zookeeper");
        registryConfig.setAddress("192.168.0.2");
        registryConfig.setPort(2181);
        return registryConfig;
    }

    /**
     * 測試環境3的zookeeper配置
     */
    @Bean
    public RegistryConfig registryConfigTest3() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setProtocol("zookeeper");
        registryConfig.setAddress("192.168.0.3");
        registryConfig.setPort(2181);
        return registryConfig;
    }
}

這里使用了Dubbo的RegistryConfig類,並配合@ConditionalOnProperty(value = "spring.profiles.active", havingValue = "test")注解,
僅測試環境生效。因為本地開發和線上環境不需要。

這樣配置后,本應用的Dubbo的提供者和消費者都注冊到了多個zookeeper上。
有的時候還可能只想提供方注冊到多個zookeeper上,但消費方僅使用單個環境,即消費單個zookeeper的接口。
這時可以給registry設置id編號,並且給<dubbo:consumer>指定注冊中心的id。
修改service-xxx-dubbo.xml

<dubbo:application name="${dubbo.applicationName}" />
<dubbo:registry id="mainRegistry" protocol="${dubbo.registryProtocol}" address="${dubbo.registryAddress}" port="${dubbo.registryPort}" register="${dubbo.register}" />
<dubbo:protocol name="${dubbo.protocolName}" port="${dubbo.protocolPort}" threadpool="${dubbo.protocolThreadpool}" threads="${dubbo.protocolThreads}" />
<dubbo:provider delay="-1" retries="0" />
<dubbo:consumer timeout="${dubbo.consumerTimeout}" retries="${dubbo.consumerRetries}" check="${dubbo.consumerCheck}" registry="mainRegistry"/>
<dubbo:service ref="xxxService" interface="com.biz.XxxService" />
...

其中,mainRegistry為注冊中心id編號,然后在<dubbo:consumer ... registry="mainRegistry"/>指定消費方使用。
可見,結合xml和注解配置,Dubbo可支持靈活的注冊中心配置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM