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。
过程大致如下:(主要是利用反射和netty)
要自己写一遍,你才能更好的理解
以下我整理觉得很重要大的。
结点的理解:
1,服务容器负责启动,加载,运行服务提供者。
2,服务提供者在启动时,向注册中心注册自己提供的服务。
3,服务消费者在启动时,向注册中心订阅自己所需的服务。
4,注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
5,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
6,服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。
小知识:多个maven项目,如何相互引入pom中呢?
maven02要引入maven01要引入,只要将maven01中pom.xml的groupId,artifactId,version放在maven02的pom.xml。
实现简单的dubbo
分别创建三个module。
结构如下:
代码具体已上传。
实际上总结下来,如上面实现过程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的目录结构下:(如果不是这样建议重下)
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目录下有很多重要配置)
测试代码提交了,是参考github上的代码理解的。