前言:
其实我们的初衷,不是把项目做成微服务,而是想有一个随时可以调用的服务,但是实际过程中,我们打成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>
完整项目地址:
网友评论