1.应用场景
| 主要用于学习RPC的原理,工作流程,拆解和组装一个简单的RPC框架。 |
2.学习/操作
1.文档阅读
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实现、彼此之间要保证数据一致性(好像也不用强一致),不知道理解对不对 作者回复: 大致的要求就是: 作者回复: 这个问题在我们的demo中并没有解决。实际在生产环境中,有些注册中心会定期检查服务端的状态,但是即使这样也不能保证注册中心中维护的状态和服务端实际的状态实时同步。 Method method = serviceProvider.getClass().getMethod(rpcRequest.getMethodName(), String.class); 作者回复: JVM对反射的优化已经很好了,这部分的性能损耗并不是很大,所以一般不用特别的优化。 另外网友回复: 之前看过部分dubbo的代码,里面对反射有做优化,建议可以去看看 扩展问题: PHP语言的反射特性与Java的有什么异同? 另外性能损耗如何,是否推荐使用? 1.5 RPC框架中有涉及到client和server,如果是不同服务调用,在服务器上是如何部署代码的呢?TBD 1.6 DriverManager是怎么知道加载哪个JDBC驱动的呢? 代码里并没有把驱动的类名传过去呀作者回复: JDBC 4.0 已经支持SPI机制了,只要把驱动放在classpath里面就会自动加载的。 |
4.参考
| 31 | 动手实现一个简单的RPC框架(一):原理和程序的结构-极客时间 32 | 动手实现一个简单的RPC框架(二):通信与序列化-极客时间 实现框架源码--参考 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框架 |
后续补充
...



