第一部分,设计分析

远程调用要解决的主要问题:

1,序列化 : 如何将对象转化为二进制数据进行传输,如何将二进制数据转化对象
2,数据的传输(协议,第三方框架)
3,服务的注册/发现,单点故障,分布式服务
4,服务的监控和管理
 
序列化的选择:
        可以使用java自带的序列化,Hessian,protobuff,json,xml等
性能比较高的是protobuff和hessian,protobuff使用的时候需要编写proto文件,有侵入性,比较麻烦,而Hessian
性能比protobuff稍差
不过近来出现了一个基于protobuff的框架:protostuff--不用编写proto文件,基于注解,性能可以,推荐使用。
 
数据的传输:
        出于并发性能的考虑,传统的阻塞式 IO 显然不太合适,因此我们需要异步的 IO,即 NIO。Java 提供了 NIO 的解决方案,Java 7 也提供了更优秀的 NIO.2 支持。可以选择Netty或者mina来解决NIO数据传输的问题
 
使用ZooKeeper提供服务注册与发现功能,解决单点故障以及分布式部署的问题(注册中心)
 
需要单独开发一个应用对服务进行监控和管理。
 
详细的细节可以参看dubbo的文档。
 
第二部分,设计样例:
 
一,包设计。
 

 
1,common包用于封装服务请求对象,服务响应对象以及基于protostuff的序列化工具
2,client包封装服务的请求,开发服务消费者的时候需要依赖此包
3,registry包封装服务的注册以及发现
4,server包封装请求的实际调用以及服务的发布
 
client和server均依赖common,registry
 
二,类设计
 
1,common包:

RpcRequest与RpcResponse为简单javaBean,封装RPC调用的请求和响应
SerializationUtil使用protostuff进行对象序列化操作,
RpcDecoder与RpcEncoder使用SerializationUtil和netty执行数据流的读取和写入(NIO传输)。
 
2,registry包
 

ServiceDiscovery负责服务的查找,返回
host:port
格式的服务提供地址数据
 
ServiceRegistry负责服务的注册,以
host:port
的格式将服务的提供地址写入到zookeeper
 
 
3,client包

 
RpcClient通过netty的NIO发起RPC请求并获取服务的响应数据
RpcProxy负责:
        封装RPC请求对象
        从服务注册中心查找服务
        代理RpcClient发起请求(使用java动态代理)
 
4,server包

RpcHandler实现io.netty.channel.SimpleChannelInboundHandler
完成Rpc请求的实际调用,通过反射调用方法(java reflect或者cglib)
 
RpcServer实现ApplicationContextAware, InitializingBean
通过读取classpath中的spring-context文件依赖ServiceRegistry执行服务的注册,当客户端请求的时候 
依赖RpcHandler完成调用。
 
第三部分,rpc服务的开发流程
 
1,分离接口与实现,api接口包为服务端和客户端都必须依赖的接口,常量,javabean
2,服务端provider编写实现类实现api包中的接口,依赖rpc-server包,classpath中放置spring配置文件,用于服务的注册
3,客户端consumer依赖rpc-client包,使用RpcProxy 创建接口实例执行调用

RPC框架实现思路浅析的更多相关文章

  1. c# 实现RPC框架的思路

    RPC框架,就是远程调用一个方法就像是本地调用一样. 用于网络消息的话,那么你的收发消息通过异步方法可以写在一起,很方便 核心代码 using System; using System.Collect ...

  2. RPC框架设计思路

    RPC是指远程过程调用 1.要解决通讯的问题,主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输.连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远 ...

  3. 8.如何自己设计一个类似 Dubbo 的 RPC 框架?

    作者:中华石杉 面试题 如何自己设计一个类似 Dubbo 的 RPC 框架? 面试官心理分析 说实话,就这问题,其实就跟问你如何自己设计一个 MQ 一样的道理,就考两个: 你有没有对某个 rpc 框架 ...

  4. 全图文分析:如何利用Google的protobuf,来思考、设计、实现自己的RPC框架

    目录 一.前言 二.RPC 基础概念 1. RPC 是什么? 2. 需要解决什么问题? 3. 有哪些开源实现? 三.protobuf 基本使用 1. 基本知识 2. 使用步骤 四.libevent 1 ...

  5. rpc框架之 thrift连接池实现

    接前一篇rpc框架之HA/负载均衡构架设计 继续,写了一个简单的thrift 连接池: 先做点准备工作: package yjmyzz; public class ServerInfo { publi ...

  6. rpc框架之HA/负载均衡构架设计

    thrift.avro.grpc之类的rpc框架默认都没有提供负载均衡的实现,生产环境中如果server只有一台,显然不靠谱,于是有了下面的设计,这其实是前一阵跟北京一个朋友在qq群里交流的结果,分享 ...

  7. rpc框架之 thrift 学习 1 - 安装 及 hello world

    thrift是一个facebook开源的高效RPC框架,其主要特点是跨语言及二进制高效传输(当然,除了二进制,也支持json等常用序列化机制),官网地址:http://thrift.apache.or ...

  8. .net RPC框架选型

    近期开始研究分布式架构,会涉及到一个最核心的组件:RPC(Remote Procedure Call Protocol).这个东西的稳定性与性能,直接决定了分布式架构系统的好坏.RPC技术,我们的产品 ...

  9. .net RPC框架选型(一)

    近期开始研究分布式架构,会涉及到一个最核心的组件:RPC(Remote Procedure Call Protocol).这个东西的稳定性与性能,直接决定了分布式架构系统的好坏.RPC技术,我们的产品 ...

随机推荐

  1. docker - 由于docker swarm子网与host机器网络冲突导致的container通信问题的解决方案

    背景 近期,公司网络要迁移到新的网段,所以原来在服务器上面搭建的docker swarm需要重新构建... 拿到新的服务器地址看了一下,“10.xxx.xxx.xxx" ... 纳尼,这IP ...

  2. business meeting

    Metting are all about discussions . discussion expression 开始会议 Let's get started We need to discuss. ...

  3. rabbitMQ教程(二)一篇文章看懂rabbitMQ

    一.rabbitMQ是什么: RabbitMQ,遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上. 学过websocket的来理解rabbitMQ应该是 ...

  4. yum 源问题

    YUM源搭建 1.yum源是yum安装的获取源地,yum  = 红帽包管理 echo /dve/sr0 /media ios9660 defaults 0 0 >> /etc/fstab ...

  5. Verilog 任意(奇数/偶数)分频器

    参加过一次笔试,让实现3分频,楼主当时是懵逼的,脑子里只知道同时利用上升沿和下降沿,本来写对了,慌张面试,脑子不管用了,(因为是手写,只能用脑子仿真)后来又给改错了,捂脸... 还是逻辑不清晰,现在自 ...

  6. 【bzoj2819】Nim

    Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游 ...

  7. Java基础之类和对象、单例模式、继承

    Java类和对象 一般的类只能是public或者default的,若是public的,类名必须和文件名一样.一般在一个文件只写一个类,故这个类一般是加上public. 内部类还可以是private和p ...

  8. [补档][ZJOI2007] 报表统计

    [ZJOI2007] 报表统计 题目 传送门 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细观察,小Q发现统计一 ...

  9. Git在tortoiseGit以及eclipse的使用方法

    一.Git安装与简单使用 1.安装git,tortoiseGit 2.创建SSH Key 打开Git Bash,然后输入ssh-keygen生成公钥和私钥: 3.生成ppk文件. 打开puttykey ...

  10. Redis从单机到集群,一步步教你环境部署以及使用

    Redis作为缓存系统来说还是很有价值的,在大数据方向里,也是需要有缓存系统的.一般可以考虑tachyon或者redis,由于redis安装以及使用更简单,所以还是优先考虑了它.那么在一些场景下为了保 ...