手写dubbo-7手撸了自定义协议远程调用服务动态扩容,梳理一下吧!

Posted 叁滴水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写dubbo-7手撸了自定义协议远程调用服务动态扩容,梳理一下吧!相关的知识,希望对你有一定的参考价值。


  目前为止,笔者已经编写了一个基本的rpc框架,完成了rpc框架核心的一些功能: 自定义协议、远程调用、服务动态扩容等。

image-20210517102937346

在每一篇文章的结束位置,都附上了源码地址,如果在文章中有一些不清楚的地方可以拉取项目项目源代码。如果有不懂的地方可以Q:835029688。一起交流学习。

1、远程调用

  远程调用使用netty完成异步调用,对于netty不太熟悉的小伙伴,可以看下netty聊天的小功能。通过这个小功能完成可以稍微了解一些netty。接着通过这种思路完成了一个愣头青式的远程调用。通过调用本地方法UserService.getUserNameById (12l),实现调用服务端的具体实现。这种最进本的调用可以算是调用的雏形。

image-20210508180915785

  另外,netty是异步调用,但是调用的线程是同步调用。这样一来框架的难度就提高了,可能小伙伴无法理解,只有当真正手撸dubbo的时候,才知道这里的难度。线程在异步调用之后,必须等待结果的返回。这就考验开发者的多线程功底了。jdk自带了很多异步等待的方式。这一点大家可以按照自己的想法自行实现。笔者通过wait/notify方式简单实现了下,dubbo也是通过这种方式实现的,大家可以参考下。

2、自定义协议

  接着对这种调用进行了优化,通过一个相对友好的自定义协议进行了优化。在目前阶段,dubbo协议中有一些信息是不需要的,所以并没有全部仿照dubbo协议,单单是仿照了它的思想而已。

image-20210508180915785

  官方说Invocation 是会话域,它持有调用过程中的变量,比如方法名,参数等。这一点可以在自定义协议体现出来。

3、服务动态扩容

  一个不能动态扩容的rpc框架是不是一个完美的框架。在基本调用成型之后,立即加如服务动态扩容功能。引入注册中心概念,注册中心在此担任服务的"通讯录"。消费者在"通讯录"中查找对应的服务者信息。以此实现进行rpc调用时只调用服务正常的提供者。在多服务者时就会涉及到一个负载均衡的问题,目前采用随机调用,稍后会对此进行扩展。

总结

  虽然已经可以基本调用,但是还是有dubbo的很多点,很多概念没有合理的引用出来。例如集群容错、线程模型、直连提供者、多协议、SPI等等,稍后会逐步引入。此工程主要目的是为了更好的理解dubbo框架,如果有严重bug,或者不对的地方,大家可以指出来。

都看到这里了, 大家来一波关注吧,谢谢大家了。结尾送大家一个美女图,放松一下心情。
img

以上是关于手写dubbo-7手撸了自定义协议远程调用服务动态扩容,梳理一下吧!的主要内容,如果未能解决你的问题,请参考以下文章

使用动态代理+Netty+Zookeeper+Protobuff手撸一个RPC框架

使用动态代理+Netty+Zookeeper+Protobuff手撸一个RPC框架

手撸golang 学ectd 手写raft协议13 小结

手撸golang 学etcd 手写raft协议之12 单元测试

轻而易举的手撸了一个HTTP图片资源服务器!

面试原理:手撸RPC框架