文章目录

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

前言

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

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

netty


很重要的三个类NettyByteBuffer(直接跳过没啥好讲),NettyChannel,NettyHelper(也直接跳过,比较简单)

NettyHelper

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


我们来看下在哪里set进去
com.alipay.sofa.rpc.transport.http.AbstractHttp2ServerTransport#start

com.alipay.sofa.rpc.client.AbstractCluster

很多功能

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

调用的实现

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

同步

Callback调用

request.setSofaResponseCallback(methodResponseCallback)一个重点关注点

Future调用

调用实现方式

有很多种协议,主要看下http

com.alipay.sofa.rpc.transport.http.AbstractHttp2ClientTransport

基本参数

异步调用

com.alipay.sofa.rpc.transport.http.AbstractHttp2ClientTransport#asyncSend

com.alipay.sofa.rpc.transport.http.AbstractHttp2ClientTransport#doInvokeAsync

会分有回调callback还是future调用,最终通过doSend(request, callback, timeoutMillis);去调用

过程是这样,会去生成一个requestId,然后放到map里头,搞个超时机制去remove,如果超时的时候还在里头就会塞入异常信息


requestId是AtomicInteger去递增,channel.write(httpRequest)输出到netty服务端。

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


把streamId跟future,AbstractHttpClientHandler塞到map里头

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

com.alipay.sofa.rpc.transport.http.Http2ClientChannelHandler#channelRead0


会根据header streamId去拿到对应的AbstractHttpClientHandler,处理器
callback.receiveHttpResponse(msg);


序列化,然后去setData

在这里实现前面callback或者future等等

com.alipay.sofa.rpc.transport.http.FutureInvokeClientHandler#doOnResponse
com.alipay.sofa.rpc.message.AbstractResponseFuture#setSuccess


往future里头塞result

整个过程流程图

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

同步调用

com.alipay.sofa.rpc.transport.http.AbstractHttp2ClientTransport#syncSend


同步调用有个很骚的操作,就是它实际还是一个future去调用,作为一个callback

跟dubbo一样骚操作

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


就是同步帮你get一个结果,异步丢给你个future,你自己去get结果,哈哈哈,你好骚~

同步异步对比

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

优雅关闭(计算器作用)


这里不是线程池优雅关闭,是调用线程,它会一直等到计数器为0,再关闭

负载均衡

com.alipay.sofa.rpc.client.AbstractCluster#select(com.alipay.sofa.rpc.core.request.SofaRequest, java.util.List<com.alipay.sofa.rpc.client.ProviderInfo>)

com.alipay.sofa.rpc.client.AbstractLoadBalancer#select

  • 负载均衡

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

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

    大家好,我叫大鸡腿,大家可以关注下我,会持续更新技术文章还有人生感悟,感谢~ 文章目录 官网 基本流程 SofaRpc学习 代码入手 服务端-发布过程 服务端-构造执行链 服务端-注册到注册中心 客户 ...

  2. mybatis源码学习篇之——执行流程分析

    前言 在正式学习mybatis框架源码之前,需要先弄懂几个问题?myabtis框架是什么?为什么需要mybatis框架?使用mybatis框架带来的好处是什么? 回答这几个问题之前,我们先来看一下,之 ...

  3. SpringCloud Feign 源码底层如何调用Ribbon实现服务调用的负载均衡

    在SpringCloud微服务中调用都不是直接用Ribbon进行服务调用,因为那样的化项目中的代码量会增加很多,微服务之间的调用是用Feign来进行调用,下面就是普通的一个接口调用例子 这样就可以进行 ...

  4. KBEngine warring项目源码阅读(二) 登录和baseapp的负载均衡

    原本不打算把登录拿出来写的,但是阅读登录部分的代码的时候发现登录和注册还不太一回事,因为登录涉及到分配baseapp的ip,负载均衡的实现,所以水一下. 流程图: 和上次一样,先是找unity控件 找 ...

  5. mq补偿机制java代码_RocketMQ源码分析之消息消费机制-消费端消息负载均衡机制与重新分布 - Java 技术驿站-Java 技术驿站...

    1.消息消费需要解决的问题 首先再次重复啰嗦一下RocketMQ消息消费的一些基本元素的关系 主题 ---> 消息队列(MessageQueue) 1 对多 主题 ----> 消息生产者, ...

  6. mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

    前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...

  7. action mutation 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

    module与moduleCollection你一定要会啊!Vuex源码学习(五)加工后的module 在组件中使用vuex的dispatch和commit的时候,我们只要把action.mutati ...

  8. 第十四课 k8s源码学习和二次开发原理篇-调度器原理

    第十四课 k8s源码学习和二次开发原理篇-调度器原理 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第十四课 k8s源码学习和二次开发原理篇-调度器原理 第一节 ...

  9. 第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理

    第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第八课 ...

  10. 开源中国源码学习UI篇(一)之FragmentTabHost的使用分析

    最近在有意读开源中国的源码来提升Android开发能力,开通博客来提升一下自己的积极性- -我参考的是开源中国2.2版,完整源码地址为http://git.oschina.net/oschina/an ...

最新文章

  1. git bash退回上一个文件夹
  2. Java: System.exit() 与安全策略
  3. 会计记忆总结之一:总论
  4. 发生了变化 触发器函数不能读它_2013年1月18日调试触发器“表发生了变化,触发器或函数不能读它”的出现原因,以及解决方案...
  5. SAP UI5 视图控制器 View Controller 的生命周期方法 - Lifecycle methods
  6. matlab 进度条/waitbar 显示运行进度
  7. Coding Interview Guide -- 向有序的环形单链表中插入新节点
  8. 根据XML更新Userprofile
  9. 【Flink】Flink keyed State多年的误解 以及 Keyed state redistribute
  10. TotalFinder for Mac(Finder增强工具)
  11. 音频格式G711转PCM的代码
  12. Nature 期刊介绍
  13. Java实现PDF添加图片水印和文字水印
  14. 半监督学习:主动学习、纯半监督学习和直推学习区别和联系
  15. 考研数学一二三 2010-2019年每道题的难度系数
  16. java sasl例子_Java Subject.doAs方法代碼示例
  17. 双手指代脑区,读文献参考,大脑分区记不住怎么办
  18. 39 Spring Boot Shiro权限管理【从零开始学Spring Boot】
  19. [2017纪中10-25]嘟噜噜 约瑟夫问题 递推
  20. 【前端基础】盒子模型和页面布局总结

热门文章

  1. 智商情商哪个重要_你认为哪个更重要,情商还是智商?为什么?
  2. 怎么把mp4转换成html,html5-video – VLC:如何从mp4转换为webm
  3. C# WinForm 功能代码备忘-刘欣
  4. 易到CEO巩振兵被曝本周已离职 其称“在开会”
  5. 四、HTML标签:图片标签
  6. 自己动手制作植物大战僵尸简单修改器
  7. arduino蓝牙通讯代码_手机与Arduino蓝牙串口通讯实验及完整例程
  8. 学计算机能考南京哪个大学,这三所南京市高校,适合报考计算机类专业,适合的考生不要错过...
  9. 关于软件测试的英语面试题,软件测试工程师英语面试题
  10. 2017博鳌新型城镇化发展大会,机智云斩获2017中国智慧城市生态圈杰出企业、智慧城市创新应用双料大奖