dubbo源碼學習一:基礎知識及使用的相關技術

Dubbo是Alibaba開源的分佈式服務框架,它最大的特色是按照分層的方式來架構,使用這種方式能夠使各個層之間解耦合(或者最大限度地鬆耦合),咱們能夠很是容易地經過Dubbo來構建分佈式服務,並根據本身實際業務應用場景來選擇合適的集羣容錯模式,這個對於不少應用都是迫切但願的,只須要經過簡單的配置就可以實現分佈式服務調用,也就是說服務提供方(Provider)發佈的服務能夠自然就是集羣服務。java

 

Dubbo的產生背景、最初的需求、架構設計 等能夠詳細看官方的文檔:web

http://dubbo.apache.org/redis

 

在看代碼中以爲dubbo使用的主要技術以下:spring

    代理(Proxy:javassist等)apache

    反射(Invoke)網絡

    協議(Protocol:DubboProtocl等)架構

    序列化(Hession等)app

    NIO(netty,mina)框架

    SPI(java spi)jvm

    裝飾器模式(wrapper)

    觀察者模式(訂閱和監聽)

    spring自定義標籤(容器啓動時bean的解析)

先去了解一下以上的技術會對看源碼有很大的幫助!!!

 

今天先看看SPI技術:

SPI(Service Provider Interface)服務提供的接口,定義好一個接口,裏面有不少方法,真正的服務提供方是這個接口的實現,在衆多開源的項目中都大量使用了spi的技術,由於開源項目大多提供了給用戶的拓展機制,好比dubbo提供了不少spi的接口讓開發者能夠本身實現,如:com.alibaba.dubbo.rpc.protocol 接口就是一個spi的接口,他的實現有:

registry=com.alibaba.dubbo.registry.integration.RegistryProtocol  

filter=com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper  

listener=com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper  

mock=com.alibaba.dubbo.rpc.support.MockProtocol  

injvm=com.alibaba.dubbo.rpc.protocol.injvm.InjvmProtocol  

dubbo=com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol  

rmi=com.alibaba.dubbo.rpc.protocol.rmi.RmiProtocol  

hessian=com.alibaba.dubbo.rpc.protocol.hessian.HessianProtocol  

com.alibaba.dubbo.rpc.protocol.http.HttpProtocol  

com.alibaba.dubbo.rpc.protocol.webservice.WebServiceProtocol  

thrift=com.alibaba.dubbo.rpc.protocol.thrift.ThriftProtocol  

memcached=memcom.alibaba.dubbo.rpc.protocol.memcached.MemcachedProtocol  

redis=com.alibaba.dubbo.rpc.protocol.redis.RedisProtocol 

 

若是開發者想實現本身的協議,那麼直接寫一個類實現protocol接口,而後在resources/META-INF/dubbo/internal建一個文件以下:

文件名就是接口的全名就是你實現的接口的全包名+接口名,文件內容格式 爲:key(協議名) = 接口的實現全包名+接口名,以下

    myProtocol=cn.myProtocolImpl.eProtocol.BitProtocol  

將本身的協議打包,使用時就能夠經過 key 來使用本身的協議了

    <!-- 協議端口 部署到雙網卡時加 host="172.21.28.98"-->    

    <dubbo:protocol name="myProtocl" host="127.0.0.1" port="9998"  

           accepts="1000" threadpool="fixed" threads="100" />

 

以上爲基於spi去實現dubbo的拓展接口,下面實踐一下,寫一個基於java spi的demo

一、首先定義一個接口

public interface SPIService {  

public void say();  

}  

二、編寫接口的實現,爲了看效果我寫了兩個實現

public class SayHello implements SPIService {  

@Override  

public void say() {  

System.out.println("Say Hello");  

}  

}  

 

public class SaySpi implements SPIService {  

@Override  

public void say() {  

System.out.println("Say Spi");  

}  

}  

三、建文件夾resources/META-INF/services,在建好的目錄下建一個文件,文件名是接口的全包名+路徑,文件內容以下

com.spi.service.impl.SayHello  

com.spi.service.impl.SaySpi  

四、測試

public class TestSPI {  

public static void main(String[] args) {  

ServiceLoader<SPIService> loader = ServiceLoader.load(SPIService.class);  

for (SPIService service : loader) {  

service.say();  

}  

}  

}  

五、輸出

Say Hello  

Say Spi  

從上面咱們能夠看到java spi在配置實現的時候是沒有 key 的,dubbo爲了經過用戶的配置來動態的獲取實現,因此對spi作了一些改造,能夠經過key來動態的獲取實現,好比協議有:dubbo、rmi、hession等,網絡傳輸方式 :netty、mina、grizzy

Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();  

以上基本的瞭解了 spi 的工做機制及在dubbo中的做用。接下來會看dubbo自定義spring標籤,以及本身實現一個spring的標籤。

it視頻獲取

相關文章
相關標籤/搜索