造轮子实现RPC框架_01_MyRPCFramework简介
项目简介: 造轮子实现"MyRPCFramework"框架
RPC介绍:
RPC是让客户端远程调用服务端方法 就像 调用本地方法一样简单的一种设计理念
一个最简单的 RPC 框架架构 :
技术要点: SPI+注册中心+Socket编程+享元模式+动态代理+反射
MyRPCFramework框架流程:
- 服务端集群 把自己能提供的服务 注册进ZooKeeper
- 客户端定义一个和服务端相同的接口, 然后生成这个接口的代理实现类, 代理负责(封装数据包, 拆解数据包, 访问ZooKeerper得到服务端ipList, 负载均衡选择一个ip进行访问)
- 服务端收到了客户端发的消息"调用xxx服务名的yyy方法", 然后通过反射调用具体实现类 去执行yyy方法, 再把返回值传给客户端
- 代理类收到返回值, 即完成了一次RPC调用
可见, 客户端只知道一个服务接口, 不知道具体实现类
项目需要改进的地方:
注册服务时使用SPI机制(服务发现机制)
使用享元设计模式 基于Thread(或Future)自定义一个线程池
补充负载均衡器的实现: 加权随机、加权轮循、哈希
轮询负载均衡时有分布式并发原子性安全问题, 可以使用ZooKeeper分布式锁
在访问ZooKeerper得到服务端ipList时, 若有某个ip不可用, 则进行跳过此ip 并将其移除ipList
链路追踪功能
把每一个 客户端访问者的ip+访问的服务+访问方法+访问时间+访问耗时 都记录下来, 基于AOP进行日志打印
如果访问耗时太久, 就记录到慢查询日志里
熔断功能, 若某个请求处理时长过长, 则进行服务熔断(基于Future实现的线程池有cancel方法, 可以进行终止正在运行的任务)
服务端使用阻塞队列接受客户端请求, 客户端请求带上priority字段
使用Netty作为通信框架
改进后, 项目亮点:
- 使用享元设计模式 基于Thread(或Future)自定义一个线程池
- 多种负载均衡器
- 多种序列化方式
- 自定义传输协议处理TCP粘包问题, 进行封包, 拆包
面试题:
为什么有了HTTP, 还要去用RPC?
二者不是同一个层级的东西, HTTP是网络协议, 而RPC是一种设计方案, 一种概念, 使调用远程API就像调本地方法一样简单便捷
为什么RPC不用HTTP而是去用TCP?
HTTP一般应用于 浏览器-服务端 的B/S架构, 为普通用户的浏览器 和 服务器 间提供通信, 用于对外的异构环境
TCP一般应用于 两台主机间Java进程间的通信, 用于公司内部的服务调用
空间占用:
HTTP1.1协议的TCP报文包含一些无用信息, 如: html标签,浏览器类型, 两台主机间Java进程间的通信 根本用不到这些东西
HTTP/1.0 200 OK Content-Type: text/plain Content-Length: 137582 Expires: Thu, 05 Dec 1997 16:00:00 GMT Last-Modified: Wed, 5 August 1996 15:55:28 GMT Server: Apache 0.84 <html> <body>Hello World</body> </html>
性能消耗:
HTTP,大部分是通过 json 来实现的,效率低些
TCP,可以基于各种序列化框架进行,效率高些
跨平台:
HTTP:通常要求 客户端和服务器 为统一平台
TCP: 可以在各种异构系统上运行
HTTP连接的开销:
增加了HTTP 连接的 建立 与 断开 的开销
造轮子实现RPC框架_01_MyRPCFramework简介相关推荐
- 上班拧螺丝的时候不小心空手造了个RPC框架,赶紧记录一下
缘起 最近在公司分享了手撸RPC,因此做一个总结. 概念篇 RPC 是什么? RPC 称远程过程调用(Remote Procedure Call),用于解决分布式系统中服务之间的调用问题. 通俗地讲, ...
- 【笔记-node】《Egg.js框架入门与实战》、《用 React+React Hook+Egg 造轮子 全栈开发旅游电商应用》
20210226-20210227:<Egg.js框架入门与实战> 课程地址:https://www.imooc.com/learn/1185 第一章 课程导学 01-01 课程介绍 一. ...
- 不是“重复”造轮子,百度飞桨框架2.0如何俘获人心
2016 年,百度 PaddlePaddle 打响了国产深度学习框架开源的第一枪. 2019 年 4 月,在 Wave Summit 深度学习开发者峰会上,首次发布了PaddlePaddle 的中文名 ...
- 动手造轮子:写一个日志框架
动手造轮子:写一个日志框架 Intro 日志框架有很多,比如 log4net / nlog / serilog / microsoft.extensions.logging 等,如何在切换日志框架的时 ...
- android tcp socket框架_socket网络编程知识梳理,让你学会造轮子的能力
在前面几篇中,我给大家介绍了socket的相关知识,也给出了详细的代码,从socket的基本介绍,到IO多路复用,以及粘包拆包,最后到心跳包问题.总的来说大概都把socket网络编程中能碰见的问题都讲 ...
- 走进Dubbo——RPC框架简介
前言 dubbo是阿里开源的分布式rpc框架,在许多中小企业的微服务化过程中发挥着核心作用.但是想把dubbo运行起来也不是那么简单的,这几天我想搭个dubbo环境玩玩,一路受阻. 相信前来了解rpc ...
- 【BSP视频教程】STM32H7视频教程第3期:整体捋顺STM32H7的HAL库和LL库的框架,再配合寄存器造轮子找到更适合自己的玩法(2022-01-21)
视频教程汇总帖:[学以致用,授人以渔]2022视频教程汇总贴,持续更新中,DSP更新到第1期,ThreadX更新到第2期,BSP驱动更新到第3期(2022-01-21) - STM32F429 - 硬 ...
- 【Vue3 造轮子项目 ------ kaite-ui】基于vue3.0 + vite + TypeScript 实现一个UI框架 - kaiteUI
基于vue3.0 + vite + TypeScript 实现一个UI框架 - kaiteUI 前言 前段时间笔者一直忙于学习Vue3方面新知识,比如如何从vue2.0版本过渡到vue3.0,如何理解 ...
- grpc框架_分布式RPC框架dubbo、motan、rpcx、gRPC、thrift简介与性能比较
Dubbo Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成.曾有一段时间放弃维护,不过当前 ...
最新文章
- Codeforces 448C Painting Fence:分治
- Android Hal层简要分析
- 传统与敏捷开发的真正区别
- 八年溯源,如何巧搭区块链
- uva 11572 ——Unique Snowflakes
- 《linux就该这么学》第六节,计划任务和用户身份管理!
- python的random模块怎么写_Python常用标准库之random模块
- 陆奇、雷军、熊晓鸽聊疫情后的创业风口
- Mybatis——动态SQL实现数据的增删改查
- C#几行代码让电脑蓝屏
- 石墨烯的精细结构研究取得进展
- 腾讯开源运维 PaaS 平台
- 计算机动画题目,3DMax2014计算机动画作业练习题
- 数据分析/运营——数据异常的排查方法
- backtrace和backtrace_symbols函数原理解析
- 深入浅出图神经网络|GNN原理解析☄学习笔记(四)表示学习
- 仅用 CSS 实现赛博朋克 2077 风格视觉效果
- 在图片上加播放按钮示例代码
- 马来西亚:央行与证监会联合实施数字货币与ICO监管
- # define xxxx(x,y) x##y引发的感想