SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡

文章目录

  • 前言
  • netty
    • NettyHelper
    • com.alipay.sofa.rpc.client.AbstractCluster
    • 调用实现方式
      • 异步调用
      • 同步调用
        • 跟dubbo一样骚操作
      • 同步异步对比
  • 优雅关闭(计算器作用)
  • 负载均衡

前言

这是作为sofarpc学习的子篇,主要学习netty在rpc里面的使用。

  • 蚂蚁金服开源-SofaRpc源码学习篇

netty

SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第1张图片
很重要的三个类NettyByteBuffer(直接跳过没啥好讲),NettyChannel,NettyHelper(也直接跳过,比较简单)

NettyHelper

简单介绍:保存服务端boss,work线程池,还有客户端对应io线程池 EventLoopGroup

SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第2张图片
我们来看下在哪里set进去
com.alipay.sofa.rpc.transport.http.AbstractHttp2ServerTransport#start
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第3张图片

com.alipay.sofa.rpc.client.AbstractCluster

很多功能

  1. 连接init
  2. 调用的时候进行负载均衡
  3. 调用的方式,同步异步,或者future
  4. 心跳,重试等等

调用的实现

com.alipay.sofa.rpc.client.AbstractCluster#doSendMsg

同步
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第4张图片
Callback调用
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第5张图片
request.setSofaResponseCallback(methodResponseCallback)一个重点关注点

Future调用
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第6张图片

调用实现方式

有很多种协议,主要看下http
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第7张图片
com.alipay.sofa.rpc.transport.http.AbstractHttp2ClientTransport

基本参数
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第8张图片

异步调用

com.alipay.sofa.rpc.transport.http.AbstractHttp2ClientTransport#asyncSend
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第9张图片
com.alipay.sofa.rpc.transport.http.AbstractHttp2ClientTransport#doInvokeAsync
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第10张图片
会分有回调callback还是future调用,最终通过doSend(request, callback, timeoutMillis);去调用
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第11张图片
过程是这样,会去生成一个requestId,然后放到map里头,搞个超时机制去remove,如果超时的时候还在里头就会塞入异常信息

SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第12张图片
requestId是AtomicInteger去递增,channel.write(httpRequest)输出到netty服务端。

responseChannelHandler.put(requestId,channel.write(httpRequest),callback);

SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第13张图片
把streamId跟future,AbstractHttpClientHandler塞到map里头

这里处理链读到数据之后怎么一个处理过程

com.alipay.sofa.rpc.transport.http.Http2ClientChannelHandler#channelRead0
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第14张图片
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第15张图片
会根据header streamId去拿到对应的AbstractHttpClientHandler,处理器
callback.receiveHttpResponse(msg);

SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第16张图片
序列化,然后去setData
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第17张图片
在这里实现前面callback或者future等等

com.alipay.sofa.rpc.transport.http.FutureInvokeClientHandler#doOnResponse
com.alipay.sofa.rpc.message.AbstractResponseFuture#setSuccess
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第18张图片
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第19张图片
往future里头塞result

整个过程流程图

  1. 客户端----future,callback调用,会保存requestId,跟对应的future或者callback
  2. 在服务端发送消息之后,客户端----进行解析,从header里头拿到streamId,还有future进行塞入数据
  3. 这时也是会从private final Map> streamIdPromiseMap;去踢出这个请求,不会造成超时报错

同步调用

com.alipay.sofa.rpc.transport.http.AbstractHttp2ClientTransport#syncSend
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第20张图片
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第21张图片
同步调用有个很骚的操作,就是它实际还是一个future去调用,作为一个callback

跟dubbo一样骚操作

  • 面试官:Dubbo是如何同时支持同步调用和异步调用的?

SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第22张图片
就是同步帮你get一个结果,异步丢给你个future,你自己去get结果,哈哈哈,你好骚~

同步异步对比

最后还是调用doSend方法
同步方法是框架请求完直接帮你调用DefaultFuture的get方法阻塞获取结果,
异步方法是把DefaultFuture返回给用户,让用户决定获取调用get()方法的时机

优雅关闭(计算器作用)

SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第23张图片
这里不是线程池优雅关闭,是调用线程,它会一直等到计数器为0,再关闭

负载均衡

com.alipay.sofa.rpc.client.AbstractCluster#select(com.alipay.sofa.rpc.core.request.SofaRequest, java.util.List)
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第24张图片
com.alipay.sofa.rpc.client.AbstractLoadBalancer#select
SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第25张图片

  • 负载均衡

SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡_第26张图片

你可能感兴趣的:(中间件,中间件)