RPC不是人品差的意思,他的全称是Remote Procedure Call(远程过程调用)                          在讲远程调用之前,要先知道什么是分布式                                                                 

分布式:用大白话说,饭店只有一个厨师,他既负责洗菜+切菜+炒菜,这种可以看做是集中式程序。而分布式程序就好比:厨房里有厨师,切菜师,洗菜师。做一道菜,洗菜师洗菜,切菜师切菜,厨师炒菜。在这个炒菜的过程中,厨师需要洗菜师帮他洗菜,切菜师帮他切菜,这个依赖他人协助,完成任务跟现在的分布式很像。

到底什么是远程过程调用

RPC是指计算机A上的进程,调用另一台计算机B上的进程,其中A上的进程被挂起,而B上的进程开始执行,等B上的进程执行完,值返回给A时,A上的进程继续执行。

一个有趣的知识:RPC_知识

在RPC框架中主要有三个角色:provider,consumer和registry。如下图所示

一个有趣的知识:RPC_知识_02

server:指服务的提供方。 Client:指服务的消费方。 Registry:服务注册与发现的注册中心。

提供方相当于洗菜师,消费方相当于厨师。而注册中心是什么呢?一个大的饭店会有很多的厨师和洗菜师(集群部署)。而厨师想要某个洗菜师洗菜时,也不会直接找到洗菜师而会通过一个中间人。这个中间人知道厨房有多少洗菜师,那些洗菜师今天上班(需要先进行服务注册)。而且他可以根据每个洗菜师的忙碌程度,合理分配任务(负载均衡)。这个中间人就是注册中心担任的角色。

一个有趣的知识:RPC_RPC_03

1.register:服务注册                    2.subscribe:订阅                3.notify:通知                      4.invoke:方法                             5.count:统计                         monitor:监测                         init:启动                                     async:异步                         sync:同步                           proxy:代理                                 cluster:集群                       container:容器

服务提供者启动后主动向注册中心注册机器ip、port以及提供的服务列表:服务消费者启动时注册中心获取服务提供方地址列表,可实现软负载均衡和Failover;                     port:端口   Failover:故障切换,指系统中一项设备或服务出现错误,另一项设备或服务可自动接手原失效的设备或服务。  

实现RPC框架需要哪些技术:

动态代理

生成 client stub和server stub需要用到Java动态代理技术,我们可以使用JDK原生的动态代理机制,可以使用一些开源字节码工具如:CgLib,Javassist等。

#动态代理:利用JAVA的反射技术,在运行时创建一个实现某些给定接口的新类(动态代理类)及其实例(对象)。可以对代理类进行统一管理。client:顾客              sub:为屏蔽客户调用远程主机上的对象,必须提供某种方式来模拟本地对象,这种本地对象称为存根(stub),存根负责接收本地方法调用,并将它们委派给各自的具体实现对象 .            CgLib:一个开原项目,一个code(源代码)生成类库。      javassist:一个字节码工具。

序列化

为了能在网络上传输和接收Java对象,我们需要对它进行序列化和反序列化。不推荐用java原生的序列化机制,效率低。可以用开原成熟的序列化技术如:protobuf,Thrift,hessian,Kryo,Msgpack

NIO

当前很多RPC框架都直接基于netty这一IO通信框架,比如阿里的HSF,dubboo,Hadoop Avro,推荐使用Netty作为底层通信框架。

#java non-blocking IO 指jdk1.4及以上版本提供的新API,为所有原始类型提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。

服务注册中心

可选技术:Redis,Zookeeper,Consul,Etcd

#Redis:提供开源ANSI,C语言等的API        Zookeeper:开源分布式应用程序协调服务

开源RPC框架

Dubbo

Dubbo是阿里巴巴公司开源的一个JAVA高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。目前已经进入Apache孵化器。

Motan

Motan是新浪微博开源的一份java RPC框架。2016年5月开源。

gRPC

gRPC是Google开发的高性能,通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发。本身它不是分布式,所以要实现上面的框架的功能要进一步的开发。

thrift

thrift是Apache的一个跨语言的高性能的服务框架,也得到了广泛的应用。