dubbox文档

来源:互联网 发布:软件价格 编辑:程序博客网 时间:2024/06/14 12:27

一、网址

官方:https://github.com/dangdangdotcom/dubbox

参考:https://www.douban.com/note/488997143/


二、说明

1、问题:https://github.com/dangdangdotcom/dubbox/issues

2、主要:

Dubbox now means Dubbo eXtensions. If you know java, javax and dubbo, you know what dubbox is :)

Dubbox adds features like RESTful remoting, Kyro/FST serialization, etc to the popular dubbo service framework. It's been used by several projects of dangdang.com, which is one of the major e-commerce companies in China.

主要贡献者

  • 沈理 当当网 shenli@dangdang.com
  • 王宇轩 当当网 wangyuxuan@dangdang.com
  • 马金凯 韩都衣舍 majinkai@handu.com
  • Dylan 独立开发者 dinguangx@163.com
  • Kangfoo 独立开发者

有技术问题请移步此处讨论 https://github.com/dangdangdotcom/dubbox/issues

Dubbox当前的主要功能

  • 支持REST风格远程调用(HTTP + JSON/XML):基于非常成熟的JBoss RestEasy框架,在dubbo中实现了REST风格(HTTP + JSON/XML)的远程调用,以显著简化企业内部的跨语言交互,同时显著简化企业对外的Open API、无线API甚至AJAX服务端等等的开发。事实上,这个REST调用也使得Dubbo可以对当今特别流行的“微服务”架构提供基础性支持。 另外,REST调用也达到了比较高的性能,在基准测试下,HTTP + JSON与Dubbo 2.x默认的RPC协议(即TCP + Hessian2二进制序列化)之间只有1.5倍左右的差距,详见文档中的基准测试报告。

  • 支持基于Kryo和FST的Java高效序列化实现:基于当今比较知名的Kryo和FST高性能序列化库,为Dubbo默认的RPC协议添加新的序列化实现,并优化调整了其序列化体系,比较显著的提高了Dubbo RPC的性能,详见文档中的基准测试报告。

  • 支持基于Jackson的JSON序列化:基于业界应用最广泛的Jackson序列化库,为Dubbo默认的RPC协议添加新的JSON序列化实现。

  • 支持基于嵌入式Tomcat的HTTP remoting体系:基于嵌入式tomcat实现dubbo的HTTP remoting体系(即dubbo-remoting-http),用以逐步取代Dubbo中旧版本的嵌入式Jetty,可以显著的提高REST等的远程调用性能,并将Servlet API的支持从2.5升级到3.1。(注:除了REST,dubbo中的WebServices、Hessian、HTTP Invoker等协议都基于这个HTTP remoting体系)。

  • 升级Spring:将dubbo中Spring由2.x升级到目前最常用的3.x版本,减少版本冲突带来的麻烦。

  • 升级ZooKeeper客户端:将dubbo中的zookeeper客户端升级到最新的版本,以修正老版本中包含的bug。

  • 支持完全基于Java代码的Dubbo配置:基于Spring的Java Config,实现完全无XML的纯Java代码方式来配置dubbo

  • 调整Demo应用:暂时将dubbo的demo应用调整并改写以主要演示REST功能、Dubbo协议的新序列化方式、基于Java代码的Spring配置等等。

  • 修正了dubbo的bug 包括配置、序列化、管理界面等等的bug。

注:dubbox和dubbo 2.x是兼容的,没有改变dubbo的任何已有的功能和配置方式(除了升级了spring之类的版本)

文档资料

在Dubbo中开发REST风格的远程调用(RESTful Remoting)

在Dubbo中使用高效的Java序列化(Kryo和FST)

使用JavaConfig方式配置dubbox

Dubbo Jackson序列化使用说明

Demo应用简单运行指南

Dubbox@InfoQ

Dubbox Wiki (由社区志愿者自由编辑的)

版本

详见:https://github.com/dangdangdotcom/dubbox/releases

  • dubbox-2.8.0:主要支持REST风格远程调用、支持Kryo和FST序列化、升级了Spring和Zookeeper客户端、调整了demo应用等等
  • dubbox-2.8.1:主要支持基于嵌入式tomcat的http-remoting,优化了REST客户端性能,在REST中支持限制服务端接纳的最大HTTP连接数等等
  • dubbox-2.8.2
    • 支持REST中的HTTP logging,包括HTTP header的字段和HTTP body中的消息体,方便调试、日志纪录等等
    • 提供辅助类便于REST的中文处理
    • 改变使用@Reference annotation配置时的异常处理方式,即当用annotation配置时,过去dubbo在启动期间不抛出依赖服务找不到的异常,而是在具体调用时抛出NPE,这与用XML配置时的行为不一致。
    • 较大的充实了Dubbo REST的文档
  • dubbox-2.8.3
    • 在REST中支持dubbo统一的方式用bean validation annotation作参数校验(沈理)
    • 在RpcContext上支持获取底层协议的Request/Response(沈理)
    • 支持采用Spring的Java Config方式配置dubbo(马金凯)
    • 在Dubbo协议中支持基于Jackson的json序列化(Dylan)
    • 在Spring AOP代理过的对象上支持dubbo annotation配置(Dylan)
    • 修正Dubbo管理界面中没有consumer时出现空指针异常(马金凯)
    • 修正@Reference annotation中protocol设置不起作用的bug(沈理)
    • 修正@Reference annotation放在setter方法上即会出错的bug(Dylan)

依赖

从dubbox-2.8.4开始,所有依赖库的使用方式将和dubbo原来的一样:即如果要使用REST、Kyro、FST、Jackson等功能,需要用户自行手工添加相关的依赖。例如:

REST风格远程调用

<dependency>    <groupId>org.jboss.resteasy</groupId>    <artifactId>resteasy-jaxrs</artifactId>    <version>3.0.7.Final</version></dependency><dependency>    <groupId>org.jboss.resteasy</groupId>    <artifactId>resteasy-client</artifactId>    <version>3.0.7.Final</version></dependency><dependency>    <groupId>javax.validation</groupId>    <artifactId>validation-api</artifactId>    <version>1.0.0.GA</version></dependency><!-- 如果要使用json序列化 --><dependency>    <groupId>org.jboss.resteasy</groupId>    <artifactId>resteasy-jackson-provider</artifactId>    <version>3.0.7.Final</version></dependency><!-- 如果要使用xml序列化 --><dependency>    <groupId>org.jboss.resteasy</groupId>    <artifactId>resteasy-jaxb-provider</artifactId>    <version>3.0.7.Final</version></dependency><!-- 如果要使用netty server --><dependency>    <groupId>org.jboss.resteasy</groupId>    <artifactId>resteasy-netty</artifactId>    <version>3.0.7.Final</version></dependency><!-- 如果要使用Sun HTTP server --><dependency>    <groupId>org.jboss.resteasy</groupId>    <artifactId>resteasy-jdk-http</artifactId>    <version>3.0.7.Final</version></dependency><!-- 如果要使用tomcat server --><dependency>    <groupId>org.apache.tomcat.embed</groupId>    <artifactId>tomcat-embed-core</artifactId>    <version>8.0.11</version></dependency><dependency>    <groupId>org.apache.tomcat.embed</groupId>    <artifactId>tomcat-embed-logging-juli</artifactId>    <version>8.0.11</version></dependency>

Kyro序列化

<dependency>    <groupId>com.esotericsoftware.kryo</groupId>    <artifactId>kryo</artifactId>    <version>2.24.0</version></dependency><dependency>    <groupId>de.javakaffee</groupId>    <artifactId>kryo-serializers</artifactId>    <version>0.26</version></dependency>

FST序列化

<dependency>    <groupId>de.ruedigermoeller</groupId>    <artifactId>fst</artifactId>    <version>1.55</version></dependency>

Jackson序列化

<dependency>    <groupId>com.fasterxml.jackson.core</groupId>    <artifactId>jackson-core</artifactId>    <version>2.3.3</version></dependency><dependency>    <groupId>com.fasterxml.jackson.core</groupId>    <artifactId>jackson-databind</artifactId>    <version>2.3.3</version></dependency>

FAQ(暂存)

Dubbox需要什么版本的JDK?

目前最好在JDK 1.7以上运行

Dubbo REST的服务能和Dubbo注册中心、监控中心集成吗?

可以的,而且是自动集成的,也就是你在dubbo中开发的所有REST服务都会自动注册到服务册中心和监控中心,可以通过它们做管理。

但是,只有当REST的消费端也是基于dubbo的时候,注册中心中的许多服务治理操作才能完全起作用。而如果消费端是非dubbo的,自然不受注册中心管理,所以其中很多操作是不会对消费端起作用的。

Dubbo REST中如何实现负载均衡和容错(failover)?

如果dubbo REST的消费端也是dubbo的,则Dubbo REST和其他dubbo远程调用协议基本完全一样,由dubbo框架透明的在消费端做load balance、failover等等。

如果dubbo REST的消费端是非dubbo的,甚至是非java的,则最好配置服务提供端的软负载均衡机制,目前可考虑用LVS、HAProxy、 Nginx等等对HTTP请求做负载均衡。

JAX-RS中重载的方法能够映射到同一URL地址吗?

http://stackoverflow.com/questions/17196766/can-resteasy-choose-method-based-on-query-params

JAX-RS中作POST的方法能够接收多个参数吗?

http://stackoverflow.com/questions/5553218/jax-rs-post-multiple-objects


三、举例

需要2核4G的机器,内存稍大才可以编译成功

git clone https://github.com/alibaba/dubbo.git
mvn clean install -Dmaven.test.skip
export MAVEN_OPTS="-Xms512m -Xmx1024m"

1、启动zk
cd /opt/zk/conf
cp zoo_sample.cfg zoo.cfg
cd ../bin
./zkServer.sh start

2、启动admin
cd ~/dubbo/dubbo-admin
target里面的war包丢到tomcat的webapps目录下面去
然后bin/statup.sh
启动之后8080端口即可以向外服务
http://xxxx:8080/dubbo-admin/
会提示你输入用户名和密码,root,root......


3、启动monitor
cd ~/dubbo/dubbo-simple/dubbo-monitor-simple/target
./start.sh
vi dubbo.properties
   - edit: dubbo.registry.adddress=dubbo://127.0.0.1:9090
cd ../bin
./restart.sh

=============================================================
dubbox

1、项目地址
https://github.com/dangdangdotcom/dubbox.git

-------------------------------------------

2、编译
git clone https://github.com/dangdangdotcom/dubbox.git

cd dubbox/
export MAVEN_OPTS="-Xms512m -Xmx1024m"
mvn clean install -Dmaven.test.skip


-------------------------------------------

3、安装java环境

安装JAVA----CENTOS 6.6,64位系统,JDK 7

包是使用scp上传到目标机器的

tar zxvf jdk.tar.gz
mv jdk/ /opt/

sudo update-alternatives --install /usr/bin/java java /opt/jdk/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /opt/jdk/bin/javac 300
sudo update-alternatives --install /usr/bin/jar jar /opt/jdk/bin/jar 300
sudo update-alternatives --config java

vim /etc/profile
export JAVA_HOME=/opt/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

验证
java -version

java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)

-------------------------------------------

4、安装zookeeper

【参考资料1:http://www.iyunv.com/thread-18609-1-1.html
【参考资料2:http://my.oschina.net/u/1866130/blog/287363

http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/
zk有依赖于jdk

wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
tar zxvf zookeeper-3.4.6.tar.gz
mv zookeeper-3.4.6 /opt/zk
mkdir tools
mv jdk.tar.gz zookeeper-3.4.6.tar.gz tools/

如果想把一个文件1的内容清空, 文件大小变成0, 又不删除这个文件,可以用:
cat /dev/null > 文件1

单机启用:
cd /opt/zk/conf
cp zoo_sample.cfg zoo.cfg
cd ../bin
./zkServer.sh start

配置集群模式:三台机器上分别运行(一定要确保ping三个ip之间是正确的,FQDN的问题)

echo '192.168.60.10 zk1' >>/etc/hosts
echo '192.168.60.11 zk2' >>/etc/hosts
echo '192.168.60.12 zk3' >>/etc/hosts

cp /opt/zk/conf/zoo_sample.cfg /opt/zk/conf/zoo.cfg
echo 'server.1=zk1:2888:3888' >> /opt/zk/conf/zoo.cfg
echo 'server.2=zk2:2888:3888' >> /opt/zk/conf/zoo.cfg
echo 'server.3=zk3:2888:3888' >> /opt/zk/conf/zoo.cfg

mkdir /opt/zk/storage
sed -i "s/\/tmp\/zookeeper/\/opt\/zk\/storage/g" /opt/zk/conf/zoo.cfg

三台机器上分别执行:
echo "1" > /opt/zk/storage/myid
echo "2" > /opt/zk/storage/myid
echo "3" > /opt/zk/storage/myid

三台机器上分别运行:
/opt/zk/bin/zkServer.sh start

然后检查各个主机的状态是:
/opt/zk/bin/zkServer.sh status

=======================================================================

5、安装maven
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.tar.gz

tar zxvf apache-maven-3.2.5-bin.tar.gz
mv apache-maven-3.2.5 /opt/maven

vim /etc/profile
export M2_HOME=/opt/maven
export M2=$M2_HOME/bin
export PATH=$M2:$PATH


=======================================================================

6、运行dubbox

6.1、启动zk
cd /opt/zk/conf
cp zoo_sample.cfg zoo.cfg
cd ../bin
./zkServer.sh start

6.2、启动admin
cd ~/dubbo/dubbo-admin
target里面的war包丢到tomcat的webapps目录下面去
然后bin/statup.sh
启动之后8080端口即可以向外服务
http://xxxx:8080/dubbo-admin/
会提示你输入用户名和密码,root,root......


6.3、启动monitor
cd ~/dubbo/dubbo-simple/dubbo-monitor-simple/target
./start.sh
vi dubbo.properties
   - edit: dubbo.registry.adddress=dubbo://127.0.0.1:9090
cd ../bin
./restart.sh


-------------------------------------
-------------------------------------

6.4 运行demo
首先保证zk启动成功了,得注意/tmp下有没有脏数据
然后进入dubbo-demo文件夹

-------------------------------------
6.4.1 运行消费方

#pwd 消费者方
/root/dubbox/dubbo-demo/dubbo-demo-consumer/target

#解压消费方:
tar zxvf dubbo-demo-consumer-2.8.4-SNAPSHOT-assembly.tar.gz

[root@200248 target]# cd dubbo-demo-consumer-2.8.4-SNAPSHOT
[root@200248 dubbo-demo-consumer-2.8.4-SNAPSHOT]# ls
bin conf lib
[root@200248 dubbo-demo-consumer-2.8.4-SNAPSHOT]# ll
总用量 12
drwxrwxrwx. 2 root root 4096 3月 17 13:45 bin
drwxrwxrwx. 2 root root 4096 3月 17 13:26 conf
drwxr-xr-x. 2 root root 4096 3月 17 13:52 lib

#修改配置使用zk注册
/root/dubbox/dubbo-demo/dubbo-demo-consumer/target/dubbo-demo-consumer-2.8.4-SNAPSHOT/conf

vim dubbo.properties

#################
dubbo.container=log4j,spring
dubbo.application.name=demo-consumer
dubbo.application.owner=
dubbo.registry.address=multicast://224.5.6.7:1234
#dubbo.registry.address=zookeeper://127.0.0.1:2181
#dubbo.registry.address=redis://127.0.0.1:6379
#dubbo.registry.address=dubbo://127.0.0.1:9090
dubbo.monitor.protocol=registry
dubbo.log4j.file=logs/dubbo-demo-consumer.log
dubbo.log4j.level=WARN
#################
注销掉2181那行

#启动消费方
/root/dubbox/dubbo-demo/dubbo-demo-consumer/target/dubbo-demo-consumer-2.8.4-SNAPSHOT/bin
./start.sh
就启动了消费方



-------------------------------------

6.4.2 运行服务方

【安装tomcat】
wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-7/v7.0.59/bin/apache-tomcat-7.0.59.tar.gz
tar zxvf apache-tomcat-7.0.59.tar.gz

【拷贝war包】
cp dubbo-demo-provider-2.8.4-SNAPSHOT.war apache-tomcat-7.0.59/webapps/

【启动tomcat】
/root/dubbox/dubbo-demo/dubbo-demo-provider/target/apache-tomcat-7.0.59/bin
./startup.sh

【看logs是否有报错】

-------------------------------------

6.4.3 运行顺序---

反了,应该先服务方后消费方的

-------------------------------------

6.4.4 zk目录结构

ls /dubbo
[com.alibaba.dubbo.demo.user.facade.AnotherUserRestService, com.alibaba.dubbo.demo.user.facade.UserRestService, com.alibaba.dubbo.demo.bid.BidService, com.alibaba.dubbo.monitor.MonitorService, com.alibaba.dubbo.demo.user.UserService]

ls /dubbo/com.alibaba.dubbo.demo.user.facade.AnotherUserRestService
[consumers, routers, providers, configurators]

ls /dubbo/com.alibaba.dubbo.demo.user.facade.AnotherUserRestService/consumers
[consumer%3A%2F%2F172.17.42.1%2Fcom.alibaba.dubbo.demo.user.facade.AnotherUserRestService%3Fapplication%3Ddemo-consumer%26category%3Dconsumers%26check%3Dfalse%26dubbo%3D2.8.4-SNAPSHOT%26interface%3Dcom.alibaba.dubbo.demo.user.facade.AnotherUserRestService%26methods%3DgetUser%2CregisterUser%26organization%3Ddubbox%26owner%3Dprogrammer%26pid%3D16139%26revision%3D2.8.4-SNAPSHOT%26side%3Dconsumer%26timestamp%3D1426572244534]


ls /dubbo/com.alibaba.dubbo.demo.user.facade.AnotherUserRestService/routers
[]

ls /dubbo/com.alibaba.dubbo.demo.user.facade.AnotherUserRestService/providers
[rest%3A%2F%2F172.17.42.1%3A8888%2Fservices%2Fcom.alibaba.dubbo.demo.user.facade.AnotherUserRestService%3Faccepts%3D500%26anyhost%3Dtrue%26application%3Ddemo-provider%26connections%3D100%26dubbo%3D2.8.4-SNAPSHOT%26extension%3Dcom.alibaba.dubbo.demo.extension.TraceInterceptor%2C+++++++++++++++++++++com.alibaba.dubbo.demo.extension.TraceFilter%2C+++++++++++++++++++++com.alibaba.dubbo.demo.extension.ClientTraceFilter%2C+++++++++++++++++++++com.alibaba.dubbo.demo.extension.DynamicTraceBinding%2C+++++++++++++++++++++com.alibaba.dubbo.demo.extension.CustomExceptionMapper%2C+++++++++++++++++++++com.alibaba.dubbo.rpc.protocol.rest.support.LoggingFilter%26generic%3Dfalse%26interface%3Dcom.alibaba.dubbo.demo.user.facade.AnotherUserRestService%26methods%3DgetUser%2CregisterUser%26organization%3Ddubbox%26owner%3Dprogrammer%26pid%3D15860%26revision%3D2.8.4-SNAPSHOT%26server%3Dtomcat%26side%3Dprovider%26threads%3D500%26timeout%3D2000%26timestamp%3D1426572079232%26validation%3Dtrue]

ls /dubbo/com.alibaba.dubbo.demo.user.facade.AnotherUserRestService/configurators
[]


-------------------------------------
6.4.5 运行一个简单监控

/root/dubbox/dubbo-simple/dubbo-monitor-simple/target

#解压
tar zxvf dubbo-monitor-simple-2.8.4-SNAPSHOT-assembly.tar.gz

cd /root/dubbox/dubbo-simple/dubbo-monitor-simple/target/dubbo-monitor-simple-2.8.4-SNAPSHOT

#进入conf目录
dubbo.container=log4j,spring,registry,jetty
dubbo.application.name=simple-monitor
dubbo.application.owner=
#dubbo.registry.address=multicast://224.5.6.7:1234
dubbo.registry.address=zookeeper://127.0.0.1:2181
#dubbo.registry.address=redis://127.0.0.1:6379
#dubbo.registry.address=dubbo://127.0.0.1:9090
dubbo.protocol.port=7070
dubbo.jetty.port=8080
dubbo.jetty.directory=${user.home}/monitor
dubbo.charts.directory=${dubbo.jetty.directory}/charts
dubbo.statistics.directory=${user.home}/monitor/statistics
dubbo.log4j.file=logs/dubbo-monitor-simple.log
dubbo.log4j.level=WARN

¥¥¥¥¥¥¥¥¥¥¥¥¥

打开zk开关,最后监听的端口是?8080


cd ~/dubbo/dubbo-simple/dubbo-monitor-simple/target
./start.sh
vi dubbo.properties
   - edit: dubbo.registry.adddress=dubbo://127.0.0.1:9019
cd ../bin
./restart.sh

----------------------------------------------------
之后
zk下/dubbo/目录下会多一个目录
com.alibaba.dubbo.monitor.MonitorService

ls /dubbo/com.alibaba.dubbo.monitor.MonitorService
[consumers, routers, providers, configurators]
[zk: localhost:2181(CONNECTED) 18]




----------------------------------------------------

服务方的协议URL解析:

rest://172.17.42.1:8888/services/
com.alibaba.dubbo.demo.user.facade.AnotherUserRestService?
accepts=500&
anyhost=true&
application=demo-provider&
connections=100&
dubbo=2.8.4-SNAPSHOT&
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&
generic=false&
interface=com.alibaba.dubbo.demo.user.facade.AnotherUserRestService&
methods=getUser,registerUser&
organization=dubbox&
owner=programmer&
pid=15860&
revision=2.8.4-SNAPSHOT&
server=tomcat&
side=provider&
threads=500&
timeout=2000&
timestamp=1426572079232&
validation=true


http://192.168.200.248:8888/com.alibaba.dubbo.demo.user.facade.AnotherUserRestService

http://192.168.200.248:8888/com.alibaba.dubbo.demo.user.facade.AnotherUserRestService/getUser/

=======================================================================



REST的优点

以下摘自维基百科:

  • 可更高效利用缓存来提高响应速度
  • 通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性
  • 浏览器即可作为客户端,简化软件需求
  • 相对于其他叠加在HTTP协议之上的机制,REST的软件依赖性更小
  • 不需要额外的资源发现机制
  • 在软件技术演进中的长期的兼容性更好

这里我还想特别补充REST的显著优点:基于简单的文本格式消息和通用的HTTP协议,使它具备极广的适用性,几乎所有语言和平台都对它提供支持,同时其学习和使用的门槛也较低。




dubbox详细介绍:http://dangdangdotcom.github.io/dubbox/rest.html




0 0