背景
最近在整合 Dubbo 到自己公司的项目中, 因为公司的项目使用了非 Spring的运行环境, 且项目较为老旧难以改造, 没有办法, 只得使用 API 的形式集成 Dubbo, 于是自己开始整合吧.
整合 Dubbo V1
在集成过程中, 去 maven repo 下载了最新的 dubbo-all, 放到项目中, 写好例子运行起来时, 发现报了spring的错误, 可以看下这个issue
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:520)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:501)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:120)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4660)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5181)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1678)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:463)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:413)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1466)
at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1307)
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1399)
at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:828)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
at sun.rmi.transport.Transport$1.run(Transport.java:178)
at sun.rmi.transport.Transport$1.run(Transport.java:175)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:174)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:557)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:812)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:671)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
于是, 自己很苦逼的开始单独依赖每个dubbo-xxx 这些是我做demo时, 加入的依赖, 可能有些描述不正确, 可以提出一起探讨.
# dubbo 公共基础库, 必选
dubbo-common-2.6.3.jar
# dubbo 配置 API , 必选
dubbo-config-api-2.6.3.jar
# dubbo 注册中心 API , 必选
dubbo-registry-api-2.6.3.jar
# dubbo zookeeper 注册中心, 如果注册中心是zookeeper, 必选
dubbo-registry-zookeeper-2.6.3.jar
# dubbo 默认 注册中心, 如果注册中心是dubbo, 必选
dubbo-registry-default-2.6.3.jar
# dubbo 远程调用 API , 必选
dubbo-remoting-api-2.6.3.jar
# dubbo 远程调用 netty, 可选
dubbo-remoting-netty-2.6.3.jar
# dubbo 远程调用 zookeeper, 如果注册中心是zookeeper, 必选
dubbo-remoting-zookeeper-2.6.3.jar
# dubbo RPC协议 API , 必选
dubbo-rpc-api-2.6.3.jar
# dubbo 路由基础库, 必选
dubbo-cluster-2.6.3.jar
# dubbo RPC Dubbo 协议, 可选
dubbo-rpc-dubbo-2.6.3.jar
# dubbo 数据序列化 API, 必选
dubbo-serialization-api-2.6.3.jar
# dubbo 数据序列化 hessian2 实现, 必选
dubbo-serialization-hessian2-2.6.3.jar
# dubbo hessian2 依赖, 必选
hessian-lite-3.2.4.jar
# dubbo netty 依赖, 必选
netty-3.2.10.Final.jar
# dubbo zookeeper 依赖, 如果注册中心是zookeeper, 必选
zookeeper-3.4.13.jar
# dubbo curator 依赖, 必选
curator-client-4.0.1.jar
# dubbo curator 依赖, 必选
curator-framework-4.0.1.jar
# dubbo javassist 依赖, 必选
javassist-3.23.1-GA.jar
自己之前也写了一篇文章了讲述这个整合的过程, 大家有兴趣可以看看 JFinal+Dubbo整合文档
整合 Dubbo V2
在上一次整合时, 自己很苦逼的调试了很久, 今天需要把Dubbo整合到项目中, 结果发现例子代码丢了... 没办法, 又重新写了一遍, 在准备提交时, 看了下, 哇塞, 要加这么多依赖, 好烦, 想想有没有其他的方法能集成的. 于是又看了看 Dubbo 的源码, 发现 dubbo-all 的编译, 来源于 Dubbo 项目中 dubbo-all 这个 module, 于是心生一计, 改这个dubbo-all的pom, 移除spring的依赖, 再重新编译一下, 不就可以了么~~, 于是自己给官方提了个 issue Provide dubbo-all-without-spring module, 同时自己也fork了源码, 把 dubbo-all-without-spring module 加了进去.
本地编译步骤 dubbo-all-without-spring
下载最新 dubbo 源码, 可查看[release]页面
wget https://github.com/apache/incubator-dubbo/archive/dubbo-2.6.4.zip
解压源码, 并进入解压后的文件夹
unzip dubbo-2.6.4.zip
cd incubator-dubbo-dubbo-2.6.4/all
修改 dubbo-all pom.xml, 注释掉所有spring依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-config-spring</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-container-spring</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<include>com.alibaba:dubbo-config-spring</include>
<include>com.alibaba:dubbo-container-spring</include>
编译, 生成 dubbo-without-spring
mvn clean install
把原有的dubbo-xxx 全部移除, 并添加 dubbo-without-spring 测试了下, 没有问题, 可以使用~
更改后的依赖
# dubbo all without spring, 必选
dubbo-without-spring-2.6.3.jar
# dubbo netty 依赖, 必选
netty-3.2.10.Final.jar
# dubbo zookeeper 依赖, 如果注册中心是zookeeper, 必选
zookeeper-3.4.13.jar
# dubbo curator 依赖, 必选
curator-client-4.0.1.jar
# dubbo curator 依赖, 必选
curator-framework-4.0.1.jar
# dubbo javassist 依赖, 必选
javassist-3.23.1-GA.jar
Have fun~~