java 从零开始手写 RPC (00) 概览 overview

rpc

rpc 是基于 netty 实现的 java rpc 框架,类似于 dubbo。

主要用于个人学习,由渐入深,理解 rpc 的底层实现原理。

特性

  • 基于 netty4 的客户端调用服务端

  • p2p 调用

  • serial 序列化支持

  • timeout 超时处理

  • register center 注册中心

  • load balance 负载均衡

  • callType 支持 oneway sync 等调用方式

  • fail 支持 failOver failFast 等失败处理策略

  • generic 支持泛化调用

  • gracefully 优雅关闭

  • rpcInterceptor 拦截器

  • filter 过滤器

  • check 客户端启动检测服务是否可用

  • heartbeat 服务端心跳

快速入门

maven 引入

<dependency><groupId>com.github.houbb</groupId><artifactId>rpc-all</artifactId><version>${rpc.version}</version>
</dependency>

ps: 如果本地 p2p 测试,register 注册中心可选。

测试

注册中心

RegisterBs.newInstance().start();

服务端

ServiceBs.getInstance().register(ServiceIdConst.CALC, new CalculatorServiceImpl()).registerCenter(ServiceIdConst.REGISTER_CENTER).expose();

客户端

// 服务配置信息
ReferenceConfig<CalculatorService> config = ClientBs.newInstance();
config.serviceId(ServiceIdConst.CALC);
config.serviceInterface(CalculatorService.class);
// 自动发现服务
config.subscribe(true);
config.registerCenter(ServiceIdConst.REGISTER_CENTER);
// 拦截器测试
config.rpcInterceptor(new CostTimeInterceptor());CalculatorService calculatorService = config.reference();
CalculateRequest request = new CalculateRequest();
request.setOne(10);
request.setTwo(20);CalculateResponse response = calculatorService.sum(request);
System.out.println(response);

前言

工作至今,接触 rpc 框架已经有很长时间。

但是对于其原理一直只是知道个大概,从来没有深入学习过。

以前一直想写,但由于各种原因被耽搁。

技术准备

Java 并发实战学习

TCP/IP 协议学习笔记

Netty 权威指南学习

这些技术的准备阶段,花费了比较长的时间。

也建议想写 rpc 框架的有相关的知识储备。

其他 rpc 框架使用的经验此处不再赘述。

快速迭代

原来一直想写 rpc,却不行动的原因就是想的太多,做的太少。

想一下把全部写完,结果就是啥都没写。

所以本次的开发,每个代码分支做的事情实际很少,只做一个功能点。

陆陆续续经过近一个月的完善,对 rpc 框架有了自己的体会和进一步的认知。

代码实现功能,主要参考 Apache Dubbo

文档

文档

文档将使用 markdown 文本的形式,补充 code 层面没有的东西。

代码注释

代码有详细的注释,便于阅读和后期维护。

测试

目前测试代码算不上完善。后续将陆续补全。

rpc 模块

模块说明
rpc-common公共代码
rpc-register注册中心
rpc-server服务端
rpc-client客户端
rpc-all全部引用模块(简化包引用)

代码分支

release_0.0.1-server 服务端启动

release_0.0.2-client 客户端启动

release_0.0.3-客户端调用服务端

release_0.0.4-p2p 客户端主动调用服务端

release_0.0.5-serial 序列化

release_0.0.6-通用的反射调用

release_0.0.7-timeout 超时处理

release_0.0.8-register 注册中心

release_0.0.9-load balance 负载均衡

release_0.1.0-callType 调用方式

release_0.1.1-fail 失败策略

release_0.1.2-generic 泛化调用

release_0.1.3-gracefully 优雅关闭

release_0.1.4-rpcInterceptor 拦截器

文档说明

0.0.1-server 服务端启动

0.0.2-client 客户端启动

0.0.3-客户端调用服务端

0.0.4-p2p 客户端主动调用服务端

0.0.5-serial 序列化

0.0.6-通用反射调用

0.0.7-timeout 超时处理

0.0.8-register 注册中心

0.0.9-load balance 负载均衡

0.1.0-callType 调用方式

0.1.1-fail 失败策略

0.1.2-generic 泛化调用

0.1.3-gracefully 优雅关闭

0.1.4-rpcInterceptor 拦截器

测试代码

从 v0.0.6 及其之后,为了让代码保持纯净,将测试代码全部放在 rpc-example。

每个测试代码和实现版本一一对应。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/729017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

retinaNet FocalLoss源码详解

targets[positive_indices, assigned_annotations[positive_indices, 4].long()] 1 ## 把正样本所对应的锚框所对应的类别的列置为1 # aim torch.randint(0, 1, (1, 80)) # tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, # 0…

react tab选项卡吸顶实现

react tab选项卡吸顶实现&#xff0c;直接上代码&#xff08;代码有注释&#xff09; tsx代码 /* eslint-disable react-hooks/exhaustive-deps */ import React, { useEffect, useState } from "react"; import DocumentTitle from react-document-title import s…

智奇科技工业 Linux 屏更新开机logo

智奇科技工业 Linux 屏更新开机logo 简介制作logo.img文件1、转换格式得到logo.bmp2、使用Linux命令生成img文件 制作rootfs.img文件替换rootfs.img中的logo 生成update.img固件附件 简介 智奇科技的 Linux 屏刷开机logo必须刷img镜像文件&#xff0c;比较复杂。 制作logo.i…

Python教程,python从入门到精通 第1天 温习笔记

1.1 字面量 1.2 注释 1.3 变量 1.4 数据类型 1.5 数据类型转换 1.6 标识符 1.7 运算符 1.8 字符串的三种定义方式 1.9 字符串拼接 1.10 字符串格式化 1.11 掌握格式化字符串的过程中做数字的精度控制 1.12 掌握快速字符串格式化的方式 1.13 字符串格式化&#xff0d;表达式的格…

《MySQL实战45讲》课程大纲

1MySQL实战45讲-01基础架构&#xff1a;一条SQL查询语句是如何执行的&#xff1f;2MySQL实战45讲-02日志系统&#xff1a;一条SQL更新语句是如何执行的&#xff1f;3MySQL实战45讲-03事务隔离&#xff1a;为什么你改了我还看不见&#xff1f;4MySQL实战45讲-04深入浅出索引&…

【C++干货基地】六大默认成员函数: This指针 | 构造函数 | 析构函数

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

Redis冲冲冲——redis数据类型及对应的数据结构

目录 引出redis数据类型及对应的数据结构Redis入门1.Redis是什么&#xff1f;2.Redis里面存Java对象 Redis进阶1.雪崩/ 击穿 / 穿透2.Redis高可用-主从哨兵3.持久化RDB和AOF4.Redis未授权访问漏洞5.Redis里面安装BloomFilte Redis的应用1.验证码2.Redis高并发抢购3.缓存预热用户…

PaddleOCR识别框架解读[07] 文本检测

文章目录 1. 准备数据和模型1.1 准备数据集1.2 下载预训练模型2. 开始训练2.1 启动训练2.2 断点训练2.3 更换Backbone 训练2.4 混合精度训练2.5 分布式训练2.6 知识蒸馏训练2.7 其他训练环境2.8 模型微调3. 模型评估与预测3.1 指标评估3.2 测试检测效果4. 模型

SpringCloud 服务的注册与发现

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第二篇&#xff0c;即使用服务注册和发现的组件&#xff0c;此篇文章会介绍 Eureka、Zookeeper 和 Consu…

环境音效生成器Moodist

什么是 Moodist &#xff1f; Moodist 是免费、开源的环境音效生成器。拥有 54 种精选的音效&#xff0c;轻松为专注或放松创建自定义混合音效。无需账户&#xff0c;无需繁琐操作&#xff0c;尽享纯净宁静。探索大自然的宁静和城市的韵律。在 Moodist 中提升你的氛围&#xff…

Node 旧淘宝源 HTTPS 过期处理

今天拉取老项目更新依赖&#xff0c;出现 urlshttps%3A%2F%2Fregistry.npm.taobao.org%2Fegg-logger%2Fdownload%2Fegg-logger-2.6.1.tgz: certificate has expired 类似报错。即使删除 node_modules 重新安装&#xff0c;问题依然无法解决。 一、问题演示 二、原因分析 1、淘…

平台工程指南:从架构构建到职责分工

平台工程只是 DevOps 专业化的另一个术语&#xff0c;还是另有所指&#xff1f;事实可能介于两者之间。DevOps 及其相关的 DevXOps 有着浓厚的文化色彩&#xff0c;以各个团队为中心。不幸的是&#xff0c;在许多地方&#xff0c;DevOps 引发了新的问题&#xff0c;如工具激增和…

【云原生】kubeadm快速搭建K8s集群Kubernetes1.19.0

目录 一、 Kubernetes 的概述 二、服务器配置 2.1 服务器部署规划 2.2服务器初始化配置 三、安装Docker/kubeadm/kubelet【所有节点】 3.1 安装Docker 3.2 添加阿里云YUM软件源 3.3 安装kubeadm&#xff0c;kubelet和kubectl 四、部署Kubernetes Master 五、部署Kube…

网络入侵检测系统之Suricata(十四)--匹配流程

其实规则的匹配流程和加载流程是强相关的&#xff0c;你如何组织规则那么就会采用该种数据结构去匹配&#xff0c;例如你用radix tree组织海量ip规则&#xff0c;那么匹配的时候也是采用bit test确定前缀节点&#xff0c;然后逐一左右子树查询&#xff0c;Suricata也是如此&…

Vue 3 中的 ref 和 reactive 有什么区别?

Vue 3 中的 ref 和 reactive 有什么区别&#xff1f; Vue 3 引入了 Composition API&#xff0c;作为对传统 Options API 的补充。在 Composition API 中&#xff0c;ref 和 reactive 是两个核心的函数&#xff0c;用于创建响应式数据。虽然它们的目标都是使数据变得响应式&am…

程序员选择职业赛道2024

程序员如何选择职业赛道&#xff1f; 程序员的职业赛道就像是一座迷宫&#xff0c;有前端的美丽花园&#xff0c;后端的黑暗洞穴&#xff0c;还有数据科学的神秘密室。你准备好探索这个充满挑战和机遇的迷宫了吗&#xff1f;快来了解如何选择职业赛道吧&#xff01; 方向一&a…

基于Spring Boot的图书个性化推荐系统 ,计算机毕业设计(带源码+论文)

源码获取地址&#xff1a; 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1765769136268455938

Doris实战——特步集团零售数据仓库项目实践

目录 一、背景 二、总体架构 三、ETL实践 3.1 批量数据的导入 3.2 实时数据接入 3.3 数据加工 3.4 BI 查询 四、实时需求响应 五、其他经验 5.1 Doris BE内存溢出 5.2 SQL任务超时 5.3 删除语句不支持表达式 5.4 Drop 表闪回 六、未来展望 原文大佬的这篇Doris数…

探索macOS上的最佳MySQL客户端工具

在数据库管理和开发的世界里&#xff0c;选择一个高效、功能全面的客户端工具对于提升工作效率至关重要。尤其对于使用 macOS 的开发者来说&#xff0c;一个好的 MySQL 客户端不仅可以简化数据库操作&#xff0c;还能提供强大的数据分析和管理功能。本文将介绍几款适用于 macOS…

离散数学——(3)联结词及对应的真值指派,最小全功能联结词集,对偶式,范式,范式存在定理,小项

目录 1.联结词及对应的真值指派 2.最小全功能联结词集 3.对偶式 4.范式 1.析取范式 5.范式存在定理 6.小项 1.联结词及对应的真值指派 2.最小全功能联结词集 3.对偶式 4.范式 1.析取范式 5.范式存在定理 6.小项