經過如下內容介紹dubbox框架。java
Dubbo是一個分佈式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。 其核心部分包含:git
Dubbox now means Dubbo eXtensions. If you know java, javax and dubbo, you know what dubbox is :)。噹噹網根據自身的需求,爲Dubbo實現了一些新的功能,並將其命名爲Dubbox(即Dubbo eXtensions)。升級和提供的功能列表:github
支持REST風格遠程調用(HTTP + JSON/XML)spring
支持基於Kryo和FST的Java高效序列化實現apache
支持基於Jackson的JSON序列化json
支持基於嵌入式Tomcat的HTTP remoting體系api
升級Spring瀏覽器
升級ZooKeeper客戶端tomcat
支持徹底基於Java代碼的Dubbo配置服務器
......
總體設計圖:
各層說明:
服務提供方和服務消費方之間的調用關係,如圖所示:
圖例說明:
應用配置項主要使用:
<dubbo:application/>
應用配置,用於配置當前應用信息,無論該應用是提供者仍是消費者。配置項以下圖: 一個簡單的實例:
<dubbo:application name="demo-provider" owner="programmer" organization="dubbox" version="1.0.0" environment="product" compiler="javassist" logger="slf4j" />
注意:若是同一個應用部署多個實例建議name配置項變動,如: name="demo-provider1" ,name="demo-provider2" ,......,name="demo-providern"
服務啓動後查看註冊中心(稍後介紹)註冊服務地址(格式有所調整)爲:
com.alibaba.dubbo.demo.user.UserService? anyhost=true& application=demo-provider& application.version=1.0.0& compiler=javassist& dubbo=2.0.0& environment=product& generic=false& group=xmlConfig& interface=com.alibaba.dubbo.demo.user.UserService& logger=slf4j& methods=getUser,registerUser& optimizer=com.alibaba.dubbo.demo.SerializationOptimizerImpl& organization=dubbox& owner=programmer& pid=6116& serialization=kryo& side=provider ×tamp=1477272042362
應用配置項主要使用:
<dubbo:registry />
註冊中心配置;配置項以下圖: 一個簡單的實例:
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
全部的服務就註冊到zookeeper上了。 使用時須要在provider和consumer中增長zookeeper客戶端jar包依賴:
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency>
支持zkclient和curator兩種Zookeeper客戶端實現:從2.2.0版本開始缺省爲zkclient實現。須要添加一下依賴:
<dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency>
從2.3.0版本開始支持可選curator實現。若是須要改成curator實現,請配置:
<dubbo:registry ... client="curator" />
或:
dubbo.registry.client=curator
或:
zookeeper://10.20.153.10:2181?client=curator
需依賴:
<dependency> <groupId>com.netflix.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.5.0</version> </dependency>
Zookeeper單機配置:
<dubbo:registry address="zookeeper://10.20.153.10:2181" />
or:
<dubbo:registry protocol="zookeeper" address="10.20.153.10:2181" />
Zookeeper集羣配置:
<dubbo:registry address="zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181,10.20.153.12:2181" />
Or:
<dubbo:registry protocol="zookeeper" address="10.20.153.10:2181,10.20.153.11:2181,10.20.153.12:2181" />
服務提供者應用配置項主要使用:
<dubbo:protocol />
服務提供者協議配置,說明:若是須要支持多協議,能夠聲明多個dubbo:protocol標籤,並在dubbo:service中經過protocol屬性指定使用的協議。配置項以下圖:
一個簡單的實例:
<dubbo:protocol name="dubbo" serialization="kryo" optimizer="com.alibaba.dubbo.demo.SerializationOptimizerImpl"/>
另外一個:
<dubbo:protocol name="rest" port="8888" threads="500" contextpath="services" server="tomcat" accepts="500" extension="com.alibaba.dubbo.demo.extension.TraceInterceptor, com.alibaba.dubbo.demo.extension.TraceFilter, com.alibaba.dubbo.demo.extension.ClientTraceFilter, com.alibaba.dubbo.demo.extension.DynamicTraceBinding, com.alibaba.dubbo.demo.extension.CustomExceptionMapper, com.alibaba.dubbo.rpc.protocol.rest.support.LoggingFilter"/>
注意:配置項port建議顯示配置、最好將配置添加到配置文件中(dubbo.perties)中。部署集羣多個實例時必定要修改port端口,避免端口重複引發服務啓動失敗。
服務提供者配置項主要使用:
<dubbo:provider/>
說明:該標籤爲dubbo:service和dubbo:protocol標籤的缺省值設置。 部分配置項以下圖: 配置項均可可選的、所以在使用過程當中能夠不配置。
服務提供者配置項主要使用:
<dubbo:consumer/>
說明:該標籤爲dubbo:reference標籤的缺省值設置。 部分配置項以下圖: 配置項均可可選的、所以在使用過程當中能夠不配置。
服務監控配置項配置以下圖:
前提須要部署監控程序。監控程序部署在服務治理、監控使用說明中有介紹。
服務提供者暴露服務配置部分配置項: 兩個必須的配置項:
<dubbo:service interface="com.xdja.hysyb.rpc.api.user.IUserService" ref="userService" protocol="dubbo" /><!-- group="xmlConfig" --> <dubbo:service interface="com.xdja.hysyb.rpc.api.user.facade.IUserRestService" ref="userRestService" protocol="rest" validation="true"/>
前期能夠先了解簡單配置、高級特性等了解完畢後再作使用。
服務消費者引用服務配置部分配置項:
注意兩個必填項目:
一個簡單的實例:
<dubbo:reference id="userRestService" check="true" interface="com.xdja.hysyb.rpc.api.user.facade.IUserRestService"/> <dubbo:reference id="userService" check="true" interface="com.xdja.hysyb.rpc.api.user.IUserService" />
其餘一些配置項請參考: http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E9%85%8D%E7%BD%AE%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C
源代碼結構以下圖:
項目名稱 | 介紹 |
---|---|
soa-api | 接口定義(定義服務的接口) |
soa-parent | 生產服務、消費服務程序父項目結構 |
soa-consumer | 消費服務端項目 |
soa-provider | 生產服務端項目 |
soa-provider 項目的測試包下找到以下類: test.com.xdja.hysyb.rpc.api.impl.user.DemoProvider 直接運行main方法。 若是出現如下:
信息: Starting ProtocolHandler ["http-nio-8888"] [2016-11-04 16:37:09] Dubbo service server started!
啓動成功在本機8888端口。
由於生產端發佈的有rest服務和dubbo服務、rest服務能夠直接經過瀏覽器模擬測試:
瀏覽器直接輸入:
http://localhost:8888/services/users/1.json
運行效果圖:
soa-consumer項目的測試包下找到以下類: test.com.xdja.hysyb.rpc.demo.user.DemoConsumer 運行在控制檯查看效果以下:
[ConstraintViolationImpl{interpolatedMessage='User ID must be greater than 1', propertyPath=getUserArgument0, rootBeanClass=class com.xdja.hysyb.rpc.api.user.facade.IUserRestService_GetUserParameter, messageTemplate='User ID must be greater than 1'}] Client request filter invoked [04/11/16 04:45:42:042 CST] main INFO support.LoggingFilter: [DUBBO] The HTTP headers are: Accept: application/json;charset=UTF-8 Accept-Encoding: gzip, deflate Content-Type: application/json , dubbo version: 2.8.4, current host: 192.168.18.113 Writer interceptor invoked Dynamic writer interceptor invoked [04/11/16 04:45:42:042 CST] main INFO support.LoggingFilter: [DUBBO] The contents of response body is: {"id":1,"username":"zhangyq"} , dubbo version: 2.8.4, current host: 192.168.18.113