开场白,这是一个关于RPC的相关概念的普及篇系列,主要是通过一步步的调整,提炼出一个相对完整的RPC框架. RPC(Remote Procedure Call Protocol)--远程过程调用协议,基于C/S模型.网络上有一篇文章写得不错.能够去了解一下相关概念深入浅出RPC 这里,直接使用一下上面作者的一个示意图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWluZGZsb2F0aW5n/font/5a6L5L2T/fontsize/400/f…
之前我们制定了一个非常easy的RPC消息 的格式,可是还遗留了两个问题,上一篇解决掉了一个.还留下一个 我们并没有实现对应的encode和decode方法,没有基于能够跨设备的字符串传输,而是直接的内存变量传递. 如今的RPC request不支持带參数的请求命令. 如add(a, b), 怎样在RPC消息中描写叙述參数a,b . 以下我们处理掉这个编解码问题. 实际的RPC应用基本都是跨机器连接.所以无法直接传递内存变量,也就是说还须要将消息编码成 诸如字符串一类的能够跨设备传输的内容. 详…
开局篇我们说了,RPC框架的四个核心内容 RPC数据的传输. RPC消息 协议 RPC服务注冊 RPC消息处理    接下来处理传输数据.实际应用场景一般都是基于socket.socket代码比較多,使用起来也比較麻烦. 并且详细的传输通道使用socket或者其它的方式,如更上层的http,或者android里的binder,都是可替换的.仅仅是详细的一种实现而已.所以,这里我就偷个懒,仅仅是引入一个非常easy的Connection类.用来描写叙述一下怎样将传输数据 这一层给独立出来. 首先简…
开局篇我们说了,RPC框架的四个核心内容 RPC数据的传输. RPC消息 协议 RPC服务注冊 RPC消息处理 以下,我们先看一个普通的过程调用 class Client(object): def __init__(self): self.remote = None ## # 内部是托付给远程remote对象来获取结果. def sayHello(self): if self.remote: return self.remote.sayHello() else : return None cla…
开局篇我们说了.RPC框架的四个核心内容 RPC数据的传输. RPC消息 协议 RPC服务注冊 RPC消息处理 接下来处理RPC服务的注冊机制.所谓注冊机制,就是Server须要声明支持哪些rpc方法.然后当client发送调用某个声明的rpc方法之后,服务端能自己主动找到运行该请求的详细方法.以实际的样例为例.这是如今server端处理RPC请求的代码 def procRequest(self): # 循环读取并处理收到的client请求 while True: req = self.conn…
一.RPC简介 RPC,全称Remote Procedure Call, 即远程过程调用,它是一个计算机通信协议.它允许像本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用).Hessian,Http invoker等.另外,RPC是与语言无关的. RPC示意图: 如上图所示,假设Computer1在调用sayHi() 方法,对于Computer1而言,调用sayHi()方法就像调用本地方法一样.调用->返回.但从后续调用可以看出Computer1调用的是Computer2…
一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC, 它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC.会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化. 众所…
一.什么是RPC RPC(Remote Procedure Call)即远程过程调用,简单的说就是在A机器上去调用B机器上的某个方法,在分布式系统中极其常用. rpc原理其实很简单,比较容易理解,在rpc中有两个角色,rpc server和rpc client,先从client开始讨论,因为client要像调用普通类的方法那样调用server端的方法,比如client要调用server端的Foo#bar()方法,所以它必须首先获取到Foo的实例,但是又不能直接new,因为直接new的话还是相当于…
基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇 前提 最近对网络编程方面比较有兴趣,在微服务实践上也用到了相对主流的RPC框架如Spring Cloud Gateway底层也切换为Reactor-Netty,像Redisson底层也是使用Netty封装通讯协议,最近调研和准备使用的SOFARpc也是基于Netty封装实现了多种协议的兼容.因此,基于Netty造一个轮子,在SpringBoot的加持下,实现一个轻量级的RPC框架.这篇博文介绍的是RPC框架协议的定义以及对应的…
前提 前置文章: Github Page:<基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> Coding Page:<基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> 在前置的<基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇>一文中已经定义了一个相对简单的RPC私有协议,并且实现了对应的编码和解码模块.这篇文章基于协议篇,完成Server端代码调用的编写.考虑到目前相对主流的IOC容器是Spring,这…
前提 前置文章: <基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> <基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇> 前一篇文章相对简略地介绍了RPC服务端的编写,而这篇博文最要介绍服务端(Client)的实现.RPC调用一般是面向契约编程的,而Client的核心功能就是:把契约接口方法的调用抽象为使用Netty向RPC服务端通过私有协议发送一个请求.这里最底层的实现依赖于动态代理,因此动态代理是动态实现接口的最简单方式(如果…
前提 前置文章: <基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> <基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇> <基于Netty和SpringBoot实现一个轻量级RPC框架-Client篇> 前一篇文章简单介绍了通过动态代理完成了Client端契约接口调用转换为发送RPC协议请求的功能.这篇文章主要解决一个遗留的技术难题:请求-响应同步化处理. 需要的依赖如下: JDK1.8+ Netty:4.1.44.F…
10分钟写一个RPC框架 1.RpcFramework package com.alibaba.study.rpc.framework; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; imp…
0 前言 提前先祝大家春节快乐!好了,先简单聊聊. 我从事的是大数据开发相关的工作,主要负责的是大数据计算这块的内容.最近Hive集群跑任务总是会出现Thrift连接HS2相关问题,研究了解了下内部原理,突然来了兴趣,就想着自己也实现一个RPC框架,这样可以让自己在设计与实现RPC框架过程中,也能从中了解和解决一些问题,进而让自己能够更好的发展(哈哈,会不会说我有些剑走偏锋?不去解决问题,居然研究RPC.别急,这类问题已经解决了,后续我也会发文章详述的). 1 RPC流水线工程? 原理图上我已经…
RPC 框架有很多可扩展的地方,如:序列化类型.压缩类型.负载均衡类型.注册中心类型等等. 假设框架提供的注册中心只有zookeeper,但是使用者想用Eureka,修改框架以支持使用者的需求显然不是好的做法. 最好的做法就是留下扩展点,让使用者可以不需要修改框架,就能自己去实现扩展. JDK 原生已经为我们提供了 SPI 机制,ccx-rpc 在此基础上,进行了性能优化和功能增强. 在讲解 ccx-rpc 的增强 SPI 之前,先来了解一下 JDK SPI 吧. 讲解的 RPC 框架叫 ccx…
网络通信的开发,就涉及到一些开发框架:Java NIO.Netty.Mina 等等. 理论上来说,类似于序列化器,可以为其定义一套统一的接口,让不同类型的框架实现,事实上,Dubbo 就是这么干的. 但是,作为一个简单的 RPC 框架,ccx-rpc 就先不统一了,因为基本上网络框架是不会换的,而且统一起来代码量巨大. ccx-rpc 选择的网络框架是 Netty,Netty 是一款大名鼎鼎的异步事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端. Netty 在…
当 RPC 框架使用 Netty 通信时,实际上是将数据转化成 ByteBuf 的方式进行传输. 那如何转化呢?可不可以把 请求参数 或者 响应结果 直接无脑序列化成 byte 数组发出去? 答:直接序列化传输是不行的,会出现粘包拆包的问题. 粘包拆包 什么是粘包拆包 RPC 通信使用 TPC (别问我为什么不用 UDP),TCP 是一个"流"协议.所谓流,就是没有界限的一长串二进制数据.TCP 作为传输层协议,并不了解上层业务数据的具体含义,它会根据 TCP 缓冲区的实际情况进行数据…
该rpc框架是一个mini版的dubbo.学习rpc之前,建议先了解NIO,Netty和Dubbo等知识.请移步网络编程 前言:(借用阿里大佬的一段话) 为什么要自己写一个RPC框架,我觉得从个人成长上说,如果一个程序员能清楚的了解RPC框架所具备的要素,掌握RPC框架中涉及的服务注册发现.负载均衡.序列化协议.RPC通信协议.Socket通信.异步调用.熔断降级等技术,可以全方位的提升基本素质.虽然也有相关源码,但是只看源码容易眼高手低,动手写一个才是自己真正掌握这门技术的最优路径. 一.概述…
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEAD…
我们在接下来会开始讲网络通信相关的内容了.既然是网络通信,那必然会涉及到序列化的相关技术. 下面是 ccx-rpc 序列化器的接口定义. /** * 序列化器 */ public interface Serializer { /** * 序列化 * * @param object 要序列化的对象 * @return 字节数组 */ byte[] serialize(Object object); /** * 反序列化 * * @param bytes 字节数组 * @param clazz 要反…
第一步:下载struts2对应的jar包,可以到struts官网下载:http://struts.apache.org/download.cgi#struts252 出于学习的目的,可以把整个完整的压缩文件都下载下来. 里面包括:1 apps:示例应用,对学习很有帮助 : 2 docs:相关学习文档.API文档等: 3 lib:核心类库,依赖包: 4:src:源代码 第二步:在eclipse新建一个Dynamic Web Project类型工程,一直点next,记得勾选generate web.…
前段时间,只需用一台新电脑,由于资金有限没有匹配了心仪已久的SSD.我没感觉到飞翔的感觉,总不甘心,仔细想想.我死了相当大的存储,我们可以假设部分内存作为硬盘驱动器把它弄出来.不会比固态硬盘的速度快,我们開始吧. 首先.我们要做的就是写一个硬盘控制器的驱动,我们知道.存储类型的驱动一般都遵守 class/port/miniport driver 这种结构.微软已经完毕了磁盘类的驱动,以及 SCSI 总线的 Port 驱动,我们仅仅须要完毕 SCSI 总线上硬盘控制器的 Miniport 驱动就能…
1.首先感谢同事 2.之前一直在做angularjs的项目,目前vue火热,所以自己搭建了一个的vue框架,在此作为记录 vue+vux-ui这里就不介绍了,有很多博客都写的很详细了. 下面简单记录下axios 和 mock 1.axios <1>  安装axios npm install axios <2>  使用axios 1.因为有时候项目需要稍微封装一下axios,所以我这里并没有直接像官网那里在入口main.js直接引入axios 2.按照官网的要求,我在src目录下新建…
使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二) 以上两篇已经把流程说明以及具体的代码实现完成,下面来说下,开发中经常遇到的问题,总结如下所示: 1.启动查询时,会报错:SQL dialect is not configured , 提示你配置方言,打开菜单File,选择settings,然后在inspection - sql -中把方言的√去除,截图如下所示:…
目录 背景 系统设计 1. 系统功能 2. Master组件 2.1 命名空间 2.2 心跳机制 2.3 故障恢复和容错机制 3. ChunkServer组件 3.1 本地存储 3.2 内存命中机制 3.3 状态维护 3.4 副本管理 4. Client组件 4.1 上传 4.2 下载 4.3 追加 4.4 删除 4.5 文件列表 本文主要是使用Java RMI 实现一个简单的GFS(谷歌文件系统,google file system),这里介绍GFS背景以及系统的设计相关. [为了更好的阅读以…
RPC 中服务消费端(Consumer) 需要请求服务提供方(Provider)的接口,必须要知道 Provider 的地址才能请求到. 那么,Consumer 要从哪里获取 Provider 的地址呢? 能不能 Consumer 自己配置 Provider 的地址? 这种方式理论上是可行的,不过事实上没人这么做.这种方式有以下缺点: Consumer 每引用一个接口,需要配置一次 Provider 的服务地址,配置繁琐易错. Consumer 引用其他业务组的服务,需要跨团队沟通,沟通成本高.…
Machete.Rpc Machete.Rpc 是一个轻量级的Rpc(远程过程调用的)框架.底层代理使用了Emit提高了效率,底层通信采用DotNetty框架以提升通信的效率.目前正在逐步完善中. Github:https://github.com/MacheteTeam/Machete.Rpc. 简单使用 目前还没有放到Nuget上,稍后放上去 1.新建一个类库Machete.Rpc.Sample.Service,新建一个接口IChatService [RpcService] public i…
一.心跳 什么是心跳 在 TPC 中,客户端和服务端建立连接之后,需要定期发送数据包,来通知对方自己还在线,以确保 TPC 连接的有效性.如果一个连接长时间没有心跳,需要及时断开,否则服务端会维护很多无用连接,浪费服务端的资源. IdleStateHandler Netty 已经为我们提供了心跳的 Handler:IdleStateHandler.当连接的空闲时间(读或者写)太长时,IdleStateHandler 将会触发一个 IdleStateEvent 事件,传递的下一个 Handler.…
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEAD…
前言 netcore 发布以来,一直很关注netcore的进程.目前在公司负责的网站也历经波折的全部有.net framework 4.0 全部切换到netcore 2.2 版本中.虽然过程遇到的坑不少,但好在最后坚持下来.目前系统全部运行稳定运行在k8s.虽然目前已经用netcore 码了不少业务代码,但总觉得很多新的语言特性.新的api没有使用到,为了学习netcore,决定做造一些简单的轮子,顺便学习下网络编程. 关于Rpc RPC(Remote Procedure Call)-远程过程调…