dubbo服务暴露

dubbo服务暴露,第1张

Dubbo是 Alibaba 开源的分布式服务框架远程调用框架,在网络间传输数据,就需要通信协议和序列化。

Dubbo支持dubbo、rmi、hessian、>

要了解服务导出做了什么,需要了解导出的目的是什么?

dubbo是一款面向接口代理的高性能RPC调用,说白了就是提供远程服务。

服务导出需要做的:简单说就是根据服务参数、服务协议构建服务URL,注册到注册中心,并启动Server。其中服务参数可以动态配置也需要监听。

1、onApplicationEvent

orgapachedubboconfigspringServiceBean#onApplicationEvent

发布ContextRefreshedEvent,进行导出服务

2、export

orgapachedubboconfigspringServiceBean#export

调用父类ServiceConfig导出,之后发布一个ServiceBeanExportedEvent

②、shouldExport检查服务是否需要导出

orgapachedubboconfigServiceConfig#shouldExport

orgapachedubboconfigServiceConfig#checkAndUpdateSubConfigs

1、completeCompoundConfigs

ServiceConfig中的某些属性如果是空的,那么就从ProviderConfig、ModuleConfig、ApplicationConfig中获取

①、如果配置了ProviderConfig provider,如果application、module、registries、monitor、protocols、configCenter这些属性为空的情况下,可以从provider中获取信息并赋值

③、如果ApplicationConfig application不为空,可以为registries、monitor为空的赋值

2、startConfigCenter

从配置中心获取配置,包括应用配置和全局配置

SystemConfiguration:是系统环境变量,可以在服务启动时通过-D指定参数

AbstractConfig:是通过@Service注解配置的参数

PropertiesConfiguration:是dubboproperties文件配置的

AppExternalConfiguration和ExternalConfiguration:是在配置中心Dubbo-Admin中配置的,AppXxx是应用级别

配置优先级是:SystemConfiguration -> AppExternalConfiguration -> ExternalConfiguration -> AbstractConfig -> PropertiesConfiguration

如果放到第二个位置优先级是:SystemConfiguration -->AbstractConfig -> AppExternalConfiguration -> ExternalConfiguration -> -> PropertiesConfiguration

c、根据setXX()方法和setParameters()方法进行参数值覆盖

②、prepareEnvironment

管理台上的动态配置中心,如果是zookeeper,获取的就是/dubbo/config/dubbo/dubboproperties节点中的内容。如果是应用级别的则获取的就是/dubbo/config/dubbo-demo-consumer-application/dubboproperties节点中的内容(dubbo-demo-consumer-application应用名,这里是以dubbo-demo为例)

4、checkProtocol 从配置中心设置Protocol配置

10、Local、Stub、Mock

local和stub一样,不建议使用了。如果Local存根为true,则存根类为interfaceName + "Local"。如果Stub本地存根为true,则存根类为interfaceName + "Stub"

orgapachedubboconfigServiceConfig#doExport

unexported表示:当前服务已经被取消了,就不需要再导出了

exported表示:已经导出了,就不再重复导出了

1、doExportUrls

orgapachedubboconfigServiceConfig#doExportUrls

②、遍历protocols协议

pathKey = group/应用名/path服务名:version

例如:mygroup/dubbo-demo/orgapachedubbodemoDemoService:101

ProviderMethodModel表示某一个方法、方法名所属的服务的,包含实现类,接口,以及接口中的各个方法

ApplicationModel表示应用中有哪些服务提供者和引用了哪些服务

每种协议都会导出一个单独的服务,并注册到各个注册中心

2、doExportUrlsFor1Protocol

orgapachedubboconfigServiceConfig#doExportUrlsFor1Protocol

③、methods方法参数处理

⑦、scope导出方式(scope=null进行远程导出)

生成的注册服务URL是在registryURL和export参数是服务url的拼装

b、DelegateProviderMetaDataInvoker也表示服务提供者,包括了Invoker和服务的配置。是对Invoker的包裹

c、protocolexport(wrapperInvoker)这是导出的核心,使用了SPI。

使用特定的协议来对服务进行导出,这里的协议是registry,导出成功后得到一个Exporter

由于注册地址也是服务,所以会先使用RegistryProtocol进行服务注册(服务导出),然后注册(服务导出)完了之后,再使用DubboProtocol进行导出

自适应SPI会获取url

orgapachedubboconfiginvokerDelegateProviderMetaDataInvoker#getUrl

⑩、当存在注册中心时,是先使用Registy协议注册服务,然后在使用>

这次讲 dubbo-spring-boot-starter 启动方式,所以入口就是Spring的SPI机制;

首先在META-INF/springfactories配置下,配置了orgapachedubbospringbootautoconfigureDubboAutoConfiguration类,在启动时,则会把DubboAutoConfiguration类注册到spring容器中;

我们来看下DubboAutoConfiguration

先看启动流程

我们先看下生产者端的启动流程,首先是在Spring中注册ServiceAnnotationBeanPostProcessor类

该类实现了BeanDefinitionRegistryPostProcessor接口,则在Spring容器初始化时,会调用postProcessBeanDefinitionRegistry方法

我们会看到,这个时候会去注册DubboBootstrapApplicationListener类,这个类我们等流程到了在分析,我们先按启动流程看过去;resolvePackagesToScan方法先获取到需要扫描的包 ,然后再调用registerServiceBeans去注册相关实例,我们重点来看下registerServiceBeans方法

接下来,我们主要去看下registerServiceBean方法

接下来,我们来看下buildServiceBeanDefinition方法

到这,ServiceBean注册成功,ServiceBean类很重要,每个Dubbo service实例都对应一个ServiceBean,相关配置都在ServiceBean中;我们再回到开始注册的DubboBootstrapApplicationListener类

DubboBootstrapApplicationListener类继承了OneTimeExecutionApplicationContextEventListener,OneTimeExecutionApplicationContextEventListener实现了ApplicationListener,主要监听了Spring容器生命周期,我们看下onApplicationContextEvent方法

我们可以看到,当Spring容器启动成功时,会调用dubboBootstrapstart();

接下来,主要逻辑在ServiceBean中,这个export方法在其父类ServiceConfig中,我们下一篇主要讲ServiceConfig逻辑;

1先问几个小问题,

1    dubbo 动态代理的目的 是什么?

代理的目的:举个例子,我被老板雇佣,本质上来去完成某一项工作。其实人就是要完成那份工作的代理。从表面上duboo客户端能执行调用某个接口的方法,其实是通过网络传输告诉服务端。我要调用哪些方法,传递给你哪些参数。你帮我执行完。然后把结果给我就行了。这就是dubbo动态代理要完成的功能。只不过框架层面抽象了这个层次,具体功能由框架来实现。dubbo动态代理有两种方案,1个是javaasisit 一个是jdk提供的。可选。为什么出现javaasisit,是基于性能的考虑。生成字节码的速度要比jdk的快。

2服务暴露解决什么问题?

服务暴露就是告诉客户端。我能提供什么服务,对应的ip是什么,端口是什么。你需要让我为你服务,你只需要按一定的协议调用就行。

搞清楚以上两个问题,就基本上了解了服务暴露的流程。

主要流程

    1 通过netty暴露服务,

    2 像注册中心注册,表明我提供什么服务

    3订阅 Configurations 监听属性变更时间。

下面主要解析如何通过netty 发布服务,最终的目的达到

创建NettyServer对象并通过doOpen()方法创建Netty Server对象。

doOpen()方法内部创建ServerBootstrap对象并实现bind启动服务监听

HeaderExchangeServer对象的参数通过Transportersbind()生成的Server对象。

String string = uRL2getParameter("server", uRL2getParameter("transporter","netty"));

默认是netty

创建NettyServer对象并通过doOpen()方法创建Netty Server对象。

doOpen()方法内部创建ServerBootstrap对象并实现bind启动服务监听。

以上就是关于dubbo服务暴露全部的内容,包括:dubbo服务暴露、spring cloud和dubbo哪个会被淘汰、Dubbo 协议等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10085389.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存