sofa协议服务器,sofa-rpc 服务端源码流程走读

本文主要探讨SOFA-RPC服务端启动过程,以BoltServer为例,详细解析服务配置、启动、注册及服务端内部实现,包括BoltServer、AbstractHttpServer和RemotingServer的通信机制。通过源码走读,展示了SOFA-RPC如何通过ProviderBootstrap创建服务并使用ServerFactory获取Server实例,以及基于Netty的通信层实现。
摘要由CSDN通过智能技术生成

sofa-rpc是阿里开源的一款高性能的rpc框架,这篇文章主要是对sofa-rpc provider启动服务流程的一个代码走读,下面是我简单绘制的一个基本的关系流程图

AAffA0nNPuCLAAAAAElFTkSuQmCC

下面我们根据sofa-rpc代码,对流程进行一个跟踪与走读。我们以BoltServer的为例

AAffA0nNPuCLAAAAAElFTkSuQmCCpublic static void main(String[] args) {

ApplicationConfig application = new ApplicationConfig().setAppName("test-server");

ServerConfig serverConfig = new ServerConfig()

.setPort(22000)

.setDaemon(false);

ProviderConfig providerConfig = new ProviderConfig()

.setInterfaceId(HelloService.class.getName())

.setApplication(application)

.setRef(new HelloServiceImpl())

.setServer(serverConfig)

.setRegister(false);

ProviderConfig providerConfig2 = new ProviderConfig()

.setInterfaceId(EchoService.class.getName())

.setApplication(application)

.setRef(new EchoServiceImpl())

.setServer(serverConfig)

.setRegister(false);

providerConfig.export();

providerConfig2.export();

LOGGER.warn("started at pid {}", RpcRuntimeContext.PID);

}

AAffA0nNPuCLAAAAAElFTkSuQmCC

可以看到sofa-rpc通过ProviderConfig类对服务提供方Provider进行了配置信息的初始化,同时也提供了export做为服务启动的入口。

AAffA0nNPuCLAAAAAElFTkSuQmCCpublic synchronized void export() {        if (providerBootstrap == null) {

providerBootstrap = Bootstraps.from(this);

}

providerBootstrap.export();

}

AAffA0nNPuCLAAAAAElFTkSuQmCC根据ProviderConfig中setBootstrap()配置的Bootstrap类型,我们通过Bootstaps.from(this)可以获取到不同的Bootstrap引导服务,分别是DefaultProviderBootstrap与 DubboProviderBootstrap

AAffA0nNPuCLAAAAAElFTkSuQmCC/**

* 发布一个服务

*

* @param providerConfig 服务发布者配置

* @param             接口类型

* @return 发布启动类     */

public static  ProviderBootstrap from(ProviderConfig providerConfig) {

String bootstrap = providerConfig.getBootstrap();        if (StringUtils.isEmpty(bootstrap)) {            // Use default provider bootstrap 无的话就返回默认DefaultProviderBootstrap

bootstrap = RpcConfigs.getStringValue(RpcOptions.DEFAULT_PROVIDER_BOOTSTRAP);

providerConfig.setBootstrap(bootstrap);

}

ProviderBootstrap providerBootstrap = ExtensionLoaderFactory.getExtensionLoader(ProviderBootstrap.class)

.getExtension(bootstrap, new Class[] { ProviderConfig.class }, new Object[] { providerConfig });        return (ProviderBootstrap) providerBootstrap;

}

AAffA0nNPuCLAAAAAElFTkSuQmCC

DefaultProviderBootstrap与 DubboProviderBootstrap 都继承自ProviderBootstrap。

DefaultProviderBootstrap又被BoltProviderBootstrap、Http2ClearTextProviderBootstrap、RestProviderBootstrap三个类所继承,这其实对应了sofa-rpc中的三种server服务方式。

我们看下DefaultProviderBootstrap服务启动源码

AAffA0nNPuCLAAAAAElFTkSuQmCC@Override    public void export() {        if (providerConfig.getDelay() > 0) { // 延迟加载,单位毫秒

Thread thread = factory.newThread(new Runnable() {

@Override                public void run() {                    try {

Thread.sleep(providerConfig.getDelay());

} catch (Throwable ignor

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值