第一部分,设计分析

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

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. Storm源码阅读之SpoutOutputCollector

    不得不说storm是一个特别棒的实时计算框架.为了对后文理解的方便,先说几个storm中的术语: Topology:拓扑图或者拓扑结构.在storm中它通过消息分组的分式连接Spout和Bolt节点定 ...

  2. web组件工具之获取表单数据:webUtils

    本文需要的架包:commons-beanutils-1.8.3.jar.commons-logging-1.1.3.jar.servlet-api.jar. 本文共分为五部分:1)封装通用工具类:从表 ...

  3. 用letsencrypt搭建免费的https网站

    环境:阿里云服务器centos7.3,nignx,letsencrypt做免费的https证书 Let’s Encrypt官网:https://letsencrypt.org/ 1.服务器开放端口:4 ...

  4. cin问题 分类: c++ 2014-08-02 21:13 38人阅读 评论(0) 收藏

    string s: while(cin>>s){ cout<<s<endl; } 当输入ss w    ww   w   w 按enter时 输出为 ss w ww w ...

  5. opnet的sink模块学习 分类: opnet 2014-05-18 10:28 161人阅读 评论(0) 收藏

    Sink模块的状态机很简单,只有INIT和DISCARD两个,非强制状态只有DISCARD用于包的销毁.Sink模块的作用就是销毁从输入流接收到的包,并且返回关于包的一系列统计量. Init的入口代码 ...

  6. Linux 下 安装jdk 1.7

    Linux 下 安装jdk 1.7 参考百度经验 http://jingyan.baidu.com/album/ce09321b7c111f2bff858fea.html?picindex=6 第一步 ...

  7. VM虚拟机中安装Linux操作系统

    本文操作步骤,笔者已实验成功 (前提:正确安装VM并激活) 1,点击新建虚拟机,在页面上选择"自定义",点击下一步 2,进入选择虚拟机硬件兼容页面,这里一般不用操作,直接点击下一步 ...

  8. 【Lab】提取result的bits和Y-PSNR数据并整理到Excel

    [Lab]提取result的bits和Y-PSNR数据并整理到Excel 更新:使用openpyxl库直接将数据写入Excel中 注意:openpyxl是第三方库,如果没有安装.请命令行里键入pip ...

  9. TFS build server搭建,搭建自动化构建服务器

    TFS build 服务器的搭建主要步骤如下: 一:环境准备: 新建一台build服务器 安装Visual Studio.主要目的是: a. 生成Build脚本所需要的build命令:b.与TFS组合 ...

  10. 野生程序员对.NETFramework 4.0 ThreadPool的理解

    ThreadPool 类 提供一个线程池,该线程池可用于执行任务.发送工作项.处理异步 I/O.代表其他线程等待以及处理计时器. 命名空间:   System.Threading程序集:  mscor ...