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

简介: 一个service,一个client,一个注册中心。service注册自己到registry注册中心,包括service-name,还有相应的ip,port,然后client去监听注册中心,然后拿到service的地址,调用的时候会通过生成一个代理,去invoke调用结果返回

官网

基本流程

https://www.sofastack.tech/projects/sofa-rpc/client-invoke-flow/
在这里插入图片描述

最简单:一个service,一个client,一个注册中心。
在这里插入图片描述
service注册自己到registry注册中心,包括service-name,还有相应的ip,port,然后client去监听注册中心,然后拿到service的地址,调用的时候会通过生成一个代理,去invoke调用结果返回

SofaRpc学习

代码入手

我们在项目里面先实现这个简单的demo,然后debug进去跟着学习。

在这里插入图片描述
这一块没什么谈的,端口号,ip,对应的协议,然后开启一个线程去监听。

服务端-发布过程

服务提供者配置 com.alipay.sofa.rpc.config.ProviderConfig#export

com.alipay.sofa.rpc.bootstrap.DefaultProviderBootstrap#export
在这里插入图片描述
会根据接口,uid,协议拼接成一个key,来保证同一个服务只发布一次。
在这里插入图片描述

服务端-构造执行链

在这里插入图片描述
com.alipay.sofa.rpc.filter.FilterChain#FilterChain

在这里插入图片描述
com.alipay.sofa.rpc.config.AbstractInterfaceConfig#filter
在这里插入图片描述
com.alipay.sofa.rpc.filter.FilterChain#selectActualFilters在这里插入图片描述
在这里插入图片描述
蚂蚁自己封装的扩展类,然后通过ExtensionLoader去加载扩展点

服务端-注册到注册中心

初始化过程

RegistryFactory.getRegistry(registryConfig);

com.alipay.sofa.rpc.registry.RegistryFactory#getRegistry

在这里插入图片描述

不同注册中心会有不同的扩展点,然后根据不同的扩展点去加载注册中心
在这里插入图片描述
注册到注册中心

// 注册到注册中心
providerConfig.setConfigListener(new ProviderAttributeListener());
register();

register()
在这里插入图片描述
会根据不同的配置去进行注册相应的配置

在这里插入图片描述
到这里完成第一步service注册到registry

客户端

看代码
在这里插入图片描述
一样是有配置,服务service-name,协议,超时时间,对于的接口的类,注意这些,为下面讲解埋下伏笔!!!

客户端-生成代理类

com.alipay.sofa.rpc.config.ConsumerConfig#refer

在这里插入图片描述
也是为了避免客户端重复发布

cluster.init();

初始化过程
在这里插入图片描述

com.alipay.sofa.rpc.client.LoadBalancerFactory#getLoadBalancer(com.alipay.sofa.rpc.bootstrap.ConsumerBootstrap)

负载均衡下面单独一个点展开讲


这一块代码的实现。

客户端-连接初始化

在这里插入图片描述

com.alipay.sofa.rpc.client.AllConnectConnectionHolder#doReconnect
在这里插入图片描述
这一块netty的可用性重试

netty

在这里插入图片描述
我们可以看到底层使用netty进行通信,在下面一些解码中埋下伏笔。

客户端-得到服务端列表

List all = consumerBootstrap.subscribe();
在这里插入图片描述
初始化服务端连接(建立长连接)

在这里插入图片描述
ProviderInfo 抽象的服务提供列表

com.alipay.sofa.rpc.client.AllConnectConnectionHolder#addNode

在这里插入图片描述
经常面试遇到CountDownLatch使用,这里就有

**com.alipay.sofa.rpc.client.AllConnectConnectionHolder#initClientRunnable
--- >
com.alipay.sofa.rpc.client.AllConnectConnectionHolder#initClientRunnable**

这里是获取长连接的,然后使用map往里面塞服务者配置以及链接
在这里插入图片描述

客户端-创建代理类

在这里插入图片描述

客户端-具体调用

com.alipay.sofa.rpc.filter.ConsumerInvoker#invoke
在这里插入图片描述
com.alipay.sofa.rpc.client.AbstractCluster#sendMsg

doSendMsg(providerInfo, clientTransport, request)

同步调用
com.alipay.sofa.rpc.transport.http.AbstractHttp2ClientTransport#syncSend
在这里插入图片描述
在这里插入图片描述
看到没有底层通过netty去发送

客户端-解码

这里就涉及netty解码
com.alipay.sofa.rpc.transport.http.AbstractHttpClientHandler#onResponse
com.alipay.sofa.rpc.transport.http.SyncInvokeClientHandler#doOnResponse

decode(response);

在这里插入图片描述
会把一些上下文塞进去

客户端-配置接口,方法用处

com.alipay.sofa.rpc.core.request.SofaRequest
在这里插入图片描述

服务端拿到这个配置的类名,还有方法,参数进行反射的调用
在这里插入图片描述

下一篇

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
传感器 JSON 物联网
什么是MQTT遗嘱消息?如何配置和处理遗嘱消息?
什么是MQTT遗嘱消息?如何配置和处理遗嘱消息?
1204 0
什么是MQTT遗嘱消息?如何配置和处理遗嘱消息?
|
XML Java 数据格式
最近很火的SOFARPC是什么?带你快速入门SOFARPC
最近很火的SOFARPC是什么?带你快速入门SOFARPC
最近很火的SOFARPC是什么?带你快速入门SOFARPC
|
监控 IDE Java
如何在无需重新启动服务器的情况下在 Spring Boot 上重新加载我的更改?
如何在无需重新启动服务器的情况下在 Spring Boot 上重新加载我的更改?
1216 8
|
机器学习/深度学习 人工智能 算法
【AI系统】AI 框架基础介绍
本文介绍了AI算法、神经网络及其应用,解释了为何神经网络需要训练及AI框架的作用。通过解析深度学习的数学原理与反向求导算法,阐述了AI框架如何作为模型设计、训练和验证的标准工具,支持算法封装、数据调用及计算资源管理,强调了AI框架的发展历程和技术迭代。
461 9
【AI系统】AI 框架基础介绍
|
Java 应用服务中间件 Spring
SpringBoot出现 java.lang.IllegalArgumentException: Request header is too large 解决方法
SpringBoot出现 java.lang.IllegalArgumentException: Request header is too large 解决方法
838 0
|
存储 SQL 关系型数据库
OceanBase与MySQL有何区别?
【8月更文挑战第12天】OceanBase与MySQL有何区别?
3707 3
|
JavaScript Java 关系型数据库
基于SpringBoot+Vue的社团管理系统的设计与实现(源码+部署说明+演示视频+源码介绍)(1)
基于SpringBoot+Vue的社团管理系统的设计与实现(源码+部署说明+演示视频+源码介绍)
462 1
|
Java 数据库连接 数据库
save() 和 saveOrUpdate() 方法有什么区别?
【8月更文挑战第21天】
541 0
SpringMVC拦截器的介绍,拦截器的基本实现,拦截器链配置
SpringMVC拦截器的介绍,拦截器的基本实现,拦截器链配置
343 2
|
人工智能 数据中心 Anolis
NVIDIA AI 新网络助力龙蜥提升网络通信速率
面向新 AI 数据中心,网络如何改进?