项目简介: 造轮子实现"MyRPCFramework"框架

RPC介绍:

RPC是让客户端远程调用服务端方法 就像 调用本地方法一样简单的一种设计理念

一个最简单的 RPC 框架架构 :

技术要点: SPI+注册中心+Socket编程+享元模式+动态代理+反射

MyRPCFramework框架流程:

  1. 服务端集群 把自己能提供的服务 注册进ZooKeeper
  2. 客户端定义一个和服务端相同的接口, 然后生成这个接口的代理实现类, 代理负责(封装数据包, 拆解数据包, 访问ZooKeerper得到服务端ipList, 负载均衡选择一个ip进行访问)
  3. 服务端收到了客户端发的消息"调用xxx服务名的yyy方法", 然后通过反射调用具体实现类 去执行yyy方法, 再把返回值传给客户端
  4. 代理类收到返回值, 即完成了一次RPC调用
    可见, 客户端只知道一个服务接口, 不知道具体实现类

项目需要改进的地方:

  1. 注册服务时使用SPI机制(服务发现机制)

  2. 使用享元设计模式 基于Thread(或Future)自定义一个线程池

  3. 补充负载均衡器的实现: 加权随机、加权轮循、哈希

  4. 轮询负载均衡时有分布式并发原子性安全问题, 可以使用ZooKeeper分布式锁

  5. 在访问ZooKeerper得到服务端ipList时, 若有某个ip不可用, 则进行跳过此ip 并将其移除ipList

  6. 链路追踪功能

    把每一个 客户端访问者的ip+访问的服务+访问方法+访问时间+访问耗时 都记录下来, 基于AOP进行日志打印

    如果访问耗时太久, 就记录到慢查询日志里

  7. 熔断功能, 若某个请求处理时长过长, 则进行服务熔断(基于Future实现的线程池有cancel方法, 可以进行终止正在运行的任务)

  8. 服务端使用阻塞队列接受客户端请求, 客户端请求带上priority字段

  9. 使用Netty作为通信框架

改进后, 项目亮点:

  1. 使用享元设计模式 基于Thread(或Future)自定义一个线程池
  2. 多种负载均衡器
  3. 多种序列化方式
  4. 自定义传输协议处理TCP粘包问题, 进行封包, 拆包

面试题:

为什么有了HTTP, 还要去用RPC?

二者不是同一个层级的东西, HTTP是网络协议, 而RPC是一种设计方案, 一种概念, 使调用远程API就像调本地方法一样简单便捷

为什么RPC不用HTTP而是去用TCP?

HTTP一般应用于 浏览器-服务端 的B/S架构, 为普通用户的浏览器 和 服务器 间提供通信, 用于对外的异构环境

TCP一般应用于 两台主机间Java进程间的通信, 用于公司内部的服务调用

  1. 空间占用:

    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>
    
  2. 性能消耗:

    HTTP,大部分是通过 json 来实现的,效率低些

    TCP,可以基于各种序列化框架进行,效率高些

  3. 跨平台

    HTTP:通常要求 客户端和服务器 为统一平台

    TCP: 可以在各种异构系统上运行

  4. HTTP连接的开销:

    增加了HTTP 连接的 建立 与 断开 的开销

造轮子实现RPC框架_01_MyRPCFramework简介相关推荐

  1. 上班拧螺丝的时候不小心空手造了个RPC框架,赶紧记录一下

    缘起 最近在公司分享了手撸RPC,因此做一个总结. 概念篇 RPC 是什么? RPC 称远程过程调用(Remote Procedure Call),用于解决分布式系统中服务之间的调用问题. 通俗地讲, ...

  2. 【笔记-node】《Egg.js框架入门与实战》、《用 React+React Hook+Egg 造轮子 全栈开发旅游电商应用》

    20210226-20210227:<Egg.js框架入门与实战> 课程地址:https://www.imooc.com/learn/1185 第一章 课程导学 01-01 课程介绍 一. ...

  3. 不是“重复”造轮子,百度飞桨框架2.0如何俘获人心

    2016 年,百度 PaddlePaddle 打响了国产深度学习框架开源的第一枪. 2019 年 4 月,在 Wave Summit 深度学习开发者峰会上,首次发布了PaddlePaddle 的中文名 ...

  4. 动手造轮子:写一个日志框架

    动手造轮子:写一个日志框架 Intro 日志框架有很多,比如 log4net / nlog / serilog / microsoft.extensions.logging 等,如何在切换日志框架的时 ...

  5. android tcp socket框架_socket网络编程知识梳理,让你学会造轮子的能力

    在前面几篇中,我给大家介绍了socket的相关知识,也给出了详细的代码,从socket的基本介绍,到IO多路复用,以及粘包拆包,最后到心跳包问题.总的来说大概都把socket网络编程中能碰见的问题都讲 ...

  6. 走进Dubbo——RPC框架简介

    前言 dubbo是阿里开源的分布式rpc框架,在许多中小企业的微服务化过程中发挥着核心作用.但是想把dubbo运行起来也不是那么简单的,这几天我想搭个dubbo环境玩玩,一路受阻. 相信前来了解rpc ...

  7. 【BSP视频教程】STM32H7视频教程第3期:整体捋顺STM32H7的HAL库和LL库的框架,再配合寄存器造轮子找到更适合自己的玩法(2022-01-21)

    视频教程汇总帖:[学以致用,授人以渔]2022视频教程汇总贴,持续更新中,DSP更新到第1期,ThreadX更新到第2期,BSP驱动更新到第3期(2022-01-21) - STM32F429 - 硬 ...

  8. 【Vue3 造轮子项目 ------ kaite-ui】基于vue3.0 + vite + TypeScript 实现一个UI框架 - kaiteUI

    基于vue3.0 + vite + TypeScript 实现一个UI框架 - kaiteUI 前言 前段时间笔者一直忙于学习Vue3方面新知识,比如如何从vue2.0版本过渡到vue3.0,如何理解 ...

  9. grpc框架_分布式RPC框架dubbo、motan、rpcx、gRPC、thrift简介与性能比较

    Dubbo Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成.曾有一段时间放弃维护,不过当前 ...

最新文章

  1. Codeforces 448C Painting Fence:分治
  2. Android Hal层简要分析
  3. 传统与敏捷开发的真正区别
  4. 八年溯源,如何巧搭区块链
  5. uva 11572 ——Unique Snowflakes
  6. 《linux就该这么学》第六节,计划任务和用户身份管理!
  7. python的random模块怎么写_Python常用标准库之random模块
  8. 陆奇、雷军、熊晓鸽聊疫情后的创业风口
  9. Mybatis——动态SQL实现数据的增删改查
  10. C#几行代码让电脑蓝屏
  11. 石墨烯的精细结构研究取得进展
  12. 腾讯开源运维 PaaS 平台
  13. 计算机动画题目,3DMax2014计算机动画作业练习题
  14. 数据分析/运营——数据异常的排查方法
  15. backtrace和backtrace_symbols函数原理解析
  16. 深入浅出图神经网络|GNN原理解析☄学习笔记(四)表示学习
  17. 仅用 CSS 实现赛博朋克 2077 风格视觉效果
  18. 在图片上加播放按钮示例代码
  19. 马来西亚:央行与证监会联合实施数字货币与ICO监管
  20. # define xxxx(x,y) x##y引发的感想

热门文章

  1. Dell 服务器重装Windows Server 2016 系统教程
  2. 0xc0000142应用程序无法正常启动
  3. Discuz论坛附件下载权限绕过漏洞
  4. 攻防世界 web高手进阶区 10分题 weiphp
  5. uniapp 配置 底部 TabBar
  6. virtual 关键字
  7. Data Analysis - Day9 - Numpy Functions
  8. 大明:讲解硬盘ESP分区和MSR分区有什么用?值得收藏
  9. 抖音现在做的竞价推广都是怎么操作的?
  10. Unity2019中的android动态申请权限(Permissions)