rpc
文章平均质量分 84
老马啸西风
Github: https://github.com/houbb
Email:houbinbin.echo@gmail.com
展开
-
java 从零开始手写 RPC (00) 概览 overview
工作至今,接触 rpc 框架已经有很长时间。但是对于其原理一直只是知道个大概,从来没有深入学习过。以前一直想写,但由于各种原因被耽搁。原创 2024-03-04 09:16:35 · 2388 阅读 · 0 评论 -
java 从零开始手写 RPC (07)-timeout 超时处理
《过时不候》最漫长的莫过于等待我们不可能永远等一个人就像请求永远等待响应超时处理java 从零开始手写 RPC (01) 基于 socket 实现java 从零开始手写 RPC (02)-netty4 实现客户端和服务端java 从零开始手写 RPC (03) 如何实现客户端调用服务端?java 从零开始手写 RPC (04) 序列化java 从零开始手写 RPC (05) 基于反射的通用化实现必要性前面我们实现了通用的 rpc,但是存在一个问题,同步获取响应的时候没有超时处理。原创 2021-10-13 19:52:17 · 978 阅读 · 0 评论 -
java 从零开始手写 RPC (05) reflect 反射实现通用调用之服务端
通用调用java 从零开始手写 RPC (01) 基于 socket 实现java 从零开始手写 RPC (02)-netty4 实现客户端和服务端java 从零开始手写 RPC (03) 如何实现客户端调用服务端?java 从零开始手写 RPC (04) -序列化前面我们的例子是一个固定的出参和入参,固定的方法实现。本节将实现通用的调用,让框架具有更广泛的实用性。基本思路所有的方法调用,基于反射进行相关处理实现。服务端核心类RpcServer调整如下:serverBootst原创 2021-10-11 19:17:19 · 259 阅读 · 0 评论 -
java 从零开始手写 RPC (04) -序列化
序列化java 从零开始手写 RPC (01) 基于 socket 实现java 从零开始手写 RPC (02)-netty4 实现客户端和服务端java 从零开始手写 RPC (03) 如何实现客户端调用服务端?前面几节我们实现了最基础的客户端调用服务端,这一节来学习一下通讯中的对象序列化。为什么需要序列化netty 底层都是基于 ByteBuf 进行通讯的。前面我们通过编码器/解码器专门为计算的入参/出参进行处理,这样方便我们直接使用 pojo。但是有一个问题,如果想把我们的项目抽象为原创 2021-10-10 11:30:50 · 167 阅读 · 0 评论 -
java 从零开始手写 RPC (03) 如何实现客户端调用服务端?
说明java 从零开始手写 RPC (01) 基于 socket 实现java 从零开始手写 RPC (02)-netty4 实现客户端和服务端写完了客户端和服务端,那么如何实现客户端和服务端的调用呢?下面就让我们一起来看一下。接口定义计算方法package com.github.houbb.rpc.common.service;import com.github.houbb.rpc.common.model.CalculateRequest;import com.github.hou原创 2021-10-09 12:32:25 · 462 阅读 · 0 评论 -
java 从零开始手写 RPC (02)-netty4 实现客户端和服务端
说明上一篇代码基于 socket 的实现非常简单,但是对于实际生产,一般使用 netty。至于 netty 的优点可以参考:为什么选择 netty?http://houbb.github.io/2019/05/10/netty-definitive-gudie-04-why-netty代码实现maven 引入<dependency> <groupId>io.netty</groupId> <artifactId>netty-原创 2021-10-09 00:11:13 · 269 阅读 · 0 评论 -
java 从零开始手写 RPC (01) 基于 websocket 实现
RPC解决的问题正如上一讲所说,RPC 主要是为了解决的两个问题:解决分布式系统中,服务之间的调用问题。远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。完整流程其中左边的Client,对应的就是前面的Service A,而右边的Server,对应的则是Service B。下面一步一步详细解释一下。Service A的应用层代码中,调用了Calculator的一个实现类的add方法,希望执行一个加法运算;这个Calculator实现类,内部并不是直原创 2021-10-08 23:23:21 · 385 阅读 · 0 评论 -
从零开始手写 dubbo rpc 框架-14-interceptor-拦截器
拦截器说明有时候我们需要统计方法的耗时,需要知道统计出参/入参的相关信息。通过拦截器都可以非常方便的实现。设计思路无论是客户端还是服务端,只需要在方法执行前后,加入拦截器相关的方法调用,加入对应的上下文信息即可。客户端实现个人理解目前主要在客户端添加拦截器,其实服务端是类似的。接口public interface Interceptor { /** * 开始...原创 2019-11-02 10:00:58 · 14824 阅读 · 0 评论 -
从零开始手写 dubbo rpc 框架-13-gracefully-优雅关闭
generic 泛化调用说明泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 GenericService 调用所有服务实现。GenericService barService = (GenericService) applicationContext.getBea...原创 2019-11-02 09:58:57 · 14176 阅读 · 0 评论 -
从零开始手写 dubbo rpc 框架-12-generic-泛化调用
generic 泛化调用说明泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 GenericService 调用所有服务实现。GenericService barService = (GenericService) applicationContext.getBea...原创 2019-11-02 09:57:42 · 14516 阅读 · 0 评论 -
从零开始手写 dubbo rpc 框架-11-fail 失败策略
fail 失败策略说明当我们调用服务失败的时候,有很多策略。比如:FailFast快速失败FailOver尝试下一次调用等等其他各种策略。实现思路不同的失败策略方式只是处理失败的方式不同而已。这个主要放在客户端,当调用失败的时候,重新进行尝试即可。代码实现失败策略接口/** * 失败策略 * @author binbin.hou * @since 0.1....原创 2019-11-02 09:42:03 · 14561 阅读 · 0 评论 -
从零开始手写 dubbo rpc 框架-10-callType 调用方式
callType 调用方式说明不同的场景我们会希望有不同的调用方式。常见的有三种调用方式:(1)sync 同步调用(2)async 异步调用(3)oneWay 单向调用个人感觉(1)(3)是最常见的需求,所以本次优先实现了这两种。实现思路不同的调用方式只是处理的行为不同而已。可以将这个配置传递,分别在 client/server 的端进行相应的处理。客户端实现调用方式策略...原创 2019-11-02 09:37:56 · 14767 阅读 · 0 评论 -
从零开始手写 dubbo rpc 框架-09-load balance 负载均衡
load balance当我们有多个服务端时,就需要负载均衡进行选择。策略负载均衡的策略有很多,比如随机选择,权重选择,最小负载等等。实现思路直接将所有可以选择的服务端列举出来,通过实现对应的策略,选择一个即可。实现代码随机选择此处演示的是非常简单的随机选择策略:public class RandomBalanceFilter implements RpcFilter { ...原创 2019-11-01 21:51:16 · 14219 阅读 · 0 评论 -
从零开始手写 dubbo rpc 框架-08-register注册中心
register 注册中心需求服务的注册与发现,是一个很常见也很有用的需求。可以让我们不关心服务端的 ip 信息,只关心服务本身。思路实现的方式SimpleRpcRegister 为 rpc 提供的默认实现方案。实际可以结合 redis,zk 等常见的成熟框架实现。其实可以把 register 当做是服务端,此时的 server/client 都是客户端。实现的策略时类似的。当...原创 2019-11-01 17:44:26 · 14524 阅读 · 0 评论 -
从零开始手写 dubbo rpc 框架-07-timeout客戶端超时检测
timeout 超时处理我们调用外部服务,不可能一直等待。当外部的调用超过指定的时间后,就直接报错,避免无意义的资源消耗。核心实现思路调用的时候,将开始时间保留。获取的时候检测是否超时。同时创建一个线程,用来检测是否有超时的请求。超时检测线程import com.github.houbb.heaven.util.common.ArgUtil;import com.github....原创 2019-11-01 17:12:19 · 14285 阅读 · 0 评论 -
从零开始手写 dubbo rpc 框架-06-通用客户端调用服务端
通用调用前面我们的例子是一个固定的出参和入参,固定的方法实现。本节将实现通用的调用,让框架具有更高的实用性。基本思路所有的方法调用,基于反射进行相关处理实现。测试代码服务端服务依赖<dependency> <groupId>com.github.houbb</groupId> <artifactId>rpc-serve...原创 2019-11-01 16:28:30 · 14367 阅读 · 0 评论 -
从零开始手写 dubbo rpc 框架-05-serial 序列化
序列化为什么需要序列化netty 底层都是基于 ByteBuf 进行通讯的。前面我们通过编码器/解码器专门为计算的入参/出参进行处理,这样方便我们直接使用 pojo。但是有一个问题,如果想把我们的项目抽象为框架,那就需要为所有的对象编写编码器/解码器。显然,直接通过每一个对象写一对的方式是不现实的,而且用户如何使用,也是未知的。序列化的方式基于字节的实现,性能好,可读性不高。基于字...原创 2019-11-01 15:19:09 · 14210 阅读 · 0 评论 -
从零开始手写 dubbo rpc 框架-04-p2p客户端主动调用服务端
p2p 客户端主动调用我们上一章的例子中,我们的调用是在客户端启动的时候完成的。实际使用中,我们希望调用可以有客户端主动发起。客户端代码RpcClient.java通过 calculate 方法,我们就可以主动发起请求。import com.github.houbb.log.integration.core.Log;import com.github.houbb.log.integr...原创 2019-11-01 14:54:33 · 14326 阅读 · 0 评论 -
从零开始手写 dubbo rpc 框架-03-客户端调用服务端
服务对象调用功能实现 Client 端到服务端之间的固定服务 pojo 调用。接口服务我们希望实现一个计算功能。public interface Calculator { /** * 计算加法 * @param request 请求入参 * @return 返回结果 */ CalculateResponse sum(final ...原创 2019-11-01 14:27:57 · 14288 阅读 · 0 评论 -
从零开始手写 dubbo rpc 框架-02-客户端启动
客户端启动功能实现 client 端服务启动。核心代码简单的一个 netty client 端启动代码。import com.github.houbb.log.integration.core.Log;import com.github.houbb.log.integration.core.LogFactory;import com.github.houbb.rpc.client.h...原创 2019-11-01 14:04:36 · 14217 阅读 · 0 评论 -
从零开始手写 dubbo rpc 框架-01-服务端启动
服务端启动功能实现 server 端服务启动。maven 依赖<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.17.Final</version><...原创 2019-11-01 14:02:39 · 14339 阅读 · 0 评论 -
从零开始手写 dubbo rpc 框架-00-序章
rpcrpc 是基于 netty 实现的 java rpc 框架,类似于 dubbo。主要用于个人学习,由渐入深,理解 rpc 的底层实现原理。前言工作至今,接触 rpc 框架已经有很长时间。但是对于其原理一直只是知道个大概,从来没有深入学习过。以前一直想写,但由于各种原因被耽搁。技术准备Java 并发实战学习TCP/IP 协议学习笔记Netty 权威指南学习这些技术的准备阶...原创 2019-11-01 13:36:53 · 14471 阅读 · 0 评论