如何快速开发一个 Dubbo 应用?
作者:CQITer小编 时间:2018-06-20 09:58

在分布式系统中,远程调用是最基础也是最重要的基石。历史上,曾经先后出现过 CORBA、RMI、EJB、WebService 等技术和规范,在服务化以及微服务日趋流行的今天,更多的被广泛使用的是包括 gRPC、Finagle、以及国内的 Dubbo 为代表的轻量级框架。
由于这些框架多半与服务注册中心、配置中心等配套设施结合使用,用来作为系统分布式服务化的场景,因此这类框架又被统称为服务框架。本文将以 Dubbo 为例,介绍如何快速开发一个 Dubbo 应用。
背景
本文将以 Dubbo 为例,介绍如何快速开发一个 Dubbo 应用。为了便于读者理解:
首先会介绍一下传统的 RMI 的基本概念
然后比较下现代的 RPC 框架与 RMI 的区别
再基于 Dubbo 提供的 API 展示最基本的 Dubbo 应用如何开发
最后介绍如何通过 start.dubbo.io 快速搭建 Dubbo 的脚手架工程
Java RMI 简介
Java RMI (Remote Method Invocation) 远程方法调用,能够让客户端像使用本地调用一样调用服务端 Java 虚拟机中的对象方法。RMI 是面向对象语言领域对 RPC (Remote Procedure Call)的完善,用户无需依靠 IDL 的帮助来完成分布式调用,而是通过依赖接口这种更简单自然的方式。
Java RMI 工作原理
一个典型的 RMI 调用如下图所示:
服务端向 RMI 注册服务绑定自己的地址;
客户端通过 RMI 注册服务获取目标地址;
客户端调用本地的 Stub 对象上的方法,和调用本地对象上的方法一致;
本地存根对象将调用信息打包,通过网络发送到服务端;
服务端的 Skeleton 对象收到网络请求之后,将调用信息解包;
然后找到真正的服务对象发起调用,并将返回结果打包通过网络发送回客户端。

(来源:https://www.cs.rutgers.edu/~pxk/417/notes/images/rpc-rmi_flow.png)
Java RMI 基本概念
Java RMI 是 Java 领域创建分布式应用的技术基石。后续的 EJB 技术,以及现代的分布式服务框架,其中的基本理念依旧是 Java RMI 的延续。在 RMI 调用中,有以下几个核心的概念:
通过接口进行远程调用
通过客户端的 Stub 对象和服务端的 Skeleton 对象的帮助将远程调用伪装成本地调用
通过 RMI 注册服务完成服务的注册和发现
对于第一点,客户端需要依赖接口,而服务端需要提供该接口的实现。对于第二点,在 J2SE 1.5 版本之前需要通过 rmic 预先编译好客户端的 Stub 对象和服务端的 Skeleton 对象。在之后的版本中,不再需要事先生成 Stub 和 Skeleton 对象。
下面通过示例代码简单的展示 RMI 中的服务注册和发现:
服务端的服务注册
说明:
初始化服务对象实例;
通过 UnicastRemoteObject.exportObject 生成可以与服务端通讯的 Stub 对象;
创建一个本地的 RMI 注册服务,监听端口为 1099。该注册服务运行在服务端,也可以单独启动一个注册服务的进程;
将 Stub 对象绑定到注册服务上,这样,客户端可以通过 Hello 这个名字查找到该远程对象。
客户端的服务发现
说明:
获取注册服务实例,在本例中,由于没有传入任何参数,假定要获取的注册服务实例部署在本机,并监听在 1099 端口上;
从注册服务中查找服务名为 Hello 的远程对象;
通过获取的 Stub 对象发起一次 RMI 调用并获得结果。
理解 RMI 的工作原理和基本概念,对掌握现代分布式服务框架很有帮助,建议进一步的阅读 RMI 官方教材 [1]。
Dubbo 基本概念
现代的分布式服务框架的基本概念与 RMI 是类似的,同样是使用 Java 的 Interface 作为服务契约,通过注册中心来完成服务的注册和发现,远程通讯的细节也是通过代理类来屏蔽。具体来说,Dubbo 在工作时有以下四个角色参与:
服务提供者:启动时在指定端口上暴露服务,并将服务地址和端口注册到注册中心上。
服务消费者:启动时向注册中心订阅自己感兴趣的服务,以便获得服务提供方的地址列表。
注册中心 :负责服务的注册和发现,负责保存服务提供方上报的地址信息,并向服务消费方推送。
监控中心:负责收集服务提供方和消费方的运行状态,比如服务调用次数、延迟等,用于监控。
运行容器:负责服务提供方的初始化、加载以及运行的生命周期管理。

部署阶段
服务提供者在指定端口暴露服务,并向注册中心注册服务信息。
服务消费者向注册中心发起服务地址列表的订阅。
运行阶段
注册中心向服务消费者推送地址列表信息。
服务消费者收到地址列表后,从其中选取一个向目标服务发起调用。
调用过程服务消费者和服务提供者的运行状态上报给监控中心。
基于 API 的 Dubbo 应用



