- 哪幾種配置方式
- 配置覆蓋策略: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 覆蓋策略
- JVM 啓動 -D 參數優先,這樣可以使用戶在部署和啓動時進行參數重寫,比如在啓動時需改變協議的端口。
- XML 次之(等價於spring boot中的application.properties),如果在 XML 中有配置,則 dubbo.properties 中的相應配置項無效。
- 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 {
// ...
}