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 协议等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)