1,什么是RPC
RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。
RPC是一种进程间通信方式。它允许程序调用一个地址空间(通常是共享网络的另一台机器上)的过程或者函数,而不是程序员显示编码这个远程调用细节。即程序员无论是调用本地还是远程的,本质上写的调用代码基本相同。
应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
通信框架:MINA 和 Netty。
RPC框架使用长连接,采用心跳机制保证长连接正常运行。(连接方式有很多种,不局限,不同的协议也不同)
比如常见: 1,Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
2,RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式。
注意:如果正在使用 RMI 提供服务给外部访问 ,同时应用里依赖了老的 common-collections 包的情况下,存在反序列化安全风险 。

1.1,完整的 RPC 框架

rpc 同一端口只能连一次 rpc长连接还是短连接_rpc 同一端口只能连一次


如果要自己写一套RPC。

过程大致如下:(主要是利用反射和netty)

要自己写一遍,你才能更好的理解

以下我整理觉得很重要大的。

rpc 同一端口只能连一次 rpc长连接还是短连接_RPC_02


结点的理解:

1,服务容器负责启动,加载,运行服务提供者。

2,服务提供者在启动时,向注册中心注册自己提供的服务。

3,服务消费者在启动时,向注册中心订阅自己所需的服务。

4,注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

5,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

6,服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。

小知识:多个maven项目,如何相互引入pom中呢?
maven02要引入maven01要引入,只要将maven01中pom.xml的groupId,artifactId,version放在maven02的pom.xml。

实现简单的dubbo

分别创建三个module。

结构如下:

rpc 同一端口只能连一次 rpc长连接还是短连接_ide_03


代码具体已上传。

实际上总结下来,如上面实现过程api提供了接口方法,provider实现方法,comsumer消费方法。
分布式就相当于把一个大系统划分为一个个小系统进行开发,而dubbo就是划分的代码实现。如电商就可分为用户Consumer、用户Provider、商品Consumer、商品Provider、订单Consumer、订单Provider等等,不同的consumer可以放到一个consumer大模块进行管理,provider丢到一个provider大模块进行管理,按照该文章里的例子则duboo则为所有模块的祖宗。

支持分布式 – ZooKeeper

ZooKeeper是开放分布式应用协调服务,是hadoop和Hbase的重要主键,他可以为分布式提供最终数据一致性,配置维护,名称服务、分布式同步、组服务。

ZooKeeper在多台集群中有leader和follower之分。

ZooKeeper的数据存储形式,类似Linux文件树+对应数据组成ZooKeeper的一个Znode

下载解压:

在zk的目录结构下:(如果不是这样建议重下)

rpc 同一端口只能连一次 rpc长连接还是短连接_rpc 同一端口只能连一次_04


bin目录 :

zk的可执行脚本目录,包括zk服务进程,zk客户端,等脚本。其中,.sh是Linux环境下的脚本,.cmd是Windows环境下的脚本。

conf目录 :
配置文件目录。zoo_sample.cfg为样例配置文件,需要修改为自己的名称,一般为zoo.cfg。log4j.properties为日志配置文件。
lib :
zk依赖的包。

contrib目录 :
一些用于操作zk的工具包。
recipes目录
zk某些用法的代码示例

启动zkServer.cmd,但是很遗憾,发现闪退。

你需要解决方式:

上面的思路并没有解决。

也有人说是zookeeper目录下没有lib文件夹,下一个完整版带lib的,然后把lib放进去。

也有人说是下载的版本太高JDK不能很好支持。

好吧!我的上面的错误全占了。

得已启动成功:(这里体现了bin目录下有很多重要配置)

rpc 同一端口只能连一次 rpc长连接还是短连接_ide_05


测试代码提交了,是参考github上的代码理解的。