教你如何快速开发一个Dubbo应用

导读:在分布式系统中 , 远程调用是最基础也是最重要的基石 。历史上 , 曾经先后出现过 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 注册服务获取目标地址;
【教你如何快速开发一个Dubbo应用】客户端调用本地的 Stub 对象上的方法 , 和调用本地对象上的方法一致;
本地存根对象将调用信息打包 , 通过网络发送到服务端;
服务端的 Skeleton 对象收到网络请求之后 , 将调用信息解包;
然后找到真正的服务对象发起调用 , 并将返回结果打包通过网络发送回客户端 。
教你如何快速开发一个Dubbo应用

文章插图
 
Java RMI 基本概念
Java RMI 是 Java 领域创建分布式应用的技术基石 。后续的 EJB 技术 , 以及现代的分布式服务框架 , 其中的基本理念依旧是 Java RMI 的延续 。在 RMI 调用中 , 有以下几个核心的概念:
通过接口进行远程调用
通过客户端的 Stub 对象和服务端的 Skeleton 对象的帮助将远程调用伪装成本地调用
通过 RMI 注册服务完成服务的注册和发现
对于第一点 , 客户端需要依赖接口 , 而服务端需要提供该接口的实现 。对于第二点 , 在 J2SE 1.5 版本之前需要通过 rmic 预先编译好客户端的 Stub 对象和服务端的 Skeleton 对象 。在之后的版本中 , 不再需要事先生成 Stub 和 Skeleton 对象 。
下面通过示例代码简单的展示 RMI 中的服务注册和发现:
服务端的服务注册
教你如何快速开发一个Dubbo应用

文章插图
 
说明:
初始化服务对象实例;
通过 UnicastRemoteObject.exportObject 生成可以与服务端通讯的 Stub 对象;
创建一个本地的 RMI 注册服务 , 监听端口为 1099 。该注册服务运行在服务端 , 也可以单独启动一个注册服务的进程;
将 Stub 对象绑定到注册服务上 , 这样 , 客户端可以通过 Hello 这个名字查找到该远程对象 。
客户端的服务发现
教你如何快速开发一个Dubbo应用

文章插图
 
说明:
获取注册服务实例 , 在本例中 , 由于没有传入任何参数 , 假定要获取的注册服务实例部署在本机 , 并监听在 1099 端口上;
从注册服务中查找服务名为 Hello 的远程对象;
通过获取的 Stub 对象发起一次 RMI 调用并获得结果 。
理解 RMI 的工作原理和基本概念 , 对掌握现代分布式服务框架很有帮助 , 建议进一步的阅读 RMI 官方教材 [1] 。
Dubbo 基本概念
现代的分布式服务框架的基本概念与 RMI 是类似的 , 同样是使用 Java 的 Interface 作为服务契约 , 通过注册中心来完成服务的注册和发现 , 远程通讯的细节也是通过代理类来屏蔽 。具体来说 , Dubbo 在工作时有以下四个角色参与:
服务提供者:启动时在指定端口上暴露服务 , 并将服务地址和端口注册到注册中心上 。


推荐阅读