Dubbo-Without-Spring

1,758 阅读1分钟

背景

最近在整合 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~~