1.应用场景

主要用于学习RPC的原理,工作流程,拆解和组装一个简单的RPC框架。

2.学习/操作

1.文档阅读

31 | 动手实现一个简单的RPC框架(一):原理和程序的结构-极客时间

32 | 动手实现一个简单的RPC框架(二):通信与序列化-极客时间
33 | 动手实现一个简单的RPC框架(三):客户端-极客时间
34 | 动手实现一个简单的RPC框架(四):服务端-极客时间

实现框架源码--参考

https://github.com/liyue2008/simple-rpc-framework
https://github.com/Gred01/simple-rpc-framework/tree/nameservice -- 另外网友的

https://blog.csdn.net/william_n/article/details/122642317

2021-04-22 - RPC / 远程方法调用 - 学习/实践_william_n的博客-CSDN博客

PHP - RPC框架 - 学习/实践_william_n的博客-CSDN博客_phprpc框架

其他

服务之间的调用为啥不直接用 HTTP 而用 RPC? - 知乎

既然有 HTTP 请求,为什么还要用 RPC 调用? - 知乎

基于TCP和HTTP协议的RPC简单实现 - 云+社区 - 腾讯云

2.整理输出

2.1 框架主体模块

2.2 原理和程序的结构

TBD

2.3 通信与序列化

TBD

2.4 客户端

TBD

2.5 服务端

TBD

临时插入

我们这个例子中注册中心的实现类是 LocalFileNameService,它的实现比较简单,就是去读写一个本地文件,实现注册服务 registerService 方法时,把服务提供者保存到本地文件中;实现查找服务 lookupService 时,就是去本地文件中读出所有的服务提供者,找到对应的服务提供者,然后返回。

这里面有一点需要注意的是,由于这个本地文件它是一个共享资源,它会被 RPC 框架所有的客户端和服务端并发读写。所以,这时你要怎么做呢?对,必须要加锁!

由于我们这个文件可能被多个进程读写,所以这里不能使用我们之前讲过的,编程语言提供的那些锁,原因是这些锁只能在进程内起作用,它锁不住其他进程。我们这里面必须使用由操作系统提供的文件锁。这个锁的使用和其他的锁并没有什么区别,同样是在访问共享文件之前先获取锁,访问共享资源结束后必须释放锁。

具体的代码你可以去查看 LocalFileNameService 这个实现类。

课后练习题

要求你基于 JDBC 协议实现一个注册中心,这样就可以支持跨服务器来访问注册中心。

GitHub - liyue2008/simple-rpc-framework at jdbc-nameservice

后续补充

...

3.问题/补充

1. 关于注册中心

1.1 网友一:

这里注册中心信息是保存在本地文件中,如果保存在数据库,就要用数据库锁,或者zookeeper、redis的分布式锁。

网友二回复: 数据库和文件不一样吧?为啥数据库也要锁?

TBD

1.2 网友三:

请教下老师,如果要实现一个可供生产环境大规模集群使用的注册中心,JDBC协议是不是就不太合适了?这种情况下一个注册中心要满足哪些要求呢?个人盲猜:可多台部署、基于tcp协议最好也是netty实现、彼此之间要保证数据一致性(好像也不用强一致),不知道理解对不对

作者回复: 大致的要求就是:
可用性:不能因为某个节点故障导致注册中心不可以;
数据一致性:能保证顺序一致性一般就可以满足需求了。
性能:server节点状态变更后,能尽快更新。

另外,大规模集群情况下,需要考虑业务系统上下线时,注册中心的性能问题。比如:一个几千个节点的微服务上线,会重启几千个Server节点,这时候注册中心需要更新大量的数据。

1.3 如果服务端挂掉了,怎么通知NameService呢?

作者回复: 这个问题在我们的demo中并没有解决。实际在生产环境中,有些注册中心会定期检查服务端的状态,但是即使这样也不能保证注册中心中维护的状态和服务端实际的状态实时同步。

解决这个问题,更多的是依靠rpc框架客户端的自动重试策略,比如,请求某个服务端实例超时后,立即换一个实例自动重试。

1.4 关于通过反射获取调用方法的性能损耗

Method method = serviceProvider.getClass().getMethod(rpcRequest.getMethodName(), String.class);
每次请求都用反射获取method,有没有性能损耗,是不是存起来,请问老师这部分生产级别怎么处理的?

作者回复: JVM对反射的优化已经很好了,这部分的性能损耗并不是很大,所以一般不用特别的优化。

另外网友回复:

之前看过部分dubbo的代码,里面对反射有做优化,建议可以去看看

扩展问题:

PHP语言的反射特性与Java的有什么异同?

另外性能损耗如何,是否推荐使用?

1.5 RPC框架中有涉及到client和server,如果是不同服务调用,在服务器上是如何部署代码的呢?

TBD

1.6 DriverManager是怎么知道加载哪个JDBC驱动的呢? 代码里并没有把驱动的类名传过去呀

作者回复: JDBC 4.0 已经支持SPI机制了,只要把驱动放在classpath里面就会自动加载的。

4.参考

参见文档阅读列表

后续补充

...

RPC - 如何动手实现一个简单RPC框架 - 学习/实践相关推荐

  1. jsonrpc php使用,php实现的一个简单jsonrpc框架实例

    php实现的一个简单jsonrpc框架实例json rpc 是一种以json为消息格式的远程调用服务,它是一套允许运行在不同操作系统.不同环境的程序实现基于Internet过程调用的规范和一系列的实现 ...

  2. 深入理解JDK动态代理原理,使用javassist动手写一个动态代理框架

    文章目录 系列文章索引 一.动手实现一个动态代理框架 1.初识javassist 2.使用javassist实现一个动态代理框架 二.JDK动态代理 1.编码实现 2.基本原理 (1)getProxy ...

  3. 自己动手实现一个简单的JSON解析器

    1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 ...

  4. 自己动手搭建一个简单的静态资源服务器

    文章目录 自己动手搭建一个简单的静态资源服务器 介绍 一.设计到的模块 备注: 二.代码结构 三.具体代码 自己动手搭建一个简单的静态资源服务器 介绍 ​ 通过此文章的学习,可以自己使用NodeJs搭 ...

  5. 自己动手写一个简单的bootloader

    自己动手写一个简单的bootloader 15年10月31日19:44:27 (一) start.S 写这一段代码前,先要清楚bootloader开始的时候都做什么了.无非就是硬件的初始化,我们想要写 ...

  6. 动手做一个简单的智能小车

    动手做一个简单的智能小车 来到CNDN一年了,看到了许多大佬的杰出作品.也该写点什么来回馈给大家了前不久接触了单片机,想提前进行实践一下所以有想法做一个实体出来,想来想去难的怕自己搞不定,但是还好找到 ...

  7. 手写一个简单rpc框架(一)

    扑街前言:前面说了netty的基本运用.Java的NIO等一系列的知识,这些知识已经可以做一个简单的rpc框架,本篇和下篇我们一起了解一个怎么完成一个rpc框架,当然个只是为了更好的了解rpc框架的基 ...

  8. 自己动手写一个简单的MVC框架(第一版)

    一.MVC概念回顾 路由(Route).控制器(Controller).行为(Action).模型(Model).视图(View) 用一句简单地话来描述以上关键点: 路由(Route)就相当于一个公司 ...

  9. json string 格式_自己动手实现一个简单的JSON解析器

    作者:田小波 原文:http://cnblogs.com/nullllun/p/8358146.html 1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数 ...

最新文章

  1. php 多条数据更新数据类型,PHPdoc @param中的两个或多个数据类型
  2. 第八届国际BCI会议(2021 Virtual BCI meeting)
  3. 重复数据删除(De-duplication)技术研究
  4. Linux:终端自定义title
  5. 【机器学习基础】5种数据同分布的检测方法!
  6. python面向对象编程类的成员总结
  7. 六、推荐系统原理与应用
  8. response细节点
  9. 2评分标准多少分_高新企业认定评分标准,需要多少分才能拿到高新认证证书...
  10. DLL型后门原理及完全清除秘诀
  11. 优秀的云存储解决方案Dropbox,现在注册就有2G
  12. 服务器装哪个操作系统好,服务器装哪个操作系统好
  13. 生产环境 xfs filesystem 上安装Mariadb
  14. yealink学习笔记20200422UVC协议、usb摄像头抓包
  15. 思科交换机dhcp配置
  16. 控制策略 | PI控制器积分分离的仿真分析
  17. 联想ThinkBook解锁FN键
  18. .NET 开源项目概览
  19. Marshmallow及ORM小结
  20. PCB、SCH转化为AD工程

热门文章

  1. 2010年元月购买台式机清单
  2. 前端开发培训应掌握的知识点
  3. 大疆无人机直播延迟的解决对策
  4. linux cnc 安装教程,艰难的LinuxCNC(EMC2)源代码安装依赖03
  5. 腾讯开发10年大佬:移动端开发现状与发展浅析!给你一个职业规划的方向
  6. 手机App与蓝牙手柄
  7. 常见问题(持续更新)
  8. 第一章 Node简介
  9. 一文读懂政务外网发展现状
  10. PatternSyntaxException: Dangling meta character ‘*‘ near index 8