【宜立方】--dubbo的使用01

【定义】

    Dubbo |dʌbəʊ| 是一个高性能,基于Java的RPC框架,由阿里巴巴开源。和许多RPC系统一样,dubbo基于定义一个服务的思想,指定可以通过参数和返回类型远程调用的方法。在服务器端,服务器实现这个接口并运行一个dubbo服务器来处理客户端调用。在客户端,客户端有一个存根,提供与服务器相同的方法。

【结构】

分了几个角色:

  1. 提供者 - 服务暴露的地方; 一个提供者将注册它的服务
  2. 容器 - 启动,加载和运行服务的位置
  3. 消费者 - 调用远程服务; 消费者将订阅注册表中所需的服务
  4. 注册处 - 服务将被注册和发现
  5. 监视器 - 记录服务的统计信息,例如,给定时间间隔内服务调用的频率
【宜立方】--dubbo的使用01_第1张图片

提供者,消费者和注册表之间的连接是持久的,所以无论何时服务提供者关闭,注册表都可以检测到失败并通知消费者。

注册表和监视器是可选的。消费者可以直接与服务提供商联系,但整个系统的稳定性会受到影响。

【如何使用】

pom.xml


    com.alibaba
    dubbo
    2.5.7
【使用】

 现在我们来试试一下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:registry address = "multicast://224.1.1.1:9090" />
< 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,并将服务注册到了指定的组播地址

在提供程序的配置中,我们还分别通过声明了我们的应用程序元数据,发布的接口及其实现

所述多宝协议是框架支持许多协议之一。它建立在Java NIO非阻塞功能之上,是默认使用的协议。

我们将在本文后面更详细地讨论它。

3.  Multicast Registry – Service Consumer

通常,消费者需要指定要调用的接口和远程服务的地址,这正是消费者所需要的:

< dubbo:application name = "demo-consumer" version = "1.0" />
< dubbo:registry address = "multicast://224.1.1.1:9090" />
< 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"
   id = "greetingsService" url = "dubbo://127.0.0.1:20880" />

基本上,这个过程与传统的Web服务类似,但是Dubbo只是简单,简单和轻量级的。

4. 协议支持

协议支持

该框架支持多种协议,包括dubbo,RMI,hessian,HTTP,web服务,thrift,memcached和redis。大多数协议看起来很熟悉,除了dubbo。让我们来看看这个协议里有什么新东西。 dubbo协议保持提供者和消费者之间的持续连接。长连接和NIO无阻塞网络通信在传输小规模数据包(<100K)时性能相当好。 有几个可配置的属性,例如端口,每个消费者的连接数量,最大接受的连接等等。
协议支持
< dubbo:protocol name = "dubbo" port = "20880"
   connections = "2" accepts = "1000" />
Dubbo还支持通过不同的协议一次展示服务:

< 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" />
我们可以使用不同的协议公开不同的服务,如上面的代码片段所示。底层的传输器,序列化实现以及与网络相关的其他常见属性也是可配置的。

你可能感兴趣的:(项目)