从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理

这篇具有很好参考价值的文章主要介绍了从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通过这个简易的轮子,你可以学到 RPC 的底层原理和原理以及各种 Java 编码实践的运用。

你甚至可以把这个当做你的毕设/项目经验的选择,这是非常不错!对比其他求职者的项目经验都是各种系统,造轮子肯定是更加能赢得面试官的青睐。

介绍


这是一款基于 Netty+Kyro+Zookeeper 实现的 RPC 框架。代码注释详细,结构清晰,并且集成了 Check Style 规范代码结构,非常适合阅读和学习。

我们先从一个基本的 RPC 框架设计思路说起!

一个基本的 RPC 框架设计思路

注意 :我们这里说的 RPC 框架指的是:可以让客户端直接调用服务端方法就像调用本地方法一样简单的框架,比如我前面介绍的 Dubbo、Motan、gRPC 这些。如果需要和 HTTP 协议打交道,解析和封装 HTTP 请求和响应。这类框架并不能算是“RPC 框架”,比如 Feign。

一个最简单的 RPC 框架使用示意图如下图所示,这也是 guide-rpc-framework 目前的架构 :

从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理,2024年程序员学习,zookeeper,rpc,面试

服务提供端 Server 向注册中心注册服务,服务消费者 Client 通过注册中心拿到服务相关信息,然后再通过网络请求服务提供端 Server。

作为 RPC 框架领域的佼佼者Dubbo的架构如下图所示,和我们上面画的大体也是差不多的。

从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理,2024年程序员学习,zookeeper,rpc,面试

一般情况下, RPC 框架不仅要提供服务发现功能,还要提供负载均衡、容错等功能,这样的 RPC 框架才算真正合格的。

简单说一下设计一个最基本的 RPC 框架的思路:

从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理,2024年程序员学习,zookeeper,rpc,面试

  1. 注册中心 :注册中心首先是要有的,推荐使用 Zookeeper。注册中心负责服务地址的注册与查找,相当于目录服务。服务端启动的时候将服务名称及其对应的地址(ip+port)注册到注册中心,服务消费端根据服务名称找到对应的服务地址。有了服务地址之后,服务消费端就可以通过网络请求服务端了。

  2. 网络传输 :既然要调用远程的方法就要发请求,请求中至少要包含你调用的类名、方法名以及相关参数吧!推荐基于 NIO 的 Netty 框架。

  3. 序列化 :既然涉及到网络传输就一定涉及到序列化,你不可能直接使用 JDK 自带的序列化吧!JDK 自带的序列化效率低并且有安全漏洞。所以,你还要考虑使用哪种序列化协议,比较常用的有 hession2、kyro、protostuff。

  4. 动态代理 :另外,动态代理也是需要的。因为 RPC 的主要目的就是让我们调用远程方法像调用本地方法一样简单,使用动态代理可以屏蔽远程方法调用的细节比如网络传输。也就是说当你调用远程方法的时候,实际会通过代理对象来传输网络请求,不然的话,怎么可能直接就调用到远程方法呢?

  5. 负载均衡 :负载均衡也是需要的。为啥?举个例子我们的系统中的某个服务的访问量特别大,我们将这个服务部署在了多台服务器上,当客户端发起请求的时候,多台服务器都可以处理这个请求。那么,如何正确选择处理该请求的服务器就很关键。假如,你就要一台服务器来处理该服务的请求,那该服务部署在多台服务器的意义就不复存在了。负载均衡就是为了避免单个服务器响应同一请求,容易造成服务器宕机、崩溃等问题,我们从负载均衡的这四个字就能明显感受到它的意义。

项目基本情况和可优化点

为了循序渐进,最初的是时候,我是基于传统的 BIO 的方式 Socket 进行网络传输,然后利用 JDK 自带的序列化机制 来实现这个 RPC 框架的。后面,我对原始版本进行了优化,已完成的优化点和可以完成的优化点我都列在了下面 👇。

为什么要把可优化点列出来? 主要是想给那些希望优化这个 RPC 框架的小伙伴一点思路。欢迎大家 fork 本仓库,然后自己进行优化。

从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理,2024年程序员学习,zookeeper,rpc,面试

项目模块概览

从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理,2024年程序员学习,zookeeper,rpc,面试

运行项目


导入项目

fork 项目到自己的仓库,然后克隆项目到自己的本地:git clone git@github.com:username/guide-rpc-framework.git,使用 IDEA 打开,等待项目初始化完成。

初始化 git hooks

这一步主要是为了在 commit 代码之前,跑 Check Style,保证代码格式没问题,如果有问题的话就不能提交。

以下演示的是 Mac/Linux 对应的操作,Window 用户需要手动将 config/git-hooks 目录下的pre-commit 文件拷贝到 项目下的 .git/hooks/ 目录。

执行下面这些命令:

➜ guide-rpc-framework git:(master) ✗ chmod +x ./init.sh

➜ guide-rpc-framework git:(master) ✗ ./init.sh

init.sh 这个脚本的主要作用是将 git commit 钩子拷贝到项目下的 .git/hooks/ 目录,这样你每次 commit 的时候就会执行了。

CheckStyle 插件下载和配置

IntelliJ IDEA-> Preferences->Plugins->搜索下载 CheckStyle 插件,然后按照如下方式进行配置。

从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理,2024年程序员学习,zookeeper,rpc,面试

配置完成之后,按照如下方式使用这个插件!

从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理,2024年程序员学习,zookeeper,rpc,面试

下载运行 zookeeper

这里使用 Docker 来下载安装。

下载:

docker pull zookeeper:3.5.8

运行:

docker run -d --name zookeeper -p 2181:2181 zookeeper:3.5.8

使用


服务提供端

实现接口:

@Slf4j

@RpcService(group = “test1”, version = “version1”)

public class HelloServiceImpl implements HelloService {

static {

System.out.println(“HelloServiceImpl被创建”);

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理,2024年程序员学习,zookeeper,rpc,面试
从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理,2024年程序员学习,zookeeper,rpc,面试
从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理,2024年程序员学习,zookeeper,rpc,面试
从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理,2024年程序员学习,zookeeper,rpc,面试
从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理,2024年程序员学习,zookeeper,rpc,面试
从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理,2024年程序员学习,zookeeper,rpc,面试

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理,2024年程序员学习,zookeeper,rpc,面试

06688604)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-RJ5w3P0K-1712806688605)]文章来源地址https://www.toymoban.com/news/detail-851796.html

到了这里,关于从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 配置安装Git,使用Gitee仓库(手把手从无到有)

    首先 Git 是什么? Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 点击下载Git(Windows版本) 1、打开下载链接之后,点击图中箭头所指,即可下载最新版本的 Git 注意:由于是国外网站,下载速度有很大问题,这里提供一个国内镜像下载站

    2024年02月10日
    浏览(52)
  • 微信小程序,https要求,从无到有全过程,总共就八步

    以下教程中出现的截图,均是以下环境 服务器:阿里云 域名购买:阿里云 服务器操作系统:linux 1.腾讯云 2.阿里云 3.某某云 这里是哪一个不重要,现在服务器都很成熟,谁便宜买谁,最好装linux系统的 在哪里买的服务器最好就在哪里买域名 小程序是强行需要https的访问的,

    2024年02月03日
    浏览(35)
  • 从无到有:AI绘画API在插画与游戏设计中的应用

    引言 随着人工智能技术的快速发展,AI绘画API已经逐渐成为插画和游戏设计领域的新宠。这些API能够将创意与技术完美结合,帮助设计师快速生成高质量的图像,为插画和游戏产业带来了巨大的变革。 AI绘画API的工作原理 AI绘画API基于深度学习和神经网络技术,通过对大量图

    2024年02月02日
    浏览(29)
  • matlab从无到有系列(九):Simulink基础仿真详解(全网最全,从入门到放弃)

    🔗 运行环境:Matlab 🚩 作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 📚 选自专栏:《数学建模》 🧿 优秀专栏:《Matlab神经网络案例分析》 目前持续更新的专栏: 🥇 专栏:Matlab GUI编程技巧 🔥 专栏:

    2024年02月02日
    浏览(30)
  • Ubuntu下载kamailio源码并配置实现VoIP服务器(一条龙服务,从无到有的搭建)

    1、安装Kamailio依赖包 打开终端,并运行以下命令以安装 Kamailio 的依赖软件包: sudo apt update sudo apt install bison flex libssl-dev libxml2-dev libcurl4-openssl-dev libpcre3-dev libjson-c-dev libyaml-dev libsystemd-dev pkg-config 2、下载github并从github下载源码 1 )下载 github sudo apt update sudo apt install git 2 )下

    2024年02月04日
    浏览(41)
  • Windows的Mysql5.7社区版的安装详细操作,从无到有,安装配置一条龙服务。(压缩包自行安装,非installer安装)

    换了一个电脑,所有软件、环境都得重新来安装一次,安装到Mysql的时候,发现网上有两种安装方式,一种是Mysql的压缩包安装方式,这种方式直接到官网下载Mysql的压缩包,解压之后做些配置就可以了,另一种是Mysql的Installer一站式的安装,这种方法步骤相对来说少点,但是

    2024年02月03日
    浏览(32)
  • 途游游戏 x 极狐GitLab “通关” DevOps :单元测试从无到优,覆盖率 0→80%

    目录 4 个工具孤岛 → 极狐GitLab 全家桶, 被动的「人找进度」 → 高效的「进度找人」 把 Code Review 做扎实 代码质量「向左移」,修复成本「往下降」 从无到「优」 自动执行单元测试,覆盖率 0→80% 你喜欢玩游戏吗? 最近在玩什么游戏? 你是哪款游戏的“死忠粉”呢? 人

    2024年02月13日
    浏览(44)
  • 基于Netty实现一个HTTP服务器

    一、序言 Netty因其易编程,高可靠性,高性能的网络IO,在分布式开发中被广泛用于网络通信,比如RocketMQ,Dubbo底层都能看到Netty的身影,高性能的本质是其Reactor线程模型以及异步的编程处理。Reactor有三种模型,常用的有主从 Reactor多线程模式,具体表现如下: 在日常开发中

    2023年04月25日
    浏览(38)
  • 手写RPC框架--5.Netty业务逻辑

    RPC框架-Gitee代码(麻烦点个Starred, 支持一下吧) RPC框架-GitHub代码(麻烦点个Starred, 支持一下吧) 1.在 DcyRpcBootstrap 类的 start() 方法中加入netty代码 (待完善) 2.在 ReferenceConfig 类的 get() 方法中加入netty代码 (待完善) 每次启动程序都会建立一个新的Netty连接,显示是对不合适的 解决方案

    2024年02月09日
    浏览(33)
  • C++ 手写一个线程池

    本专栏已在我的个人站点中完成更新升级,可点击这里直达。 本专栏不再更新,不要购买!如有需要,请前往我的自建站点中购买, 价格更实惠 、 内容更丰富 、 并且继续保持更新 。 已购买该专栏的同学,可点击这里查看后续调整方案。 更多说明,可点击这里查看。

    2024年02月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包