专业的编程技术博客社区

网站首页 > 博客文章 正文

蚂蚁金服开源-SofaRpc源码学习篇(蚂蚁金服sofa框架)

baijin 2024-08-19 11:19:46 博客文章 7 ℃ 0 评论

官网

基本流程

https://www.sofastack.tech/projects/sofa-rpc/client-invoke-flow/

最简单:一个service,一个client,一个注册中心。

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

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

代码入手

SOFARPC 方式快速入门 · SOFAStack

这一块没什么谈的,端口号,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

服务端拿到这个配置的类名,还有方法,参数进行反射的调用

下一篇

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表