Snailclimb / guide-rpc-framework

A custom RPC framework implemented by Netty+Kyro+Zookeeper.(一款基于 Netty+Kyro+Zookeeper 实现的自定义 RPC 框架-附详细实现过程和相关教程。)
https://gitee.com/SnailClimb/guide-rpc-framework
Other
3.9k stars 2.05k forks source link

发现的一些小问题 #9

Open smile2coder opened 4 years ago

smile2coder commented 4 years ago

我个人很喜欢这个项目,因为它能帮助我更好的理解rpc的细节。前段时间我看了李林峰的 《Netty权威指南》,也自己实现过简单的rpc,但是却不如你的全面和细节。在阅读源码的过程中,我发现了一下小问题,也可能是我没有get到你的思路,请指教

  1. github.javaguide.factory.SingletonFactory#getInstance,这个单例只是实现了一次校验,所以它恐怕不能正确的运行。
  2. github.javaguide.serialize.kyro.KryoSerializer#kryoThreadLocal,因为Kryo是非线程安全的,所以用了ThreadLocal为每个线程创建一个实例。由于netty的序列化操作是在线程池中运行,所以没必要每次序列化完成后都做remove操作。
  3. 我看项目中实现了以注解的方式发布服务,主要原理是用了SpringBeanPostProcessor对实例做了后置处理,但是SpringBeanPostProcessor能注册到容器原因是,你的示例项目example-server中NettyServerMain类中含有@ComponentScan注解,扫描的包名与rpc-framework-simple项目相同而已,这显然是不合理的。
  4. 许多资源的创建没有加锁,比如github.javaguide.registry.zk.util.CuratorUtils#getZkClient。当然,这些可以靠spring完成。

个人的一些理解,如有不足,还望指教

Snailclimb commented 4 years ago

我个人很喜欢这个项目,因为它能帮助我更好的理解rpc的细节。前段时间我看了李林峰的 《Netty权威指南》,也自己实现过简单的rpc,但是却不如你的全面和细节。在阅读源码的过程中,我发现了一下小问题,也可能是我没有get到你的思路,请指教

  1. github.javaguide.factory.SingletonFactory#getInstance,这个单例只是实现了一次校验,所以它恐怕不能正确的运行。
  2. github.javaguide.serialize.kyro.KryoSerializer#kryoThreadLocal,因为Kryo是非线程安全的,所以用了ThreadLocal为每个线程创建一个实例。由于netty的序列化操作是在线程池中运行,所以没必要每次序列化完成后都做remove操作。
  3. 我看项目中实现了以注解的方式发布服务,主要原理是用了SpringBeanPostProcessor对实例做了后置处理,但是SpringBeanPostProcessor能注册到容器原因是,你的示例项目example-server中NettyServerMain类中含有@componentscan注解,扫描的包名与rpc-framework-simple项目相同而已,这显然是不合理的。
  4. 许多资源的创建没有加锁,比如github.javaguide.registry.zk.util.CuratorUtils#getZkClient。当然,这些可以靠spring完成。

个人的一些理解,如有不足,还望指教

很赞啊!老哥!有些点的话确实没处理好。有时间的话还会继续优化以及修复现有的问题和你说的问题。🤟

Snailclimb commented 4 years ago

我个人很喜欢这个项目,因为它能帮助我更好的理解rpc的细节。前段时间我看了李林峰的 《Netty权威指南》,也自己实现过简单的rpc,但是却不如你的全面和细节。在阅读源码的过程中,我发现了一下小问题,也可能是我没有get到你的思路,请指教

  1. github.javaguide.factory.SingletonFactory#getInstance,这个单例只是实现了一次校验,所以它恐怕不能正确的运行。
  2. github.javaguide.serialize.kyro.KryoSerializer#kryoThreadLocal,因为Kryo是非线程安全的,所以用了ThreadLocal为每个线程创建一个实例。由于netty的序列化操作是在线程池中运行,所以没必要每次序列化完成后都做remove操作。
  3. 我看项目中实现了以注解的方式发布服务,主要原理是用了SpringBeanPostProcessor对实例做了后置处理,但是SpringBeanPostProcessor能注册到容器原因是,你的示例项目example-server中NettyServerMain类中含有@componentscan注解,扫描的包名与rpc-framework-simple项目相同而已,这显然是不合理的。
  4. 许多资源的创建没有加锁,比如github.javaguide.registry.zk.util.CuratorUtils#getZkClient。当然,这些可以靠spring完成。

个人的一些理解,如有不足,还望指教

很赞啊!老哥!有些点的话确实没处理好。有时间的话还会继续优化以及修复现有的问题和你说的问题。🤟

你要是有时间的话也可以小步pr给我。嘿嘿。

Snailclimb commented 4 years ago

第三个自定义注解的问题已经解决,commit在这里:https://github.com/Snailclimb/guide-rpc-framework/commit/292c64d1f83f03677c9f56e505360a9fb196ff4e 主要是新增加了可以扫描自定义注解的注解: RpcScan image image

smile2coder commented 4 years ago

哈哈,相互学习🤣 ,不得不说,你解决问题的速度是真的快啊!如果再发现问题会提pr的,奥利给

zzzczh commented 3 years ago

您好 想请教一个问题。我对两位说的 因为Kryo是非线程安全的,所以用了ThreadLocal为每个线程创建一个实例这句话有所疑惑。我认为换种方式直接在serialize方法内Kryo kryo = new Kryo();似乎也能起到同样的效果,每个线程都能且只能修改到一个kryo实例,即栈隔离的方式。这样是否就能避免使用ThreadLocal?尽管性能上并没有更佳,但也没有线程安全问题。