dubbo学习
Posted thinkqin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dubbo学习相关的知识,希望对你有一定的参考价值。
最近看了一遍dubbo的源码,也正好阿里的中间件比赛初赛是dubbo的 loadbalance 方法,所以先整理下dubbo的知识。
服务治理并不是最近才提出的概念,从java服务的前后端分离开始到现在的微服务模式,远程服务调用能力就是必须的了,webservice等的方式效率性能开发难度都远远跟不上要求。简单的远程调用可以有rmi等方式,但是数量巨大的服务,跨部门的服务调用,服务错误处理等等要求下,服务治理框架也就是必须的了,初期,不少公司应该也是自己开发过服务治理的中间件,我也看过几个服务治理中间件的源码,其中dubbo是阿里开源出来的,功能比较强大,可扩展性比较强,对于我个人来说,是学到了一些新的设计模式和思路,故而整理一下。据说阿里内部已经不用dubbo,后续有机会再学习下hsf。
基本用法和说明参考dubbo官方说明文档: http://dubbo.apache.org/zh-cn/docs/user/preface/architecture.html
看一遍代码的主流程:
1. pre
代码入口:
配置方式: <dubbo:registry id="hangzhouRegistry" address="10.20.141.150:9090" /> //注册中心
<dubbo:reference id="asyncService" interface="org.apache.dubbo.samples.governance.api.AsyncService"> <dubbo:method name="sayHello" async="true" /> </dubbo:reference>
<dubbo:service interface="org.apache.dubbo.samples.governance.api.AsyncService" ref="asyncService"/> 等等等
以xml配置方式为例子,代码在dubbo-config 包的dubbo-config-spring 包里 class DubboNamespaceHandler extends NamespaceHandlerSupport(spring提供可以查资料) 定义dubbo的namespace,
这个类里注册不同的标签的解析类,不同的解析类将xm配置实例化成了spring的bean。例如 RegistryConfig ReferenceBean ServiceBean 等
可配置化实现: SPI接口 ExtensionLoader 等
2 .Provider: ServiceBean
服务暴露:
Service Config-> doExportUrls();
interfaceClass,url->invoker
List<protocols> -> export(invoker)-> 以dubbo协议为例 openServer()->ServerMap.get() or createServer ->(headerExchange) exchanger.bind(url,hander) ->
Transporter.bind()->nettyServer->open
exports.add (exports), urls.add(url)
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="rmi" port="1099" />
被调用:
ExchangeHandlerAdapter(abstract) -》exprort-> invoker->invoker.invoke
再来看看这个invoker 怎么实现的:以javaassistProxyFactory 为例子 invoker 用反射方式实现,配置的文件指定 bean和 interface Wrapper包装类,doInvoker 调用wrapper的doInvokeMethod
Wrapper的makeWrapper方法,创造了Wrapper类。
3.consumer:
调用服务:
继承spring的FactoryBean -》getObject-》init()-》createProxy-》invoker(类似) -》publishconsumer 到注册地址
invoker : REF_PROTOCOL.refer->clientserver-> (nettyserver)
4 服务注册
provider写信息到注册中心,启动,停服务
client写信息,并监听数据变化
以上是关于dubbo学习的主要内容,如果未能解决你的问题,请参考以下文章