美文网首页
1、dubbo整合spring

1、dubbo整合spring

作者: ltjxwxz | 来源:发表于2017-10-17 13:44 被阅读0次

前言:
其实我们的初衷,不是把项目做成微服务,而是想有一个随时可以调用的服务,但是实际过程中,我们打成jar包后,这个数据库比较的项目有自己的spring,ibatis配置,有自己的逻辑,和被调用的项目糅合,掺杂在一起,再被第三个项目调用,就会出现jar包冲突,依赖传递等问题,为了解决这些问题,导致项目结构被改得有些混乱。所以,单独出来,对外只暴露一个接口,是比较好的选择,这样不同项目间的配置不再相互影响了。

分析:分两个项目,第一个只提供一个接口被消费者引用,第二个提供具体的实现。
(1)接口项目 compareTable
CompareTableService

public interface CompareTableService {
 // paramMap中传orderId,proposalNoList
 void compareTableCar(Map<String, List<String>> paramMap, String expectKey);
 
 // paramMap里传orderId, policyNo
 void compareTableNoCar(Map<String, String> paramMap, String expectKey);
 
 // paramMap传proposalNo
 void compareTableCPI(Map<String, List<String>> paramMap, String expectKey,
 String appName, String productName, String processName);
}

(2)实现类所在项目(生产者)compareTable_impl

  • CompareTableServiceImpl
@Service("compareTableServiceImpl")
public class CompareTableServiceImpl implements CompareTableService {
 private static Logger logger = LoggerFactory.getLogger(CompareTableServiceImpl.class);
 
 @Autowired
 private PrptorderproposalDao prptorderproposalDao;
 @Autowired
 private AtprptorderproposalDao atprptorderproposalDao;
 @Autowired
 private AtcomparetableDao atcomparetableDao;
......
}

出错重点:部署中遇到一个加载顺序问题,由于 dubbo配置文件applicationContext_provider.xml中用到了service,service中又注入了由普通spirng管理的bean,为了避免prptorderproposalDao等注入为null,需要先加载applicationContext.xml,由于注入属性较多,写xml不方便,所以用注解@Service("compareTableServiceImpl"),然后在applicationContext_provider.xml中被引用。

  • 自己写的启动类Provider
public class Provider {
    public static void main(String[] args) {  
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(    
                new String[]{"spring/applicationContext_compare.xml"});    
        context.start();  
        System.out.println("提供者服务已注册成功");    
        try {  
            System.in.read();//让此程序一直跑,表示一直提供服务  
        } catch (IOException e) {        
            e.printStackTrace();  
        }    
    }  
}
  • 生产者dubbo配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="[http://www.springframework.org/schema/beans](http://www.springframework.org/schema/beans)"
 xmlns:xsi="[http://www.w3.org/2001/XMLSchema-instance](http://www.w3.org/2001/XMLSchema-instance)" xmlns:dubbo="[http://code.alibabatech.com/schema/dubbo](http://code.alibabatech.com/schema/dubbo)"
 xmlns:context="[http://www.springframework.org/schema/context](http://www.springframework.org/schema/context)"
 xsi:schemaLocation="[http://www.springframework.org/schema/beans](http://www.springframework.org/schema/beans)  
        [http://www.springframework.org/schema/beans/spring-beans.xsd](http://www.springframework.org/schema/beans/spring-beans.xsd)  
        [http://code.alibabatech.com/schema/dubbo](http://code.alibabatech.com/schema/dubbo)  
        [http://code.alibabatech.com/schema/dubbo/dubbo.xsd](http://code.alibabatech.com/schema/dubbo/dubbo.xsd)
        [http://www.springframework.org/schema/context](http://www.springframework.org/schema/context)
     [http://www.springframework.org/schema/context/spring-context.xsd](http://www.springframework.org/schema/context/spring-context.xsd)">

 <!-- 应用名,用于计算依赖关系,不是匹配条件 -->
 <dubbo:application name="compareTableService" />

 <!-- 使用zookeeper注册中心暴露服务地址 -->
  <!-- <dubbo:registry id="zookeeper-15272181" address="zookeeper://127.0.0.1:2181" /> -->
  <dubbo:registry id="zookeeper-15272181" address="zookeeper://10.10.56.21:7796" />
  
 <!-- 用dubbo协议在20881端口暴露服务 -->
 <dubbo:protocol name="dubbo" port="7699" />

 <!-- 使用zookeeper注册中心查找监控中心 -->
 <dubbo:monitor protocol="registry" />

 <!-- 声明需要暴露的服务接口 -->
 <dubbo:service interface="XXX.CompareTableService"
 ref="compareTableServiceImpl" registry="zookeeper-15272181" timeout="10000000" />
</beans>
  • dubbo.properties
#dubbo\u914D\u7F6E
dubbo.container=spring
dubbo.spring.config=classpath:spring/applicationContext.xml,\
 classpath:spring/applicationContext_provider.xml

注意加载顺序:spring的在前,dubbo的在后

  • maven部分新增依赖,插件pom.xml
 <!-- logback start -->
 <dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>log4j-over-slf4j</artifactId>
 <version>1.7.21</version>
 </dependency>
 <dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-api</artifactId>
 <version>1.7.24</version>
 </dependency>
 <dependency>
 <groupId>ch.qos.logback</groupId>
 <artifactId>logback-classic</artifactId>
 <version>${logback.version}</version>
 </dependency>
 <dependency>
 <groupId>ch.qos.logback</groupId>
 <artifactId>logback-core</artifactId>
 <version>${logback.version}</version>
 </dependency>
 <dependency>
 <groupId>ch.qos.logback</groupId>
 <artifactId>logback-access</artifactId>
 <version>${logback.version}</version>
 </dependency>

 <dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>dubbo</artifactId>
 <version>2.5.3</version>
 <exclusions>
 <exclusion>
 <groupId>org.springframework</groupId>
 <artifactId>spring</artifactId>
 </exclusion>
 <exclusion>
 <groupId>log4j</groupId>
 <artifactId>log4j</artifactId>
 </exclusion>
 </exclusions>
 </dependency>
 <dependency>
 <groupId>org.apache.zookeeper</groupId>
 <artifactId>zookeeper</artifactId>
 <version>3.3.6</version>
 <exclusions>
 <exclusion>
 <groupId>log4j</groupId>
 <artifactId>log4j</artifactId>
 </exclusion>
 <exclusion>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>
 </exclusion>
 </exclusions>
 </dependency>
 <dependency>
 <groupId>com.101tec</groupId>
 <artifactId>zkclient</artifactId>
 <version>0.9</version>
 <exclusions>
 <exclusion>
 <groupId>log4j</groupId>
 <artifactId>log4j</artifactId>
 </exclusion>
 <exclusion>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>
 </exclusion>
 </exclusions>
 </dependency>
 <dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>fastjson</artifactId>
 <version>1.1.23</version>
 </dependency>

<!-- 微服务打包命令详解,本命令主要实现 1、配置当前工程打包参数,如输出路径、例外文件列表、入口类 等信息,jar包输出至${project.build.directory}/${project.artifactId}/lib路径下
 2、将本工程下dependencies copy至指定路径${project.build.directory}/${project.artifactId}/lib路径下
 3、将本工程例外文件copy至指定路径${project.build.directory}/${project.artifactId}/conf路径下 -->
 <build>
 <pluginManagement>
 <plugins>
 <!-- 解决Maven插件在Eclipse内执行了一系列的生命周期引起冲突 -->
 <plugin>
 <groupId>org.eclipse.m2e</groupId>
 <artifactId>lifecycle-mapping</artifactId>
 <version>1.0.0</version>
 <configuration>
 <lifecycleMappingMetadata>
 <pluginExecutions>
 <pluginExecution>
 <pluginExecutionFilter>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-dependency-plugin</artifactId>
 <versionRange>[2.0,)</versionRange>
 <goals>
 <goal>copy-dependencies</goal>
 </goals>
 </pluginExecutionFilter>
 <action>
 <ignore></ignore>
 </action>
 </pluginExecution>
 </pluginExecutions>
 </lifecycleMappingMetadata>
 </configuration>
 </plugin>
 </plugins>
 </pluginManagement>

 <!-- 配置当前工程打包参数,如输出路径、例外文件列表、入口类 等信息 -->
 <plugins>
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-compiler-plugin</artifactId>
 <version>2.0.2</version>
 <configuration>
 <source>1.6</source>
 <target>1.6</target>
 <encoding>UTF-8</encoding><!--指定编码格式,否则在DOS下运行mvn compile命令时会出现莫名的错误,因为系统默认使用GBK编码-->
 </configuration>
 </plugin>
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-jar-plugin</artifactId>
 <configuration>
 <classesDirectory>target/classes/</classesDirectory>
 <archive>
 <manifest>
 <mainClass>com.alibaba.dubbo.container.Main</mainClass>
 <useUniqueVersions>false</useUniqueVersions>
 <addClasspath>true</addClasspath>
 <classpathPrefix>lib/</classpathPrefix>
 </manifest>
 <manifestEntries>
 <Class-Path>.</Class-Path>
 </manifestEntries>
 </archive>
 <!-- 指定jar包输出路径 -->
 <outputDirectory>${project.build.directory}/${project.artifactId}/lib</outputDirectory>
 </configuration>
 </plugin>

 <!-- 将本工程下dependencies copy至指定路径 -->
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-dependency-plugin</artifactId>
 <version>3.0.0</version>
 <executions>
 <execution>
 <id>copy-dependencies</id>
 <phase>package</phase>
 <goals>
 <goal>copy-dependencies</goal>
 </goals>
 <configuration>
 <type>jar</type>
 <includeTypes>jar</includeTypes>
 <useUniqueVersions>false</useUniqueVersions>
 <!-- 指定jar包输出路径 -->
 <outputDirectory>${project.build.directory}/${project.artifactId}/lib</outputDirectory>
 </configuration>
 </execution>
 </executions>
 </plugin>

 <!-- 将本工程例外文件copy至指定路径下 -->
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-resources-plugin</artifactId>
 <version>2.5</version>
 <executions>
 <execution>
 <id>copy-resources</id>
 <phase>package</phase>
 <goals>
 <goal>copy-resources</goal>
 </goals>
 <configuration>
<!--  <encoding>UTF-8</encoding> -->
 <!-- 指定文件输出路径,会将原始路径及其文件全部copy -->
 <outputDirectory>${project.build.directory}/${project.artifactId}/conf</outputDirectory>
 <resources>
 <resource>
 <targetPath>${project_loc}</targetPath>
 <directory>src/main/resources</directory>
 <!-- 将需要copy的配置文件配置到<include></include>标签内。 -->
 <includes>
 <!-- <include>dubbo.properties</include> -->
 <!-- <include>dataSource.properties</include> -->
 <!-- <include>dubbo/**</include> -->
 <include>**/**</include>
 </includes>
 </resource>
 </resources>
 </configuration>
 </execution>
 </executions>
 </plugin>
 </plugins>
 </build>
  • logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <!--定义日志输出目录 -->
 <property name="LOG_HOME" value="logs" />
 <property name="FILE_NAME" value="mail" />
 <property name="APP_NAME" value="mail" />
 <contextName>${APP_NAME}</contextName>

 <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
 <file>${LOG_HOME}/${FILE_NAME}.log</file>
 <rollingPolicy
 class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
 <!-- rollover daily -->
 <fileNamePattern>${LOG_HOME}/${FILE_NAME}-%d{yyyy-MM-dd}.%i.log
 </fileNamePattern>
 <!-- each file should be at most 100MB, keep 60 days worth of history,
 but at most 20GB -->
 <maxFileSize>50MB</maxFileSize>
 <maxHistory>30</maxHistory>
 <totalSizeCap>2GB</totalSizeCap>
 </rollingPolicy>
 <encoder>
 <pattern>[%date] [%thread] [%level] [%contextName] %logger %msg%n
 </pattern>
 <charset>UTF-8</charset>
 </encoder>
 </appender>

 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
 <encoder>
 <pattern>[%date] [%thread] [%level] [%contextName] %logger %msg%n
 </pattern>
 </encoder>
 </appender>
 
 <root level="INFO">
 <appender-ref ref="STDOUT" />
 <appender-ref ref="ROLLING" />
 </root>

 <!-- 打印ibatis sql语句 -->
 <logger name="org.apache.ibatis" level="DEBUG">  
     <appender-ref ref="STDOUT"/>  
 </logger>  
   
 <logger name="java.sql" level="debug">  
     <appender-ref ref="STDOUT"/>  
 </logger>  
</configuration>
  • 消费者配置文件 applicationContext_consumer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="[http://www.springframework.org/schema/beans](http://www.springframework.org/schema/beans)"
 xmlns:xsi="[http://www.w3.org/2001/XMLSchema-instance](http://www.w3.org/2001/XMLSchema-instance)" xmlns:dubbo="[http://code.alibabatech.com/schema/dubbo](http://code.alibabatech.com/schema/dubbo)"
 xsi:schemaLocation="[http://www.springframework.org/schema/beans](http://www.springframework.org/schema/beans)  
        [http://www.springframework.org/schema/beans/spring-beans.xsd](http://www.springframework.org/schema/beans/spring-beans.xsd)  
        [http://code.alibabatech.com/schema/dubbo](http://code.alibabatech.com/schema/dubbo)  
        [http://code.alibabatech.com/schema/dubbo/dubbo.xsd](http://code.alibabatech.com/schema/dubbo/dubbo.xsd)">

 <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="compareTableConsumer"/>
 
     <!-- 使用zookeeper注册中心暴露服务地址 -->  
    <!-- <dubbo:registry id="zookeeper-15272181" address="zookeeper://127.0.0.1:2181" />  -->
    <dubbo:registry id="zookeeper-15272181" address="zookeeper://10.10.56.21:7796" />
     
     <!-- 使用zookeeper注册中心查找监控中心
    <dubbo:monitor protocol="registry"/> -->
 
    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="compareTableService" interface="XXX.CompareTableService"  
    registry="zookeeper-15272181" check="false" retries="0" timeout="10000000"/>
   
    <import resource="applicationContext.xml"/>
</beans>
  • 消费者测试CompareTableServiceTest2
public class CompareTableServiceTest2 {  
 public static void main(String[] args) {
 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"spring/applicationContext_consumer.xml"});
        context.start();

        Map<String, String> paramMap3 = new HashMap<String, String>();
 paramMap3.put("orderId", "311710090001");
 
 CompareTableService service = (CompareTableService)context.getBean("compareTableService"); // 获取远程服务代理
 service.compareTableNoCar(paramMap3, "EAG_T.TestRenewal.orderId");
 }
}
  • 消费者pom.xml增加
 <!-- logback start -->
 <dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>log4j-over-slf4j</artifactId>
 <version>1.7.21</version>
 </dependency>
 <dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-api</artifactId>
 <version>1.7.24</version>
 </dependency>
 <dependency>
 <groupId>ch.qos.logback</groupId>
 <artifactId>logback-classic</artifactId>
 <version>${logback.version}</version>
 </dependency>
 <dependency>
 <groupId>ch.qos.logback</groupId>
 <artifactId>logback-core</artifactId>
 <version>${logback.version}</version>
 </dependency>
 <dependency>
 <groupId>ch.qos.logback</groupId>
 <artifactId>logback-access</artifactId>
 <version>${logback.version}</version>
 </dependency>

 <dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>dubbo</artifactId>
 <version>2.5.3</version>
 <exclusions>
 <exclusion>
 <groupId>org.springframework</groupId>
 <artifactId>spring</artifactId>
 </exclusion>
 <exclusion>
 <groupId>log4j</groupId>
 <artifactId>log4j</artifactId>
 </exclusion>
 </exclusions>
 </dependency>
 <dependency>
 <groupId>org.apache.zookeeper</groupId>
 <artifactId>zookeeper</artifactId>
 <version>3.3.6</version>
 <exclusions>
 <exclusion>
 <groupId>log4j</groupId>
 <artifactId>log4j</artifactId>
 </exclusion>
 <exclusion>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>
 </exclusion>
 </exclusions>
 </dependency>
 <dependency>
 <groupId>com.101tec</groupId>
 <artifactId>zkclient</artifactId>
 <version>0.9</version>
 <exclusions>
 <exclusion>
 <groupId>log4j</groupId>
 <artifactId>log4j</artifactId>
 </exclusion>
 <exclusion>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>
 </exclusion>
 </exclusions>
 </dependency>
 
 <dependency>
 <groupId>com.picc</groupId>
 <artifactId>compareTable</artifactId>
 <version>1.0.0</version>
 </dependency>

完整项目地址:

相关文章

网友评论

      本文标题:1、dubbo整合spring

      本文链接:https://www.haomeiwen.com/subject/fybruxtx.html