第二章 Dubbo配置

  • 哪幾種配置方式
  • 配置覆蓋策略:XML內部的配置覆蓋策略;-D(JVM啓動參數)/XML(application.properties)/dubbo.properties之間的覆蓋策略
  • 有哪些配置,都是幹啥用的?下面一章講講,其實就包含了dubbo提供給使用者的一些功能。
  • XML配置
  • 屬性配置: *.properties文件
  • API配置:可應用於泛化調用
  • 註解配置

2.1 XML配置

2.1.1 配置功能

在這裏插入圖片描述
在這裏插入圖片描述

2.1.2 配置覆蓋關係

以 timeout 爲例,顯示了配置的查找順序,其它 retries, loadbalance, actives 等類似:

  • 方法級優先,接口級次之,全局配置再次之。
  • 如果級別一樣,則消費方優先,提供方次之。

其中,服務提供方配置,通過 URL 經由註冊中心傳遞給消費方。
在這裏插入圖片描述
建議由服務提供方設置超時,因爲一個方法需要執行多長時間,服務提供方更清楚,如果一個消費方同時引用多個服務,就不需要關心每個服務的超時設置。
理論上 ReferenceConfig 的非服務標識配置,在 ConsumerConfig,ServiceConfig, ProviderConfig 均可以缺省配置。


2.2 屬性配置

如果公共配置很簡單,沒有多註冊中心,多協議等情況,或者想多個 Spring 容器共享配置,可以使用 dubbo.properties 作爲缺省配置。
Dubbo 將自動加載 classpath 根目錄下的 dubbo.properties,可以通過JVM啓動參數
-Ddubbo.properties.file=xxx.properties 改變缺省配置位置。
注意:如果 classpath 根目錄下存在多個 dubbo.properties,比如多個 jar 包中有 dubbo.properties,Dubbo 會任意加載,並打印 Error 日誌,後續可能改爲拋異常。

2.2.1 映射規則

將 XML 配置的標籤名,加屬性名,用點分隔,多個屬性拆成多行:

  • 比如:dubbo.application.name=foo等價於<dubbo:application name=“foo” />
  • 比如:dubbo.registry.address=10.20.153.10:9090等價於<dubbo:registry address=“10.20.153.10:9090” />
    如果 XML 有多行同名標籤配置,可用 id 號區分,如果沒有 id 號將對所有同名標籤生效:
  • 比如:dubbo.protocol.rmi.port=1099等價於<dubbo:protocol id=“rmi” name=“rmi” port=“1099” />
  • 比如:dubbo.registry.china.address=10.20.153.10:9090等價於<dubbo:registry id=“china” address=“10.20.153.10:9090” />
  • 協議的 id 沒配時,缺省使用協議名作爲 id
    下面是 dubbo.properties 的一個典型配置:
dubbo.application.name=foo
dubbo.application.owner=bar
dubbo.registry.address=10.20.153.10:9090

2.2.2 覆蓋策略

在這裏插入圖片描述

  1. JVM 啓動 -D 參數優先,這樣可以使用戶在部署和啓動時進行參數重寫,比如在啓動時需改變協議的端口。
  2. XML 次之(等價於spring boot中的application.properties),如果在 XML 中有配置,則 dubbo.properties 中的相應配置項無效。
  3. Properties 最後,相當於缺省值,只有 XML 沒有配置時,dubbo.properties 的相應配置項纔會生效,通常用於共享公共配置,比如應用名。

2.3 API配置

API 屬性與配置項一對一,比如:ApplicationConfig.setName("xxx") 對應 <dubbo:application name="xxx" />

2.3.1 服務提供者

import org.apache.dubbo.rpc.config.ApplicationConfig;
import org.apache.dubbo.rpc.config.RegistryConfig;
import org.apache.dubbo.rpc.config.ProviderConfig;
import org.apache.dubbo.rpc.config.ServiceConfig;
import com.xxx.XxxService;
import com.xxx.XxxServiceImpl;
 
// 服務實現
XxxService xxxService = new XxxServiceImpl();
 
// 當前應用配置
ApplicationConfig application = new ApplicationConfig();
application.setName("xxx");
 
// 連接註冊中心配置
RegistryConfig registry = new RegistryConfig();
registry.setAddress("10.20.130.230:9090");
registry.setUsername("aaa");
registry.setPassword("bbb");
 
// 服務提供者協議配置
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName("dubbo");
protocol.setPort(12345);
protocol.setThreads(200);
 
// 注意:ServiceConfig爲重對象,內部封裝了與註冊中心的連接,以及開啓服務端口
 
// 服務提供者暴露服務配置
ServiceConfig<XxxService> service = new ServiceConfig<XxxService>(); // 此實例很重,封裝了與註冊中心的連接,請自行緩存,否則可能造成內存和連接泄漏
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.3.2 服務消費者

import org.apache.dubbo.rpc.config.ApplicationConfig;
import org.apache.dubbo.rpc.config.RegistryConfig;
import org.apache.dubbo.rpc.config.ConsumerConfig;
import org.apache.dubbo.rpc.config.ReferenceConfig;
import com.xxx.XxxService;
 
// 當前應用配置
ApplicationConfig application = new ApplicationConfig();
application.setName("yyy");
 
// 連接註冊中心配置
RegistryConfig registry = new RegistryConfig();
registry.setAddress("10.20.130.230:9090");
registry.setUsername("aaa");
registry.setPassword("bbb");
 
// 注意:ReferenceConfig爲重對象,內部封裝了與註冊中心的連接,以及與服務提供方的連接
 
// 引用遠程服務
ReferenceConfig<XxxService> reference = new ReferenceConfig<XxxService>(); // 此實例很重,封裝了與註冊中心的連接以及與提供者的連接,請自行緩存,否則可能造成內存和連接泄漏
reference.setApplication(application);
reference.setRegistry(registry); // 多個註冊中心可以用setRegistries()
reference.setInterface(XxxService.class);
reference.setVersion("1.0.0");
 
// 和本地bean一樣使用xxxService
XxxService xxxService = reference.get(); // 注意:此代理對象內部封裝了所有通訊細節,對象較重,請緩存複用

2.3.3 特殊場景

下面只列出不同的地方,其它參見上面的寫法

...
// 方法級配置
List<MethodConfig> methods = new ArrayList<MethodConfig>();
MethodConfig method = new MethodConfig();
method.setName("createXxx");
method.setTimeout(10000);
method.setRetries(0);
methods.add(method);
 
// 引用遠程服務
ReferenceConfig<XxxService> reference = new ReferenceConfig<XxxService>(); // 此實例很重,封裝了與註冊中心的連接以及與提供者的連接,請自行緩存,否則可能造成內存和連接泄漏
...
reference.setMethods(methods); // 設置方法級配置
...
...
ReferenceConfig<XxxService> reference = new ReferenceConfig<XxxService>(); // 此實例很重,封裝了與註冊中心的連接以及與提供者的連接,請自行緩存,否則可能造成內存和連接泄漏
// 如果點對點直連,可以用reference.setUrl()指定目標地址,設置url後將繞過註冊中心,
// 其中,協議對應provider.setProtocol()的值,端口對應provider.setPort()的值,
// 路徑對應service.setPath()的值,如果未設置path,缺省path爲接口名
reference.setUrl("dubbo://10.20.130.230:20880/com.xxx.XxxService"); 
...

2.4 註解配置

2.4.1 服務提供方

Service註解暴露服務

import org.apache.dubbo.config.annotation.Service;
 
@Service(timeout = 5000)
public class AnnotateServiceImpl implements AnnotateService { 
    // ...
}

javaconfig形式配置公共模塊

@Configuration
public class DubboConfiguration {

    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("provider-test");
        return applicationConfig;
    }

    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://127.0.0.1:2181");
        registryConfig.setClient("curator");
        return registryConfig;
    }
}

指定dubbo掃描路徑

@SpringBootApplication
@DubboComponentScan(basePackages = "org.apache.dubbo.test.service.impl")
public class ProviderTestApp {
    // ...
}

2.4.2 服務消費方

Reference註解引用服務

public class AnnotationConsumeService {

    @org.apache.dubbo.config.annotation.Reference
    public AnnotateService annotateService;
    
    // ...
}

javaconfig形式配置公共模塊

@Configuration
public class DubboConfiguration {

    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("consumer-test");
        return applicationConfig;
    }

    @Bean
    public ConsumerConfig consumerConfig() {
        ConsumerConfig consumerConfig = new ConsumerConfig();
        consumerConfig.setTimeout(3000);
        return consumerConfig;
    }

    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://127.0.0.1:2181");
        registryConfig.setClient("curator");
        return registryConfig;
    }
}

指定dubbo掃描路徑

@SpringBootApplication
@DubboComponentScan(basePackages = "org.apache.dubbo.test.service")
public class ConsumerTestApp {
    // ...
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章