博主小菜鸡一只,目前研二上学期,之前对rpc框架了解不多,想课余时间丰富一下自己的java知识,通过该系列博客勉励自己,内容对大佬来说可能过于简单,还请轻喷,谢谢。
初步理解:
RPC是指远程过程调用,通过网络从远程计算机程序上请求服务,此框架需要做到的是——使得客户端直接调用服务端的方法就像调用本地方法一样简单,所以一般不涉及到解析和封装HTTP请求和相应的问题。
主体结构:
主体结构,借用JavaGuide这位大佬的图:
registry是注册中心,一般使用zookeeper,服务提供端 Server 向注册中心注册服务,服务消费者 Client 通过注册中心拿到服务相关信息,然后再通过网络请求服务提供端 Server。
简单来说,可以把registry看成一家家政公司,服务人员在公司里面把自己能做的事做简单的注册,然后客户在公司里面找到自己“心仪”的工作人员,然后再自己根据服务人员提供的地址,找他提供服务。
实现的关键点:
注册中心:
负责服务地址的注册于查找。服务端启动时,将服务名称及其对应地址(IP+ port)注册到注册中心,客户端根据服务名找到服务器地址,向其发送请求。
网络传输:
发送请求才能调用远程方法,请求中应该包含调用方法的类名,方法名以及一些相关参数。可以使用NIO的Netty框架。
序列化:
请求和相应在传送过程中需要转化为二进制,所以我们需要选择一种序列化协议,比如hession2、kyro、protostuff等等。
动态代理:
RPC的关键在于调用远程方法要像调用本地方法一样简单,所以使用动态代理可以屏蔽远程方法调用的细节部分,比如网络传输。当调用远程方法时,通过代理对象传输网络请求,不是传统的http协议那样。
负载均衡:
后续补充,暂时没有了解到。
有关的Java知识:
本篇文章我们先来了解以上述实现关键点中,Java部分的知识。 1、动态代理机制,用于实现远程方法调用。
2、序列化机制中,各个框架的对比。
3、线程池的使用。
4、CompletableFuture 的使用。