快速开始

使用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存储库中找到完整的示例代码。


  1. 接口需要单独打包,由服务提供商和消费者共享
  2. 隐藏服务消费者的实现↩︎
  3. 也可以使用IoC注入↩︎

 

依赖

必要的依赖

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]:如果您正在使用ServiceConfigReferenceConfigAPI调用,则不是必需的。
  • 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>

配置标签之间的关系

标签

目的

介绍

<dubbo:service/>

服务出口

用于导出服务,定义服务元数据,使用多个协议导出服务,向多个注册表注册服务

<dubbo:reference/>

服务参考

用于创建远程代理,订阅多个注册表

<dubbo:protocol/>

协议配置

在供应商方面配置服务协议,消费者方面如下。

<dubbo:application/>

应用程序配置

适用于提供者和消费者。

<dubbo:module/>

模块配置

可选的。

<dubbo:registry/>

注册中心

注册表信息:地址,协议等

<dubbo:monitor/>

监控中心

监控信息:地址,地址等。可选。

<dubbo:provider/>

提供商的默认配置

ServiceConfigs的默认配置。可选的。

<dubbo:consumer/>

消费者的默认配置

ReferenceConfigs的默认配置。可选的。

<dubbo:method/>

方法级别配置

ServiceConfig和ReferenceConfig的方法级别配置。

<dubbo:argument/>

参数配置

用于指定方法参数配置。

覆盖和优先事项

以超时为例,这里是优先级,从高到低(重试,负载均衡,活动也应用相同的规则):

  • 方法级别,接口级别,默认/全局级别。
  • 在同一个因素中,消费者比提供者具有更高的优先级

提供者端的配置通过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"); 
 
...

 

 

  1. 我们什么时候应该使用API:API对于与OpenAPI,ESB,Test,Mock等系统集成非常有用。通用提供商和消费者,我们仍然建议使用XML配置↩︎

注释配置

要求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,上面的两个配置是表示订阅的成功。如果在提供程序列表为空的注册失败时也允许启动订阅,则需要使用此配置。系统将定期在后台再次尝试。