今天来复习一下RPC(远程过程调用)框架的典型实现Dubbo
什么叫远程方法调用呢?顾名思义,在这里就是消费者远程调用服务器的方法。
apache官网的Dubbo 框架已经很形象的展示了具体的调用过程:
简单分析主要分为三个部分:服务提供者、服务消费者、注册中心。
整体的思路是:服务提供者启动后,会向注册中心注册提供者信息(包括IP地址,服务名,方法定义等),之后服务消费者启动后,会向注册中心订阅服务信息,一旦服务提供者的信息发生了变更,注册中心将会负责把这些变更通知给消费者吗,之后由消费者调用服务提供者提供的方法,无需经过注册中心,直接调用经过即可。
1.注册中心
注册中心的作用:
可以把服务提供者发生的变更通知给服务消费者。通过长连接将服务 提供者连接,如果服务提供者异常中断,注册中心将会从服务列表中移除该服务。这里选择的是zookeeper(分布式的协调框架),其中会存储服务提供者和服务消费者的相关信息。
2.服务提供者
服务提供者先向注册中心注册,需要将自身的服务名和服务地址发送给注册中心,以便于消费者从服务中心获得服务连接、进行服务调用。
服务提供者需要进行配置的有:
- 端口信息
- 应用程序的名字,需要唯一,不能和注册中心其他程序冲突
- 注册中心的地址
- 设置连接注册中心的超时时间
- 指定导出服务的包名
3.服务消费者
服务消费者和提供者需要有公共的AIP接口将两者进行联接起来。
服务消费者需要配置的有:
- 端口信息
- 消费者应用程序的唯一名字
- 注册中心的地址
- 超时时间
4.调用流程
- (1)浏览器中访问消费者的地址
- (2)根据此地址找到控制器中相对应的方法,接下来代用userService
- (3)但是由于userService是一个接口,具体的实现并不在消费者这边
- (4)dubbo会根据这个userService生成一个代理对象
- (5)代理对象会访问注册中心,把userService服务的信息下载至本地,把这些服务缓存在本地,后续的调用不会再依赖注册中心。(这里底层使用的是netty nio非阻塞io跟服务提供者之间进行通信)
Dubbo的特点
- 其中dubbo中的消费者和提供专人都是java语言,数据格式使用的是二进制
- 底层是基于TCP,没有跨语言,但因为使用可二进制作为数据传输,因此数据传输效率较高。
- 基于长连接,适合连接较少,但是相对比较稳定的情况。
rest和dubbo的区别
dubbo:两个使用java 语言的程序之间进行调用,性能上字节服务应用程序之间规模上更适合长连接,规模较小,管理上支持服务治理。
rest:适合不同语言的应用程序之间的调用(任意语言),任意平台之间进行调用,规模较大,更适合短连接。