快速开始
使用Dubbo的最常用方法是在Spring框架中运行它。以下内容将指导您使用Spring框架的XML配置开发Dubbo应用程序。
如果您不想依赖Spring,可以尝试使用API配置。
首先让我们创建一个名为dubbo-demo的根目录:
mkdir dubbo-demo
cd dubbo-demo
接下来,我们将在根目录下创建3个子目录:
- dubbo-demo-api:公共服务api
- dubbo-demo-provider:演示提供商代码
- dubbo-demo-consumer:演示消费者代码
服务提供者
定义服务接口
DemoService.java [1]:
package org.apache.dubbo.demo;
public interface DemoService {
String sayHello(String name);
}
proejct结构应如下所示:
.
├── dubbo-demo-api
│ ├── pom.xml
│ └── src
│ └── main
│ └── java
│ └── org
│ └── apache
│ └── dubbo
│ └── demo
│ └── DemoService.java
在服务提供商中实现接口
DemoServiceImpl.java [2]:
package org.apache.dubbo.demo.provider;
import org.apache.dubbo.demo.DemoService;
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
return "Hello " + name;
}
}
使用Spring配置公开服务
的provider.xml:
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- provider's application name, used for tracing dependency relationship -->
<dubbo:application name="demo-provider"/>
<!-- use multicast registry center to export service -->
<dubbo:registry address="multicast://224.5.6.7:1234"/>
<!-- use dubbo protocol to export service on port 20880 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- service implementation, as same as regular local bean -->
<bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/>
<!-- declare the service interface to be exported -->
<dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"/>
</beans>
该演示使用多播作为注册表,因为它很简单,不需要额外的安装。如果您喜欢像zookeeper这样的注册,请在这里查看示例。
配置日志记录系统
Dubbo默认使用log4j作为日志系统,它还支持slf4j,Apache Commons Logging和JUL日志记录。
以下是示例配置:
log4j.properties
###set log levels###
log4j.rootLogger=info, stdout
###output to the console###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d{dd/MM/yy hh:mm:ss:sss z}] %t %5p %c{2}: %m%n
引导服务提供商
Provider.java
package org.apache.dubbo.demo.provider;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
public static void main(String[] args) throws Exception {
System.setProperty("java.net.preferIPv4Stack", "true");
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-provider.xml"});
context.start();
System.out.println("Provider started.");
System.in.read(); // press any key to exit
}
}
最后,项目结构应如下所示:
├── dubbo-demo-provider
│ ├── pom.xml
│ └── src
│ └── main
│ ├── java
│ │ └── org
│ │ └── apache
│ │ └── dubbo
│ │ └── demo
│ │ └── provider
│ │ ├── DemoServiceImpl.java
│ │ └── Provider.java
│ └── resources
│ ├── META-INF
│ │ └── spring
│ │ └── dubbo-demo-provider.xml
│ └── log4j.properties
服务消费者
完整的安装步骤,请参阅:消费者演示安装
使用Spring配置引用远程服务
consumer.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- consumer's application name, used for tracing dependency relationship (not a matching criterion),
don't set it same as provider -->
<dubbo:application name="demo-consumer"/>
<!-- use multicast registry center to discover service -->
<dubbo:registry address="multicast://224.5.6.7:1234"/>
<!-- generate proxy for the remote service, then demoService can be used in the same way as the
local regular interface -->
<dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.demo.DemoService"/>
</beans>
引导消费者
Consumer.java [3]:
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.apache.dubbo.demo.DemoService;
public class Consumer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"META-INF/spring/dubbo-demo-consumer.xml"});
context.start();
// Obtaining a remote service proxy
DemoService demoService = (DemoService)context.getBean("demoService");
// Executing remote methods
String hello = demoService.sayHello("world");
// Display the call result
System.out.println(hello);
}
}
配置日志记录系统
这与如何在提供者端配置它相同。
最后,项目结构应如下所示:
├── dubbo-demo-consumer
│ ├── pom.xml
│ └── src
│ └── main
│ ├── java
│ │ └── org
│ │ └── apache
│ │ └── dubbo
│ │ └── demo
│ │ └── consumer
│ │ └── Consumer.java
│ └── resources
│ ├── META-INF
│ │ └── spring
│ │ └── dubbo-demo-consumer.xml
│ └── log4j.properties
开始演示
启动服务提供商
运行org.apache.dubbo.demo.provider.Provider
该类以启动提供程序。
启动服务消费者
运行org.apache.dubbo.demo.provider.Consumer
该类以启动使用者,您应该能够看到以下结果:
Hello world
完整的例子
您可以在Github存储库中找到完整的示例代码。
依赖
必要的依赖
JDK 1.6+ [1]
默认依赖项
使用mvn dependency:tree > dep.log
命令进行分析,Dubbo默认依赖于以下第三方库:
[INFO] +- com.alibaba:dubbo:jar:2.5.9-SNAPSHOT:compile
[INFO] | +- org.springframework:spring-context:jar:4.3.10.RELEASE:compile
[INFO] | +- org.javassist:javassist:jar:3.21.0-GA:compile
[INFO] | \- org.jboss.netty:netty:jar:3.2.5.Final:compile
此处的所有依赖项都是针对Dubbo的默认配置选择的,这些配置基于稳定性和性能考虑因素。
- javassist.jar [2]:if
<dubbo:provider proxy="jdk" />
or<dubbo:consumer proxy="jdk" />
,or<dubbo:application compiler="jdk" />
,不是必需的。 - spring-context.jar [3]:如果您正在使用
ServiceConfig
和ReferenceConfig
API调用,则不是必需的。 - netty.jar [4]:if
<dubbo:protocol server="mina"/>
or<dubbo:protocol server="grizzly"/>
,然后改为mina.jar或grizzly.jar。如果<protocol name="rmi"/>
,不是必需的。
视神经依赖性
需要时,需要手动将这些依赖项添加到项目中。
- netty-all 4.0.35.Final
- 米娜:1.1.7
- 灰熊:2.1.4
- httpclient:4.5.3
- hessian_lite:3.2.1-fixed
- fastjson:1.2.31
- zookeeper:3.4.9
- jedis:2.9.0
- xmemcached:1.3.6
- 粗麻布:4.0.38
- 码头:6.1.26
- hibernate-validator:5.4.1.Final
- zkclient:0.2
- 策展人:2.12.0
- cxf:3.0.14
- 节俭:0.8.0
- servlet:3.0 [5]
- validation-api:1.1.0.GA [5:1]
- jcache:1.0.0 [5:2]
- javax.el:3.0.1-b08 [5:3]
- kryo:4.0.1
- kryo-serializers:0.42
- fst:2.48-jdk-6
- resteasy:3.0.19.Final
- tomcat-embed-core:8.0.11
- slf4j:1.7.25
- log4j:1.2.16
到期
功能成熟
特征 | 到期 | 强度 | 问题 | 劝告 | 用户 |
并发控制 | 经测试 | 并发控制 | | 在审判中 | |
连接控制 | 经测试 | 连接数控制 | | 在审判中 | |
直接连接某个提供商 | 经测试 | 用于直接点对点连接的提供商服务,用于测试 | | 可以在测试环境中使用 | 阿里巴巴 |
分组聚合 | 经测试 | 返回分组聚合的线索,菜单聚合服务和其他服务 | 用于特殊场景 | 可以在生产环境中使用 | |
参数验证器 | 经测试 | 参数验证器,JSR303验证框架集成 | 对性能产生影响 | 在审判中 | 来旺 |
结果缓存 | 经测试 | 结果缓存,用于加速请求 | | 在审判中 | |
通用参考 | 稳定 | 通用引用,没有业务接口类的远程调用,用于测试平台,打开api代理服务等 | | 可以在生产环境中使用 | 阿里巴巴 |
通用服务 | 稳定 | 对于模拟paltform,通用服务,实现任何接口都不需要接口类 | | 可以在生产环境中使用 | 阿里巴巴 |
回声测试 | 经测试 | 回声测试 | | 在审判中 | |
附件 | 稳定 | 附件 | | 可以在生产环境中使用 | |
异步调用 | 经测试 | 不可用的异步调用 | | 在审判中 | |
本地电话 | 经测试 | 本地电话 | | 在审判中 | |
回调参数 | 经测试 | 回调参数 | 用于特殊场景 | 在审判中 | 注册处 |
事件通知 | 经测试 | 事件通知,执行远程调用之前和之后的触发 | | 在审判中 | |
本地存根 | 稳定 | 在客户端执行部分逻辑 | | 可以在生产环境中使用 | 阿里巴巴 |
本地模拟 | 稳定 | 伪造的返回结果,可以在发生故障或直接执行时执行,以降低服务质量 | 需要支持注册 | 可以在生产环境中使用 | 阿里巴巴 |
延迟发布 | 稳定 | 延迟发布,用于等待应用程序加载预热数据,或等待弹簧上下文完全加载 | | 可以在生产环境中使用 | 阿里巴巴 |
懒惰连接 | 经测试 | 设置调用时延迟建立连接 | | 在审判中 | 注册处 |
粘性连接 | 经测试 | 粘性连接始终向同一提供者服务发出请求,除非服务已关闭,然后切换到另一个 | | 在审判中 | 注册处 |
令牌授权 | 经测试 | 令牌授权,用于服务授权 | 需要支持注册 | 在审判中 | |
路由规则 | 经测试 | 动态确定呼叫关系 | 需要支持注册 | 在审判中 | |
配置规则 | 经测试 | 动态分配配置,是业务逻辑的切换 | 需要支持注册 | 在审判中 | |
ACCESSLOG | 经测试 | Accesslog,用于记录呼叫信息 | 本地存储,影响性能,受磁盘大小限制 | 在审判中 | |
分布式事务 | 研究 | JTA / XA三阶段提交交易(TCC) | 不稳定 | 不可用 | |
战略成熟度
特征 | 到期 | 强度 | 问题 | 劝告 | 用户 |
Zookeeper注册表 | 稳定 | 支持集群,有各种相关的开源产品,建议使用dubbo-2.3.3及以上版本 | 依赖于动物园管理员的稳定性 | 可以在生产环境中使用 | |
Redis注册表 | 稳定 | 支持基于客户端的高性能双写聚类方法 | 请确保服务器时间同步,用于检查心跳的过期脏数据 | 可以在生产环境中使用 | |
多播注册表 | 经测试 | 分散,无需安装注册表 | 根据网络拓扑和路由,服务器机房存在风险 | 可用于小范围,开发/测试环境中 | |
简单的注册表 | 经测试 | Dogfooding,注册表本身也是标准的RPC服务 | 没有集群支持,可能会发生单点故障 | 在审判中 | |
特征 | 到期 | 强度 | 问题 | 劝告 | 用户 |
简单的监控系统 | 稳定 | 支持JFreeChart统计报告 | 没有集群支持,可能会发生单点故障,但失败不会影响RPC调用 | 可以在生产环境中使用 | |
特征 | 到期 | 强度 | 问题 | 劝告 | 用户 |
达博协议 | 稳定 | 使用NIO重用单个长连接并使用线程池同时处理请求,减少握手并提高并发效率,良好性能 | 单个连接将成为传输大文件的瓶颈 | 可以在生产环境中使用 | 阿里巴巴 |
Rmi协议 | 稳定 | 可与基于TCP协议的本机RMI互操作 | 有时连接失败,需要重建存根 | 可以在生产环境中使用 | 阿里巴巴 |
Hessian协议 | 稳定 | 可与基于HTTP协议的本机Hessian互操作 | 需要Hessian.jar支持,HTTP短连接的开销很大 | 可以在生产环境中使用 | |
特征 | 到期 | 强度 | 问题 | 劝告 | 用户 |
Netty Transporter | 稳定 | JBoss的NIO框架,具有良好的性能 | 请求发送两个事件,需要屏蔽无用事件 | 可以在生产环境中使用 | 阿里巴巴 |
米娜运输车 | 稳定 | 经典的NIO框架,稳定 | 发送消息队列是不及时的,在很大的压力下,会有FullGC | 可以在生产环境中使用 | 阿里巴巴 |
灰熊运输车 | 经测试 | Sun的NIO框架,应用于GlassFish容器中 | 线程池不可扩展,Filter不能拦截下一个过滤器 | 在审判中 | |
特征 | 到期 | 强度 | 问题 | 劝告 | 用户 |
Hessian序列化 | 稳定 | 良好的性能,多语言支持(推荐) | 各种版本的Hessian的兼容性不好,可能与应用程序中使用的Hessian冲突,而Dubbo嵌入了hessian3.2.1的源代码 | 可以在生产环境中使用 | 阿里巴巴 |
Dubbo序列化 | 经测试 | 通过不传输POJO的类信息,在大量POJO传输中性能更好。 | 将字段添加到参数对象时,需要外部文件声明 | 在审判中 | |
Json序列化 | 经测试 | 纯文本,可以跨语言解析,默认使用FastJson | 表现不佳 | 在审判中 | |
Java序列化 | 稳定 | Java原生支持 | 表现不佳 | 可以在生产环境中使用 | |
特征 | 到期 | 强度 | 问题 | 劝告 | 用户 |
Javassist ProxyFactory | 稳定 | 字节代代替反射,性能良好(推荐) | 根据javassist.jar并占用JVM的Perm内存,Perm可能必须更大:java -XX:PermSize = 128m | 可以在生产环境中使用 | 阿里巴巴 |
Jdk ProxyFactory | 稳定 | JDK原生支持 | 表现不佳 | 可以在生产环境中使用 | |
特征 | 到期 | 强度 | 问题 | 劝告 | 用户 |
故障转移群集 | 稳定 | 发生故障时,故障会自动切换,重试其他服务器,通常用于读取操作。(推荐) | 重试将导致更长的延迟 | 可以在生产环境中使用 | 阿里巴巴 |
Failfast群集 | 稳定 | 快速失败,只有一次调用,无法立即报告,通常用于非幂等写入。 | 如果正在重新启动服务器,则可能会发生呼叫失败 | 可以在生产环境中使用 | 阿里巴巴 |
故障安全集群 | 稳定 | 故障安全,异常时,直接忽略,通常用于写入审计日志和其他操作 | 呼叫信息丢失 | 可以在生产环境中使用 | 监控 |
故障回复群集 | 经测试 | 失败自动恢复,后台记录失败请求,定期重传,通常用于消息通知操作 | 不可靠,重启服务器时丢失 | 可以在生产环境中使用 | 注册处 |
分叉集群 | 经测试 | 只要返回一个成功,通常用于高实时读取操作,就会并行调用多个服务器。 | 需要浪费更多的服务资源 | 可以在生产环境中使用 | |
广播集群 | 经测试 | 广播逐个调用所有提供程序,并且错误地报告任何错误,通常用于更新提供程序的本地状态 | 速度很慢,任何错误报告都是错误的。 | 可以在生产环境中使用 | |
特征 | 到期 | 强度 | 问题 | 劝告 | 用户 |
随机负载平衡 | 稳定 | 随机概率,根据权重设置随机概率(推荐) | 横截面碰撞的概率很高。重试时,可能存在不等的瞬时压力。 | 可以在生产环境中使用 | 阿里巴巴 |
RoundRobin LoadBalance | 稳定 | Round Robin,根据公约后的重量设定车轮比率 | 存在缓慢的机器累积请求问题,并且极端情况可能导致雪崩 | 可以在生产环境中使用 | |
LeastActive LoadBalance | 稳定 | 最不活跃的呼叫号码,相同活动号码的随机数,活动号码是呼叫前后的计数差异,使慢速机器接收的请求减少。 | 在容量规划中,不要支撑重量,不要按重量容量对机器定向压力测量施加压力 | 可以在生产环境中使用 | |
ConsistentHash LoadBalance | 稳定 | 一致性哈希,相同的参数总是向同一个提供者请求,当一个提供者挂起,最初发送到提供者的请求时,基于虚拟节点,传播给其他提供者,不会引起剧烈的变化 | 压力分布不均匀 | 可以在生产环境中使用 | |
特征 | 到期 | 强度 | 问题 | 劝告 | 用户 |
条件路由规则 | 稳定 | 基于条件表达式的路由规则,简单易用 | 存在一些复杂的多分支条件,并且难以描述规则 | 可以在生产环境中使用 | 阿里巴巴 |
脚本路由规则 | 经测试 | 基于脚本引擎的路由规则,功能强大 | 没有沙盒正在运行,脚本功能太强大,可能是后门 | 在审判中 | |
特征 | 到期 | 强度 | 问题 | 劝告 | 用户 |
弹簧容器 | 稳定 | 自动加载META-INF / spring目录下的所有Spring配置 | | 可以在生产环境中使用 | 阿里巴巴 |
码头集装箱 | 稳定 | 启动嵌入式Jetty以报告状态 | 访问大量页面时,服务器的线程和内存会受到影响 | 可以在生产环境中使用 | 阿里巴巴 |
Log4j容器 | 稳定 | 自动配置log4j的配置,在多个进程启动时按进程自动对日志文件进行子对象 | 用户无法控制log4j的配置,不灵活 | 可以在生产环境中使用 | 阿里巴巴 |
XML配置
关于XML配置项,请参阅:XML参考。如果您更喜欢直接使用API而不是使用Spring,请参阅API配置。想要了解如何使用配置的示例,请参阅快速入门。
provider.xml演示
<?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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="hello-world-app" />
<dubbo:registry address="multicast://224.5.6.7:1234" />
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoServiceLocal" />
<dubbo:reference id="demoServiceRemote" interface="com.alibaba.dubbo.demo.DemoService" />
</beans>
所有标签都支持自定义参数,因此我们可以满足不同扩展点的特殊配置要求,例如:
<dubbo:protocol name="jms">
<dubbo:parameter key="queue" value="your_queue" />
</dubbo:protocol>
要么:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:protocol name="jms" p:queue="your_queue" />
</beans>
配置标签之间的关系
标签 | 目的 | 介绍 |
| 服务出口 | 用于导出服务,定义服务元数据,使用多个协议导出服务,向多个注册表注册服务 |
| 服务参考 | 用于创建远程代理,订阅多个注册表 |
| 协议配置 | 在供应商方面配置服务协议,消费者方面如下。 |
| 应用程序配置 | 适用于提供者和消费者。 |
| 模块配置 | 可选的。 |
| 注册中心 | 注册表信息:地址,协议等 |
| 监控中心 | 监控信息:地址,地址等。可选。 |
| 提供商的默认配置 | ServiceConfigs的默认配置。可选的。 |
| 消费者的默认配置 | ReferenceConfigs的默认配置。可选的。 |
| 方法级别配置 | ServiceConfig和ReferenceConfig的方法级别配置。 |
| 参数配置 | 用于指定方法参数配置。 |
覆盖和优先事项
以超时为例,这里是优先级,从高到低(重试,负载均衡,活动也应用相同的规则):
- 方法级别,接口级别,默认/全局级别。
- 在同一个因素中,消费者比提供者具有更高的优先级
提供者端的配置通过URL以URL的形式传递给消费者端。
建议提供程序为每个服务设置超时,因为提供程序确切地知道方法需要执行多长时间。如果消费者同时引用多个服务,则无需关心每个服务的超时设置。
从理论上讲,ReferenceConfig中支持的几乎所有配置项都可以使用ConsumerConfig,ServiceConfig,ProviderConfig配置默认值。
1:需要spring 3.2.16+
,详见公告:xmlns:p="http://www.springframework.org/schema/p"
2:默认情况下,引用bean遵循lazy init,只有当它被其他bean或其他实例引用时尝试使用getBean()
方法获取其实例时才会初始化引用。如果您需要eager init,请按以下方式配置:<dubbo:reference ... init="true" />
属性配置
如果您的应用程序足够简单,比如说,您不需要多注册表或多协议,并且您希望在Spring容器之间共享配置。您可以使用dubbo.properties
默认配置。
Dubbo会自动在classpath的根目录下加载dubbo.properties,你也可以使用JVM参数指定加载这个文件的路径:-Ddubbo.properties.file=xxx.properties
。
映射规则
合并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,则ti将应用于所有标记。
-
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" />
这是典型的dubbo.properties演示配置:
dubbo.application.name=foo
dubbo.application.owner=bar
dubbo.registry.address=10.20.153.10:9090
覆盖和优先事项
优先级从高到低:
- JVM -D参数,您可以在部署或启动应用程序时轻松覆盖配置,例如,更改dubbo协议的端口。
- XML,XML中的属性将覆盖dubbo.properties中的属性。
- 属性(默认值)仅在未使用XML或JVM配置时才有效。
1:如果类路径下有多个dubbo.properties,比如两个jar分别包含dubbo.properties,Dubbo将仲裁地选择一个来加载,并记录错误信息。
2:如果id
未配置protocol
,将使用name
属性作为默认值
API配置
所有API属性都具有XML中的对应项,有关详细信息,请参阅XML参考。例如ApplicationConfig.setName("xxx")
等于 <dubbo:application name="xxx" />
[1]
提供方
import com.alibaba.dubbo.rpc.config.ApplicationConfig;
import com.alibaba.dubbo.rpc.config.RegistryConfig;
import com.alibaba.dubbo.rpc.config.ProviderConfig;
import com.alibaba.dubbo.rpc.config.ServiceConfig;
import com.xxx.XxxService;
import com.xxx.XxxServiceImpl;
// Implementation
XxxService xxxService = new XxxServiceImpl();
// Application Info
ApplicationConfig application = new ApplicationConfig();
application.setName("xxx");
// Registry Info
RegistryConfig registry = new RegistryConfig();
registry.setAddress("10.20.130.230:9090");
registry.setUsername("aaa");
registry.setPassword("bbb");
// Protocol
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName("dubbo");
protocol.setPort(12345);
protocol.setThreads(200);
// NOTES: ServiceConfig holds the serversocket instance and keeps connections to registry, please cache it for performance.
// Exporting
ServiceConfig<XxxService> service = new ServiceConfig<XxxService>(); // In case of memory leak, please cache.
service.setApplication(application);
service.setRegistry(registry); // Use setRegistries() for multi-registry case
service.setProtocol(protocol); // Use setProtocols() for multi-protocol case
service.setInterface(XxxService.class);
service.setRef(xxxService);
service.setVersion("1.0.0");
// Local export and register
service.export();
消费者方面
import com.alibaba.dubbo.rpc.config.ApplicationConfig;
import com.alibaba.dubbo.rpc.config.RegistryConfig;
import com.alibaba.dubbo.rpc.config.ConsumerConfig;
import com.alibaba.dubbo.rpc.config.ReferenceConfig;
import com.xxx.XxxService;
// Application Info
ApplicationConfig application = new ApplicationConfig();
application.setName("yyy");
// Registry Info
RegistryConfig registry = new RegistryConfig();
registry.setAddress("10.20.130.230:9090");
registry.setUsername("aaa");
registry.setPassword("bbb");
// NOTES: ReferenceConfig holds the connections to registry and providers, please cache it for performance.
// Refer remote service
ReferenceConfig<XxxService> reference = new ReferenceConfig<XxxService>(); // In case of memory leak, please cache.
reference.setApplication(application);
reference.setRegistry(registry);
reference.setInterface(XxxService.class);
reference.setVersion("1.0.0");
// Use xxxService just like a local bean
XxxService xxxService = reference.get(); // NOTES: Please cache this proxy instance.
特价
只关心差异:
方法级别的配置
...
// Method level config
List<MethodConfig> methods = new ArrayList<MethodConfig>();
MethodConfig method = new MethodConfig();
method.setName("createXxx");
method.setTimeout(10000);
method.setRetries(0);
methods.add(method);
// Referring
ReferenceConfig<XxxService> reference = new ReferenceConfig<XxxService>();
...
reference.setMethods(methods);
...
点对点
...
ReferenceConfig<XxxService> reference = new ReferenceConfig<XxxService>();
// If you know the address of the provider and want to bypass the registry, use `reference.setUrl()` to specify the provider directly. Refer [How to Invoke a specific provider](../demos/explicit-target.md) for details.
reference.setUrl("dubbo://10.20.130.230:20880/com.xxx.XxxService");
...
注释配置
要求2.5.7
或更高
提供方
Service
导出注释
import com.alibaba.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;
}
}
扫描路径
@SpringBootApplication
@DubboComponentScan(basePackages = "com.alibaba.dubbo.test.service.impl")
public class ProviderTestApp {
// ...
}
消费者方面
Reference
注释供参考
public class AnnotationConsumeService {
@com.alibaba.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;
}
}
扫描路径
@SpringBootApplication
@DubboComponentScan(basePackages = "com.alibaba.dubbo.test.service")
public class ConsumerTestApp {
// ...
}
笔记
2.5.7中的所有注释将在以后删除,如果您在项目中使用了这些注释,请升级到最新版本。
<dubbo:annotation package="com.alibaba.dubbo.test.service" />
检查启动
默认情况下,dubbo将检查从属服务在启动时是否可用。当它不可用时,它会抛出异常以防止Spring完成初始化,这样你就可以在发布应用程序之前尽早发现问题,默认设置:check=true
。
你可以关闭检查check=false
。例如,某些服务在您运行测试时并不关心它,或者您必须首先因为循环依赖而启动它。
此外,如果您的Spring bean是延迟加载的,或者您使用API编程延迟参考服务,请关闭检查,否则服务将在服务暂时不可用时抛出异常,然后获取空引用。如果配置check=false
,您可以获得参考。恢复服务后,服务可以自动重新连接。
例
使用弹簧配置文件
禁用服务的启动检查(在未提供提供程序时抛出一些异常/错误):
<dubbo:reference interface = "com.foo.BarService" check = "false" />
禁用所有服务的启动检查(未提供时抛出一些异常/错误):
<dubbo:consumer check = "false" />
禁用注册中心启动检查(注册订阅失败错误):
<dubbo:registry check="false" />
使用dubbo.properties
dubbo.reference.com.foo.BarService.check = false
dubbo.reference.check = false
dubbo.consumer.check = false
dubbo.registry.check = false
使用-D参数
java -Ddubbo.reference.com.foo.BarService.check = false
java -Ddubbo.reference.check = false
java -Ddubbo.consumer.check = false
java -Ddubbo.registry.check = false
配置含义
dubbo.reference.check=false
,强制更改所有引用的检查值,即使配置有声明,也会被覆盖。
dubbo.consumer.check=false
默认值为check
。如果配置中有明确的声明,例如<dubbo:reference check =“true”/>` ,它将不会受到影响。
dubbo.registry.check=false
,上面的两个配置是表示订阅的成功。如果在提供程序列表为空的注册失败时也允许启动订阅,则需要使用此配置。系统将定期在后台再次尝试。