dubbo的服務模型是非常簡單的循签,要么是服務提供方(Provider)提供服務乞旦,要么是服務消費方(Consumer)消費服務,從dubbo官網的系統(tǒng)架構圖就可以看出來。
Provider與Consumer通過Registry來解耦合,這一點和Spring有點相似。在Spring中它的核心領域模型是Bean.我們通過配置bean,然后Spring容器獲取到需要的對象郊尝。不需要關心對象的創(chuàng)建過程吞获,并且我們可以在Spring的Bean的生命周期過程來來定制化對象。在使用dubbo的時候并不需要服務暴露與服務引用的細節(jié)傻盟。我們只需要在服務端配置:
provider-beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-provider"/>
<dubbo:registry address="multicast://224.5.6.7:1234"/>
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>
<bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl"/>
</beans>
在服務消費方法配置:
consumer-beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-consumer"/>
<dubbo:registry address="multicast://224.5.6.7:1234"/>
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService"/>
</beans>
就能夠像本地方法調用一樣腥光,遠程調用遠程服務暴露的服務议双。
一平痰、dubbo的領域對象
在dubbo當中它的核心領域對象就是Invoker,它是 Dubbo 的核心模型,其它模型都向它靠擾,或轉換成它母市。
在dubbo中通過Protocol這個來管理Invoker的生命周期,包括服務的暴露與引用都是通過它來完成的返帕。而在進行服務調用的時候通過Invocation來保存調用過程中的變量:包括方法名嫉髓,參數等梧油。所以在整個dubbo調用過程當中:
- Invoker 是實體域,它是 Dubbo 的核心模型骗村,其它模型都向它靠擾雷客,或轉換成它摘刑,它代表一個可執(zhí)行體徐块,可向它發(fā)起 invoke 調用,它有可能是一個本地的實現,也可能是一個遠程的實現,也可能一個集群實現。
- Protocol 是服務域桩砰,它是 Invoker 暴露和引用的主功能入口亚隅,它負責 Invoker 的生命周期管理。
- Invocation 是會話域行疏,它持有調用過程中的變量,比如方法名货葬,參數等征绎。
二、dubbo的服務暴露
在服務提供者暴露的時候歼指,首先從配置文件中獲取到對外提供的實際類ref
(如:HelloWorldImpl),然后通過ProxyFactory
類(包括JavassistProxyFactory,JdkProxyFactory)把ref
生成一個AbstractProxyInvoker
實例脱拼,到這里就完成了具體服務到Invoker的轉化 ,轉化后的Invoke如下圖所示:
在Invoker中主要包括以下幾個屬性:
- 當前接口的Class實例(DemoService.class)
- 當前接口的實例類對象(DemoServiceImpl.class)
- URL朝巫,配置信息的統(tǒng)一格式,所有擴展點都通過傳遞 URL 攜帶配置信息
- 當前接口的代理對象Wrapper實例
下面就是Invoker轉化成Exporter的過程。配置不同的協議dubbo暴露的方式就不一樣,我們以默認的dubbo協議來說明请祖。Dubbo協議把Invoke轉化成Exporter主要是通過DubboExporter的export
方法來進行暴露的福压。它主要是在當前機器通過配置的端口號打開socket監(jiān)聽服務映凳,并收服務調用方發(fā)送過來的請求,默認通過netty來實現網絡間的數據傳輸。
上面的服務暴露的對象轉換是 dubbo 官方提供的,下面是具體的使用 zookeeper 為注冊中心時, dubbo 的對象轉換過程:
如果大家看了后面的服務暴露的源碼分析對于上面的圖會有更加深刻的認識亏娜。
三汗侵、服務的注冊
在服務的暴露過程中其實包括二個過程:一是把服務暴露通過配置相應的協議暴露到本地服務雪猪;二是把暴露的服務注冊到暴露到配置的注冊中心中去官觅。其實dubbo服務暴露與注冊主要是通過RegistryProtocol
這個類來完成的笛辟。以dubbo為通信協議围来,zookeeper為注冊中心舉例才漆。
四阅虫、總結
在dubbo中屏蔽了遠程調用的各個細節(jié)购城,抽象出了服務注冊方(Provider)、注冊中心(Registry)和服務消費方(Consumer),實現了服務發(fā)布與服務調用的解耦。并且做為服務調用可以以本地方法的形式來調用遠程服務。關于服務發(fā)布與服務調用的上面只是說了服務暴露的主要的三個過程。其實在服務暴露的時候發(fā)出了以下幾個動作:
- 暴露本地服務
- 暴露遠程服務
- 啟動Netty
- 連接Zookeeper
- 到Zookeeper中注冊
- 監(jiān)聽zookeeper
關于服務發(fā)布的更多細節(jié)會在后面的博客當中慢慢說明。