1 springmvc工程迁移
使用当当的dubbox,也就是dubbo2.8.4
版本时,我们的配置可以这样加载,一方面可以批量加载spring的配置,另一方面可以动态加载dubbo的消费端配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">
<!-- 通用配置 -->
<import resource="classpath*:/spring/spring-*.xml" />
<import resource="classpath*:/dubbo/dubbo-*.xml" />
</beans>
将接口类和消费端配置打包在一起,这样只要引用这个api,就都可以使用了。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:reference id="pebService"
interface="com.test.peb.api.service.PebService" check="${dubbo.reference.check}"
version="${dubbo.reference.version}" timeout="${dubbo.service.timeout}" retries="0" />
</beans>
但是dubbo2.8.4
并不支持docker化,因为没有k8s中dubbo注册IP问题中所属的环境变量。
直接切换jar到2.6.7版本,并不适用,因为他会不识别<import resource="classpath*:/dubbo/dubbo-*.xml" />
1.1 web工程
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.7</version>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<exclusions>
<exclusion>
<artifactId>netty</artifactId>
<groupId>io.netty</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
</dependency>
</dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<!--<scope>test</scope>-->
</dependency>
下面这个问题是curator相关的jar缺失造成的
Caused by: java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy
at com.alibaba.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter.connect(CuratorZookeeperTransporter.java:27)
at com.alibaba.dubbo.remoting.zookeeper.ZookeeperTransporter$Adaptive.connect(ZookeeperTransporter$Adaptive.java)
at com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry.<init>(ZookeeperRegistry.java:69)
at com.alibaba.dubbo.registry.zook
spring-dubbo.xml,这里要注意实现类不要用dubbo的service,而要用spring的service,否则会出现两条注册信息,一个带版本号,另一个不带,且不带版本的没有消费者,消费者也访问不到
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="${domain}" owner="${dubbo.owner}"
organization="${dubbo.organization}" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="${dubbo.registry.address}" />
<!-- 端口号,默认为20880 -->
<dubbo:protocol name="dubbo" port="${dubbo.protocol}" />
<!--统计服务的调用次调和调用时间的监控中心 -->
<!-- <dubbo:monitor protocol="registry"/> -->
<!--<dubbo:consumer check="false" />-->
<!-- 要暴露的服务接口 -->
<dubbo:annotation package="com.test" />
<dubbo:service interface="com.test.bdk.base.service.BdkWxService"
ref="bdkWxServiceImpl" validation="${dubbo.service.validation}"
version="${dubbo.service.version}" timeout="${dubbo.service.timeout}"
retries="${dubbo.service.retries}" loadbalance="${dubbo.service.loadbalance}"
actives="${dubbo.service.actives}" />
<dubbo:service interface="com.test.bdk.base.service.BdkPgsService"
ref="bdkPgsServiceImpl" validation="${dubbo.service.validation}"
version="${dubbo.service.version}" timeout="${dubbo.service.timeout}"
retries="${dubbo.service.retries}" loadbalance="${dubbo.service.loadbalance}"
actives="${dubbo.service.actives}" />
</beans>
1.2 dubbo的实现类工程
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.7</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
如果有dubbo2.8.4
导致冲突,则将他的引用排除出去
<dependency>
<groupId>com.test</groupId>
<artifactId>test-base</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<artifactId>dubbo</artifactId>
<groupId>com.alibaba</groupId>
</exclusion>
</exclusions>
</dependency>
出现下面的问题即是guava
缺失造成的
tory.BeanCreationException: Could not autowire field: private com.test.bdk.base.service.BdkWxService com.test.bwn.base.rest.controller.StoreController.bdkWxService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'wxService': FactoryBean threw exception on object creation; nested exception is java.lang.NoClassDefFoundError: com/google/common/base/Function
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
1.3 生产者和消费者配置
这个不用改变
2 springboot工程docker迁移(采用dubbo.xml的方式)
2.1 配置文件
dubbo.xml
使用nacos会加载不了变量,所以配置可以放在bootstrap.yml
中
2.2 启动工程
注意要排出dubbo2.8.4
的版本
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
<exclusions>
<exclusion>
<artifactId>dubbo</artifactId>
<groupId>com.alibaba</groupId>
</exclusion>
</exclusions>
</dependency>
启动类不作任何更改
如果使用加载配置,为防止多个消费者api的应用,可以采取下面的方式
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@Configuration
@RefreshScope
@ImportResource({"classpath*:dubbo/*.xml"
,"classpath*:spring/spring-*-api.xml"
})
public class DubboConfig {
dubbo.xml
配置如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="${domain}" owner="${dubbo.owner}"
organization="${dubbo.organization}" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="${dubbo.registry.address}" check="${dubbo.reference.check}"/>
<!-- 端口号,默认为20880 -->
<dubbo:protocol name="dubbo" port="${dubbo.registry.protocol}" />
<dubbo:consumer check="false" />
<!--统计服务的调用次调和调用时间的监控中心 -->
<!-- <dubbo:monitor protocol="registry"/> -->
<!-- 要暴露的服务接口 -->
<!-- <dubbo:annotation package="com.bwjf" /> -->
<dubbo:service interface="com.test.bzt.api.service.BztService"
ref="bztServiceImpl" validation="${dubbo.service.validation}"
version="${dubbo.service.version}" timeout="${dubbo.service.timeout}"
retries="${dubbo.service.retries}" loadbalance="${dubbo.service.loadbalance}"
actives="${dubbo.service.actives}" />
</beans>
2.2 dubbo服务实现类工程
配置xml即可
<!-- dubbo依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<!--<version>3.4.13</version>-->
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
</dependency>
2.3 接口部分
与springmvc的一致
1.1
问题
下面这个问题应该是docker镜像使用的tomcat7导致的
SEVERE: Unable to process Jar entry [module-info.class] from Jar [jar:file:/usr/local/tomcat/webapps/bdk/WEB-INF/lib/log4j-api-2.10.0.jar!/] for annotations
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19
at org.apache.tomcat.util.bcel.classfile.Constant.readConstant(Constant.java:97)
at org.apache.tomcat.util.bcel.classfile.ConstantPool.<init>(ConstantPool.java:55)
at org.apache.tomcat.util.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:176)
at org.apache.tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.java:85)
at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2104)
at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1980)
FROM tomcat:8.0.47-jre8
MAINTAINER test
COPY xwiki /usr/local/tomcat/webapps/xwiki
FROM tomcat:7.0.67-jre8
MAINTAINER test
ENV TOMCAT_HOME /usr/local/tomcat
ADD server.xml $TOMCAT_HOME/conf/service.xml
ADD dubbo-admin.war $TOMCAT_HOME/webapps
3.2 问题
工程代码中是找不到<dubbo:application />
,出现这个问题好像是因为当前这个工程即是生产者,又是消费者
Caused by: java.lang.IllegalStateException: Duplicate application configs: <dubbo:application name="peb-server" owner="test" organization="bwjf" id="peb-server" /> and <dubbo:application />
at com.alibaba.dubbo.config.spring.ReferenceBean.afterPropertiesSet(ReferenceBean.java:109)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1761)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1698)
... 17 common frames omitted
实际上并不是生产者、消费者问题导致的,而是dubbo-spring-boot-starter版本导致的0.2.1.RELEASE
,
在0.2.1.RELEASE
中无需设置<dubbo:application
,但是0.2.0
则需要,为了兼容,我这边采用了0.2.0
的版本
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
<exclusions>
<exclusion>
<artifactId>dubbo</artifactId>
<groupId>com.alibaba</groupId>
</exclusion>
</exclusions>
</dependency>
3.2 dubbo兼容性问题
从下图可以看到使用dubbo2.6.7
协议版本号是2.0.2
从下图可以看到dubbox使用的dubbo2.8.4
,这两者协议版本不同,兼容应该会出现问题
德不孤,必有邻,这里dubbox升级至apache-dubbo-2.7.2的兼容方案遇到跟我一样的问题,按照此方法调整解码编码即可
注意
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.20.0-GA</version>
</dependency>