【代码随想录知识星球】项目分享-手撕RPC框架,项目专栏 有本项目的详细文档
1.先安装并开启zookeeper
安装参考:
【Zookeeper】Windows下安装Zookeeper(图文记录详细步骤,手把手包安装成功)_windows安装zk-CSDN博客
2.运行Server包下的TestServer,再运行Client包下的TestClient
应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。 远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。 通信框架:MINA 和 Netty
大型网站
:内部涉及多个子系统,服务、接口较多。注册发现机制
:如Nacos、Dubbo等,一般都有注册中心,服务有多个实例,调用方调用的哪个实例无感知。安全性
:不暴露资源服务化治理
:微服务架构、分布式架构。核心功能实现主要分为服务寻址、序列化和反序列化、网络传输功能。
Call ID映射:
本地:在本地方法调用中,函数体是直接通过函数指针来指定的,但是在远程调用中,由于两个进程的地址空间完全不一样,函数指针不起作用。 远程:RPC中所有函数或方法都有自己的一个ID,在所有进程中都唯一。客户端在做远程过程调用时,必须附上这个ID,即客户端会查一下表,找出相应的Call ID,然后传给服务端,服务端也会查表,来确定客户端需要调用的函数,然后执行相应函数的代码。 Call ID映射表一般是一个哈希表。
概述:
必要性: 远程调用涉及到数据的传输,在本地调用中,只需要将数据压入栈中,然后让函数去栈中读取即可。 但远程的数据传输,由于客户端和服务端不在同一个服务器上,涉及不同的进程,不能通过内存传递参数,此时就需要将客户端先将请求参数转成字节流(编码),传递给服务端,服务端再将字节流转为自己可读取格式(解码),这就是序列化和反序列化的过程。反之,服务端返回值也逆向经历序列化和反序列化到客户端。
序列化的优势: 将消息对象转为二进制字节流,便于网络传输。 可跨平台、跨语言。如Python编写的客户端请求序列化参数传输到Java编写的服务端进行反序列化。
作用:
协议: 主要有TCP、UDP、HTTP协议。
基于TCP协议
客户端和服务端建立Socket连接。 客户端通过Socket将需要调用的接口名称、方法名称及参数序列化后传递给服务端。 服务端反序列化后再利用反射调用对应的方法,将结果返回给客户端。
基于HTTP协议
客户端向服务端发送请求,如GET、POST、PUT、DELETE等请求。 服务端根据不同的请求参数和请求URL进行方法调用,返回JSON或者XML数据结果。
TCP和HTTP对比
part1
part2
part3
part1
part2
在客户端建立本地服务缓存
实现本地缓存的动态更新
part1
part2
part1
[ ] 补充其它序列化方式(如ProtoBuf,Hessian)
[ ] 集成Spring
[ ] 主动下线失败次数过多的节点
[ ] 探测离线节点的状态,对恢复正常的节点重新上线
[ ] 实现自适应的负载均衡器