RPC不是人品差的意思,他的全称是Remote Procedure Call(远程过程调用) 在讲远程调用之前,要先知道什么是分布式
分布式:用大白话说,饭店只有一个厨师,他既负责洗菜+切菜+炒菜,这种可以看做是集中式程序。而分布式程序就好比:厨房里有厨师,切菜师,洗菜师。做一道菜,洗菜师洗菜,切菜师切菜,厨师炒菜。在这个炒菜的过程中,厨师需要洗菜师帮他洗菜,切菜师帮他切菜,这个依赖他人协助,完成任务跟现在的分布式很像。
到底什么是远程过程调用
RPC是指计算机A上的进程,调用另一台计算机B上的进程,其中A上的进程被挂起,而B上的进程开始执行,等B上的进程执行完,值返回给A时,A上的进程继续执行。
在RPC框架中主要有三个角色:provider,consumer和registry。如下图所示
server:指服务的提供方。 Client:指服务的消费方。 Registry:服务注册与发现的注册中心。
提供方相当于洗菜师,消费方相当于厨师。而注册中心是什么呢?一个大的饭店会有很多的厨师和洗菜师(集群部署)。而厨师想要某个洗菜师洗菜时,也不会直接找到洗菜师而会通过一个中间人。这个中间人知道厨房有多少洗菜师,那些洗菜师今天上班(需要先进行服务注册)。而且他可以根据每个洗菜师的忙碌程度,合理分配任务(负载均衡)。这个中间人就是注册中心担任的角色。
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的一个跨语言的高性能的服务框架,也得到了广泛的应用。
©著作权归作者所有:来自51CTO博客作者dylan的账号的原创作品,如需转载,请注明出处,否则将追究法律责任