dubbo 提供了4种服务配置的方式,它们分别是:XML 配置、属性配置、注解配置、API 配置(官方不推荐 API 配置的方式)。本文只介绍前三种,API 配置方式可点此前往官方文档查看API配置

1. XML 配置

配置参考手册:

标签 描述
<dubbo:service> 服务提供者暴露服务配置,用于定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。
<dubbo:protocol> 服务提供者协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。
<dubbo:reference> 服务消费者引用服务配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心。
<dubbo:registry> 注册中心配置,用于配置连接注册中心相关信息。
<dubbo:application> 应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者。
<dubbo:module> 模块配置,用于配置当前模块信息,可选。
<dubbo:monitor> 监控中心配置,用于配置连接监控中心相关信息,可选。
<dubbo:provider> 服务提供者缺省值配置,当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选。
<dubbo:consumer> 服务消费者缺省值配置,当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选。
<dubbo:method> 方法配置,用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息。
<dubbo:argument> 方法参数配置。

注:标签属性只有group,interface,version是服务的匹配条件,三者用于共同决定是否是同一个服务,其它属性配置项均为调优和治理参数。

1.1 dubbo:service

必填属性参考列表(更多可选参数可点此前往官方文档查看):

属性名称 类型 描述
interface class 服务接口名
ref object 服务对象实现引用
1
2
3
<dubbo:service interface="org.fanlychie.service.UserService" ref="userService"/>
<bean id="userService" class="org.fanlychie.service.UserServiceImpl"/>

1.2 dubbo:protocol

必填属性参考列表(更多可选参数可点此前往官方文档查看):

属性名称 类型 描述
name string 协议名称
1
<dubbo:protocol name="dubbo" port="20880"/>

dubbo 支持的协议有:dubbormihessianhttpwebservicethriftredismemcached。各个协议的介绍和使用场景可点此前往官方文档查看协议参考手册

1.3 dubbo:reference

必填属性参考列表(更多可选参数可点此前往官方文档查看):

属性名称 类型 描述
id string 服务引用的 Bean ID
interface class 服务接口名
1
<dubbo:reference id="userService" interface="org.fanlychie.service.UserService" />

1.4 dubbo:registry

必填属性参考列表(更多可选参数可点此前往官方文档查看):

属性名称 类型 描述
address string 注册中心服务器地址,如果地址没有端口缺省为 9090,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port,不同集群的注册中心,请配置多个<dubbo:registry> 标签
1
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>

dubbo 提供支持的服务注册中心有:multicastzookeeperredissimple。官方推荐你使用zookeeper注册中心,详细信息可点此前往官方文档查看注册中心参考手册

1.5 dubbo:application

必填属性参考列表(更多可选参数可点此前往官方文档查看):

属性名称 类型 描述
name string 当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样,此参数不是匹配条件,你当前项目叫什么名字就填什么,和提供者消费者角色无关
1
<dubbo:application name="user-module-provider"/>

2. 属性配置

如果公共配置很简单,没有多注册中心,多协议等情况,或者想多个 Spring 容器想共享配置,可以使用 dubbo.properties 作为缺省配置。dubbo 将自动加载类路径下的 dubbo.properties,可以通过 JVM 启动参数:-Ddubbo.properties.file=xxx.properties改变缺省配置位置。如果类路径下存在多个 dubbo.properties,比如多个 jar 包中有 dubbo.properties,dubbo 会任意加载,并打印 Error 日志,后续可能改为抛异常。

2.1 映射规则

  • 将 XML 配置的标签名,加属性名,用点分隔,多个属性拆成多行:
    • 比如 dubbo.application.name=foo 等价于:
      <dubbo:application name="foo"/>
  • 如果 XML 有多行同名标签配置,可用 id 号区分,如果没有 id 号将对所有同名标签生效:
    • 比如 dubbo.protocol.rmi.port=1234 等价于:
      <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"/>
1
2
3
dubbo.application.name=foo
dubbo.application.owner=bar
dubbo.registry.address=10.20.153.10:9090

2.2 覆盖策略

JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。
XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。
Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。

3. 注解配置

dubbo 2.2.1 以上的版本支持注解配置。

3.1 服务提供者

服务提供者使用com.alibaba.dubbo.config.annotation.@Service注解暴露服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package org.fanlychie.service;
import com.alibaba.dubbo.config.annotation.Service;
@Service
public class UserServiceImpl implements UserService {
@Override
public void register(String username, String password) {
System.out.println("---------------------------------------------------------");
System.out.println(String.format("接收到注册用户请求 - {username:%s, password:%s}",
username, password));
System.out.println("---------------------------------------------------------");
}
}

服务提供者使用<dubbo:annotation>配置扫描的包路径,多个包用逗号分隔:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="user-module-provider"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:annotation package="org.fanlychie.service"/>
</beans>

3.2 服务消费者

服务消费者使用com.alibaba.dubbo.config.annotation.@Reference注解引用接口服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import com.alibaba.dubbo.config.annotation.Reference;
import org.fanlychie.service.UserService;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Reference
private UserService userService;
@GetMapping("/user/register")
public String register(String username, String password) {
if (!StringUtils.hasText(username) || !StringUtils.hasText(password)) {
return "用户名或密码不能为空";
}
userService.register(username, password);
return "注册完成";
}
}

服务消费者<dubbo:annotation>配置扫描的包路径,多个包用逗号分隔:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="user-module-consumer"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:annotation package="org.fanlychie.controller"/>
</beans>

参考文档文献链接:dubbo用户指南