RPC - 如何动手实现一个简单RPC框架 - 学习实践

RPC - 如何动手实现一个简单RPC框架 - 学习实践,第1张

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

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框架

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.参考

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

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

实现框架源码--参考
https://github.com/Gred01/simple-rpc-framework/tree/nameservice

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

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

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

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

后续补充

...

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5712329.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存