前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手写RPC框架指北另送贴心注释代码一套

手写RPC框架指北另送贴心注释代码一套

作者头像
全菜工程师小辉
发布2019-08-16 09:59:50
6350
发布2019-08-16 09:59:50
举报
文章被收录于专栏:后端开发你必须学会的干货

Angular8正式发布了,Java13再过几个月也要发布了,技术迭代这么快,框架的复杂度越来越大,但是原理是基本不变的。所以沉下心看清代码本质很重要,这次给大家带来的是手写RPC框架。

完整代码以及说明文档,链接如下:

https://github.com/y277an/java-you-need-know

1. 什么是RPC?

RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

RPC框架有很多,比较知名的如阿里的Dubbo、google的gRPC、Go语言的rpcx、Apache的thrift,新浪的motan等等。当然了,你也可以说Dubbo是RPC框架的超集,此外对于Spring Cloud来说,RPC也只是它的一个功能模块。(话说Dubbo已经晋升为Apache顶级项目了,还不一起动手学习下?)

RPC要解决的两个问题:

  1. 解决分布式系统中,服务之间的调用问题。
  2. 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。

2. 技术选型

  1. SpringBoot 项目的基础框架,提供IoC功能。同时方便打成JAR包,便于测试。
  2. Netty 基于NIO的网络通信框架。相比用java socket实现的BIO通信,Netty无论是代码编写简洁还是基于NIO异步非阻塞特性,都占尽了优势。
  3. fastjson 序列化、反序列化。RPC框架中通信选择有很多:kyro/thift/json/hessian/protobuf/xml等等,为了快速实现RPC框架,节省生成桩函数的时间成本,所以本文采用了阿里的fastjson。
  4. zookeeper 提供服务的发现与注册。一个服务会有多个实例,所以我们选用zookeeper作为注册中心,在调用时,从zookeeper获取服务的实例列表,再从中选择进行调用。

3. RPC实现流程

消费者端流程:

  1. 代理服务接口
  2. 服务发现(连接zookeeper,获取生产者列表)
  3. 远程调用(轮询生产者服务列表),将类名,方法名和参数等信息通过代理发送给生产者端

生产者端流程:

  1. 加载需要远程调用的服务,并缓存
  2. 启动通讯服务器(Netty)
  3. 服务注册(把通信地址放入zookeeper)
  4. 收到消息后使用反射,本地调用方法并将执行的结果编码返回给消费者端

在调用链路中断点,就可以同时了解RPC通信原理和Netty的通信原理了,代码每个方法和类都做了注释~实践出真知,看代码胜过所有博客的文字介绍。

4. 未实现的功能

相比Dubbo这样成熟的RPC框架还有未实现的功能如下:

  1. 负载均衡 如何从多个实例里挑选一个出来,进行调用,这就要用到负载均衡了。负载均衡的策略肯定不只一种,要怎样把策略做成可配置的?又要如何实现这些策略?
  2. 结果缓存 每次调用查询接口时都要真的去Server端查询吗?是不是要考虑一下支持缓存?
  3. 多版本控制 服务端接口修改了,旧的接口怎么办?
  4. 异步调用 客户端调用完接口之后,不想等待服务端返回,想去干点别的事,如何支持?
  5. 优雅停机 服务端要停机了,还没处理完的请求,如何优雅的处理?
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全菜工程师小辉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 什么是RPC?
  • 2. 技术选型
  • 3. RPC实现流程
    • 消费者端流程:
      • 生产者端流程:
      • 4. 未实现的功能
      相关产品与服务
      负载均衡
      负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档