【定义】
Dubbo |dʌbəʊ| 是一个高性能,基于Java的RPC框架,由阿里巴巴开源。和许多RPC系统一样,dubbo基于定义一个服务的思想,指定可以通过参数和返回类型远程调用的方法。在服务器端,服务器实现这个接口并运行一个dubbo服务器来处理客户端调用。在客户端,客户端有一个存根,提供与服务器相同的方法。
【结构】
分了几个角色:
- 提供者 - 服务暴露的地方; 一个提供者将注册它的服务
- 容器 - 启动,加载和运行服务的位置
- 消费者 - 调用远程服务; 消费者将订阅注册表中所需的服务
- 注册处 - 服务将被注册和发现
- 监视器 - 记录服务的统计信息,例如,给定时间间隔内服务调用的频率
提供者,消费者和注册表之间的连接是持久的,所以无论何时服务提供者关闭,注册表都可以检测到失败并通知消费者。
注册表和监视器是可选的。消费者可以直接与服务提供商联系,但整个系统的稳定性会受到影响。
【如何使用】
pom.xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.7</version>
</dependency>
【使用】
现在我们来试试一下Dubbo的基本功能。
这是一个微创框架,其大部分功能取决于外部配置或注释。
官方建议我们应该使用XML配置文件,因为它依赖于Spring容器(目前是Spring 4.3.10)。
我们将使用XML配置演示其大部分功能。
1. Multicast Registry – Service Provider
作为一个快速入门,我们只需要一个服务提供者,一个消费者和一个“不可见的”注册表。注册表是不可见的,因为我们正在使用多播网络。 在下面的例子中,提供者只对其消费者表示“hi”:
public interface GreetingsService {
String sayHi(String name);
}
public class GreetingsServiceImpl implements GreetingsService {
@Override
public String sayHi(String name) {
return "hi, " + name;
}
}
为了进行远程过程调用,消费者必须与服务提供者共享一个公共接口,因此接口GreetingsService必须与消费者共享。
2. Multicast Registry – Service Registration
现在让我们注册GreetingsService到注册表。如果提供者和使用者都在同一个本地网络上,一个非常方便的方法是使用多播注册表:
<
dubbo:application
name
=
"demo-provider"
version
=
"1.0"
/>
<
dubbo:protocol
name
=
"dubbo"
port
=
"20880"
/>
<
bean
id
=
"greetingsService"
class
=
"com.baeldung.dubbo.remote.GreetingsServiceImpl"
/>
<
dubbo:service
interface
=
"com.baeldung.dubbo.remote.GreetingsService"
ref
=
"greetingsService"
/>
通过上面的bean配置,我们刚刚将GreetingsService公开给了dubbo://127.0.0.1:20880下的url,并将服务注册到了<dubbo:registry />中指定的组播地址。
在提供程序的配置中,我们还分别通过<dubbo:application />,<dubbo:service />和<beans />声明了我们的应用程序元数据,发布的接口及其实现。
所述多宝协议是框架支持许多协议之一。它建立在Java NIO非阻塞功能之上,是默认使用的协议。
我们将在本文后面更详细地讨论它。
3. Multicast Registry – Service Consumer通常,消费者需要指定要调用的接口和远程服务的地址,这正是消费者所需要的:
<
dubbo:application
name
=
"demo-consumer"
version
=
"1.0"
/>
<
dubbo:reference
interface
=
"com.baeldung.dubbo.remote.GreetingsService"
id
=
"greetingsService"
/>
public class MulticastRegistryTest {
@Before
public void initRemote() {
ClassPathXmlApplicationContext remoteContext
= new ClassPathXmlApplicationContext("multicast/provider-app.xml");
remoteContext.start();
}
@Test
public void givenProvider_whenConsumerSaysHi_thenGotResponse(){
ClassPathXmlApplicationContext localContext
= new ClassPathXmlApplicationContext("multicast/consumer-app.xml");
localContext.start();
GreetingsService greetingsService
= (GreetingsService) localContext.getBean("greetingsService");
String hiMessage = greetingsService.sayHi("baeldung");
assertNotNull(hiMessage);
assertEquals("hi, baeldung", hiMessage);
}
}
当提供程序的remoteContext启动时,Dubbo将自动加载GreetingsService并将其注册到给定的注册表。在这种情况下,它是一个多播注册表。 消费者订阅多播注册表并在上下文中创建GreetingsService的代理。当我们的本地客户端调用sayHi方法时,它会透明地调用远程服务。 我们提到注册表是可选的,这意味着消费者可以通过暴露的端口直接连接到提供者:
<
dubbo:reference
interface
=
"com.baeldung.dubbo.remote.GreetingsService"
基本上,这个过程与传统的Web服务类似,但是Dubbo只是简单,简单和轻量级的。
协议支持
<
dubbo:protocol
name
=
"dubbo"
port
=
"20880"
connections
=
"2"
accepts
=
"1000"
/>
<
dubbo:protocol
name
=
"dubbo"
port
=
"20880"
/>
<
dubbo:protocol
name
=
"rmi"
port
=
"1099"
/>
<
dubbo:service
interface
=
"com.baeldung.dubbo.remote.GreetingsService"
version
=
"1.0.0"
ref
=
"greetingsService"
protocol
=
"dubbo"
/>
<
dubbo:service
interface
=
"com.bealdung.dubbo.remote.AnotherService"
version
=
"1.0.0"
ref
=
"anotherService"
protocol
=
"rmi"
/>
我们可以使用不同的协议公开不同的服务,如上面的代码片段所示。底层的传输器,序列化实现以及与网络相关的其他常见属性也是可配置的。