摘要:等之所以支持跨语言,是因为他们自己定义了一套结构化数据存储格式,如的,用于编解码对象,作为各个语言通信的中间协议。
前段时间觉得自己一直用别人的框架,站在巨人的肩膀上,也该自己造造轮子了 一时兴起 就着手写起了RPC框架 这里写了系列博客拿给大家分享下
这篇是开篇的思路篇 项目最终的代码放在了我的github上
https://github.com/wephone/Me...
欢迎star,提issues
首先说下关于RPC的几个常见问题
什么是RPCPRC:Remote Procedure Call 远程过程调用
在分布式系统中,每个节点之间的通信都是靠RPC来完成 RPC是分布式应用的基本组件
Apache的Thrift
Google的gprc
阿里巴巴的dubbo等
dubbo应该是3这中最简单易用的了,但dubbo只支持Java语言,thrift和gprc都是支持跨语言的,并且dubbo内部帮你实现了对分布式注册中心zookeeper的使用,另外两个仍需自己实现对注册中心的操作。
thrift grpc等之所以支持跨语言,是因为他们自己定义了一套结构化数据存储格式,如Google的protobuf,用于编解码对象,作为各个语言通信的中间协议。
RPC是一个概念,普通web开发的curl rest接口,也可以算作一种基于HTTP协议的RPC调用
RPC的使用比起curl一个重要的点就是忽略底层细节,像使用本地服务一样调用远程服务 我们将在RPC框架中使用动态代理来实现这个要求
本系列博客由浅到深,带大家打造一个支持跨语言,也支持zookeeper的RPC框架 目前先用Java实现
实现思路RPC有两个使用方 一个是本地调用端 一个是远程实现端
调用端使用动态代理 代理我们需要远程调度的接口 实现忽略底层细节 像使用本地服务一样使用调用远程服务
将我们本地调用的接口方法信息(形参,方法名,返回类型等)通过网络发送至远程实现端
远程实现端接收到相应信息,反射调用对象的实现类
执行完实现类后把返回值发回给调用端
调用端接收到返回值,代理返回结果 远程调用完毕
实现细节使用Netty作为Java端网络传输框架
为尽量支持跨语言 传输数据编解码使用json格式(本来想用protobuf 但它只支持强类型Int这种 不支持编解码Object这样的弱类型 会降低使用的灵活性)
下一篇博客中 将带大家用11个Java类 实现一个基于spring的Java RPC框架
暂时不使用一些常见设计模式,暂时不做zookeeper的支持和异常处理等细节问题
后续版本再对这个demo进行优化,并支持zookeeper
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68274.html
摘要:每个都可以通过其路径唯一标识,同时每个节点还可以存储少量数据。监听机制,监听某个当该发生变化时,会回调该,但是这个是一次性的,下次需要监听时还得再注册一次。 前面的文章中 我用netty实现了一个简单的一对一的RPC 11个类实现简单java rpc 接下来的文章中 我将使用zookeeper作为rpc调用的分布式注册中心 从而实现多对多(多个调用者,多个提供者)的rpc调用,负载均...
摘要:项目版本源码在上一博文中跟大家讲了的实现思路思路毕竟只是思路那么这篇就带着源码给大家讲解下实现过程中的各个具体问题读懂本篇需要的基本知识若尚未清晰请自行了解后再阅读本文动态代理框架的基本使用的基本配置最终项目的使用如下调用端代码及配置测试类 项目1.0版本源码 https://github.com/wephone/Me... 在上一博文中 跟大家讲了RPC的实现思路 思路毕竟只是思路...
摘要:前言昨天看了一篇关于用几行代码实现框架的博客,收获很大,于是我想在这篇博客的基础上理一理思路,尽可能的多加一点注释,进一步降低学习框架原理的门槛。 前言 昨天看了一篇关于用几行代码实现RPC框架的博客[http://javatar.iteye.com/blog...](),收获很大,于是我想在这篇博客的基础上理一理思路,尽可能的多加一点注释,进一步降低学习RPC框架原理的门槛。 原理图...
阅读 1510·2021-11-23 09:51
阅读 1064·2021-10-12 10:12
阅读 2782·2021-09-22 16:06
阅读 3595·2019-08-30 15:56
阅读 3369·2019-08-30 15:53
阅读 3070·2019-08-29 16:29
阅读 2320·2019-08-29 15:27
阅读 1989·2019-08-26 10:49