1.关于DUBBO 服务提供端几种部署方式:
1)tomcat 将服务端跑在tomcat,这种方式比较吃资源浪费端口;
2)用DUBBO 提供的com.alibaba.dubbo.container.Main 方法,将工程打成jar包运行,相对来说这种方式不需要那么 多tomcat 也就不需要那么多端口号(官方推荐用这种方式可以实现优雅停机);
2.工程配置的修改的总结和遇到的问题 :
2.1:eclipse 中使用main函数启动
1)移动配置文件和删除web.xml(
如果
不跑tomcat不需要这个文件)
移动完的文件如下图(
用java代码去加载root-context.xml 这个文件把其他xml加载进来):
root-context.xml中加载另外的2个xml配置文件如下:
<!-- 引入xml -->
<import resource="classpath:applicationContext-CBDubboService.xml"></import>
<import resource="classpath:log4j.xml"></import>
添加一个启动类代码如下(
这个类必须和Maven配置的指定入口的类一致
):
package com.iqcloud.dubbo.main;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class StartService {
@SuppressWarnings("resource")
public static void main(String[] args) {
System.out.println("-----------------------------初始化log4j变量");
String log4jBasePath = System.getProperty("user.dir");
System.out.println("工程同一级目录--------------------" + log4jBasePath);
System.setProperty("catalina.base", log4jBasePath);
System.out.println("-----------------------------log4j变量加载完成");
System.out.println("-----------------------------开始加载配置文件");
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:root-context.xml");
context.start();
System.out.println("-----------------------------配置文件加载完毕");
System.out.println("-----------------------------开始启动服务");
com.alibaba.dubbo.container.Main.main(args);
}
}
如果想在服务启动后执行某个方法就在main函数中的context.start()后面加如下代码:
InitServlet initServlet = context.getBean("com.iqcloud.auth.service.InitServlet", InitServlet.class);
System.out.println("----------------------------获取到对象initServlet" + initServlet);
Initservlet 这个要执行的类要加上注解让他成为bean例子如下:
运行时出现如下问题:
1:第一个问题如下图:
原因:xml中有中文的注释;
解决方法:
1)第一种:将所有的xml的编码方式都修改成GBK(包括mybatis下的xml) 如下
2)第二种:去掉所有中文注释
2.2使用Maven 打jar包进行运行:
1)Maven配置如下:
<build>
<finalName>dubbo-provider</finalName> <!-- jar包名,一般设置为提供者服务名 -->
<resources>
<!-- 把resource目录下所有文件和文件夹导入到jar包内 -->
<resource>
<targetPath>${project.build.directory}/classes</targetPath>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<!-- 可直接写为<include>**/*</include>包含所有文件 -->
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<!-- 使用com.alibaba.dubbo.container.Main启动spring容器,会默认加载META-INF/spring目录下的所有spring配置 如果没有spring配置可以把这个resource标签注释掉-->
<resource>
<targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
<directory>src/main/resources/spring</directory>
<filtering>true</filtering>
<!-- 把src/main/resources/spring路径下的spring配置文件拷贝到${project.build.directory}/classes/META-INF/spring下 -->
<includes>
<include>spring-application.xml</include>
</includes>
</resource>
</resources>
<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 />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<!-- maven打包成jar的插件 -->
<!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!-- 把target/classes/下的文件导入到jar内 -->
<classesDirectory>target/classes/</classesDirectory>
<archive>
<manifest>
<!-- 指定程序入口 -->
<!-- <mainClass>com.alibaba.dubbo.container.Main</mainClass> -->
<mainClass>com.ruida.provice.facadeImpl.BannerProvider</mainClass>
<!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
<useUniqueVersions>false</useUniqueVersions>
<addClasspath>true</addClasspath>
<!-- 服务依赖的jar包放在lib目录下 -->
<classpathPrefix>lib/</classpathPrefix>
</manifest>
<!-- 外部jar包的依赖也添加到MANIFEST的classpath中 -->
<manifestEntries>
<Class-Path>lib/zkclient-0.1.0.jar lib/zookeeper-3.4.5.jar</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<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包,存放在服务相同目录的lib文件夹下 -->
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
2)上面配置完之后选中pom.xml文件右键点击run as -> maven install 进行jar包生成 如下图:
运行完之后会在target下面出现部署所要的依赖包和jar文件如下图:
将lib包和工程的jar文件拷贝到同一个文件夹如下:
windows 运行 jar文件指令如下:
java -Xms128m -Xmx512m -jar /完整路径/xxx1.jar
运行成功如下图:
Linux shell脚本运行如下:--转载
http://blog.csdn.net/minebk/article/details/72901490
#启动方法
start(){
java -Xms128m -Xmx512m -jar /完整路径/xxx1.jar > /日志完整路径/xxx1.log &
java -Xms128m -Xmx512m -jar /完整路径/xxx2.jar > /日志完整路径/xxx2.log &
java -Xms128m -Xmx512m -jar /完整路径/xxx3.jar > /日志完整路径/xxx3.log &
java -Xms128m -Xmx512m -jar /完整路径/xxx4.jar > /日志完整路径/xxx4.log &
}
#停止方法
stop(){
ps -ef | grep -w zmshop-service | grep -v "grep" | awk '{print $2}'|while read pid
do
#需要判断pid是否为空
if [ "$pid" != "" ]; then
kill -9 $pid
fi
done
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
printf 'Usage: %s {start|stop|restart}\n' "$prog"
exit 1
;;
esac
这边我在打成jar包时候出现了如下问题:
1:本地jar无法生成到lib 文件夹下;
解决方法: 本地jar包配置成用Maven引入代码如下
<!-- 解决本地包无法生成到/ProvceService/target/lib 下的问题将jar包生成到maven中 -->
<dependency>
<groupId>zkclient-0.1.0</groupId>
<artifactId>zkclient</artifactId>
<version>0.1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/webapp/WEB-INF/lib/zkclient-0.1.0.jar</systemPath>
</dependency>
2.上面配置生成完之后虽然有jar文件了,但是运行时候还是提示找不到对应的jar包,
后面发现在生成的jar包工程的MANIFEST.MF中的main-class中没有对应的jar 如下图:
解决方法:
Maven添加如下配置:
<!-- 外部jar包的依赖也添加到MANIFEST的classpath中 -->
<manifestEntries>
<Class-Path>
lib/activemq-all-5.11.1.jar lib/antlr-2.7.4.jar lib/aspectjweaver.jar
lib/chardet-1.0.jar lib/commons-cli-1.1.jar lib/commons-io-2.4.jar
lib/commons-pool-1.6.jar lib/cpdetector_1.0.8.jar lib/dom4j-1.6.1.jar
lib/facade.jar lib/freemarker.jar lib/gson-2.2.4.jar lib/IQBasicData.jar
lib/iText-2.1.7.jar lib/iText-rtf-2.1.7.jar lib/iTextAsian.jar
lib/jodconverter-core-3.0-beta-4-javadoc.jar lib/jodconverter-core-3.0-beta-4.jar
lib/json-20090211.jar lib/juh-3.2.1.jar lib/jurt-3.2.1.jar lib/mail.jar
lib/mysql-connector-java-5.1.25-bin.jar lib/onlineTopic.jar lib/patchca-0.5.0.jar
lib/pdf-renderer-1.0.5.jar lib/QRCode.jar lib/ridl-3.2.1.jar lib/unoil-3.0.1.jar
lib/zkclient-0.1.0.jar lib/zookeeper-3.4.5.jar lib/zxing.jar
</Class-Path>
</manifestEntries>
2.配置完上面之后继续运行发现 通过Maven配置引进了的工程的jar包找不到:
解决方法:
先用Maven生成本工程引入的其他工程的jar包。
3.出现字符编码错误如下:
解决方法:在maven中加上如下配置:
<!-- 指定编码格式,否则在DOS下运行mvn compile命令时会出现莫名的错误,因为系统默认使用GBK编码 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 指定编码格式,否则在DOS下运行mvn命令时当发生文件资源copy时将使用系统默认使用GBK编码 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
2.3:给工程添加log4j
xml代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- 将日志信息输出到控制台 -->
<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
<!-- 设置日志输出的样式 -->
<layout class="org.apache.log4j.PatternLayout">
<!-- 设置日志输出的格式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
</layout>
<!--过滤器设置输出的级别-->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<!-- 设置日志输出的最小级别 -->
<param name="levelMin" value="DEBUG" />
<!-- 设置日志输出的最大级别 -->
<param name="levelMax" value="ERROR" />
<!-- 设置日志输出的xxx,默认是false -->
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<!-- 输出异常信息日志 -->
<appender name="ErrorFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
<param name="Append" value="true" />
<!-- 设置日志信息输出文件路径 -->
<param name="File" value="${catalina.base}/logs/error.log" />
<!-- 设置日志产生的时间多久产生一份日志文件 -->
<param name="DatePattern" value=".yyyy-MM-dd" />
<!-- 指定日志消息的输出最低层次 -->
<param name="Threshold" value="ERROR"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
</layout>
</appender>
<!-- 将日志信息输出到文件,但是当文件的大小达到某个阈值的时候,日志文件会自动回滚 -->
<!-- <appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender">
设置日志信息输出文件全路径名
<param name="File" value="${catalina.base}/logs/RollingFileAppender.log" />
设置是否在重新启动服务时,在原有日志的基础添加新日志
<param name="Append" value="true" />
设置保存备份回滚日志的最大个数
<param name="MaxBackupIndex" value="10" />
设置当日志文件达到此阈值的时候自动回滚,单位可以是KB,MB,GB,默认单位是KB
<param name="MaxFileSize" value="10KB" />
设置日志输出的样式
<layout class="org.apache.log4j.PatternLayout">
设置日志输出的格式
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
</layout>
</appender> -->
<!-- 输出info信息日志-->
<!-- <appender name="InfoFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
<param name="Append" value="true" />
<param name="File" value="${catalina.base}/logs/info.log" />
<param name="DatePattern" value=".yyyy-MM-dd" />
<param name="Threshold" value="info"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
</layout>
</appender> -->
<!--
1:当additivity="false"时,root中的配置就失灵了,不遵循缺省的继承机制
2:logger中的name非常重要,它代表记录器的包的形式,有一定的包含关系,试验表明
2-1:当定义的logger的name同名时,只有最后的那一个才能正确的打印日志
2-2:当对应的logger含有包含关系时,比如:name=test.log4j.test8 和 name=test.log4j.test8.UseLog4j,则2-1的情况是一样的
2-3:logger的name表示所有的包含在此名的所有记录器都遵循同样的配置,name的值中的包含关系是指记录器的名称哟!注意啦!
3:logger中定义的level和appender中的filter定义的level的区间取交集
4:如果appender中的filter定义的 levelMin > levelMax ,则打印不出日志信息
-->
<!-- <logger name="org.springframework">
<level value="ERROR" />
</logger>
<logger name="org.mybatis.spring">
<level value="ERROR" />
</logger> -->
<!--指定logger的设置,additivity指示是否遵循缺省的继承机制 默认true -->
<!--当additivity=false时root失效。而additivity=true时会使用root 这时候就会打印2条重复的日志-->
<logger name="java.sql" additivity="false">
<!-- 最小输出级别 -->
<level value="DEBUG" />
<!-- 日志输出的appender -->
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="ErrorFileAppender"/>
</logger>
<!-- 配置全局的日志 -->
<root>
<!-- 全局的最小输出级别 -->
<level value="info" />
<!-- 日志输出的appender -->
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="ErrorFileAppender"/>
<!-- <appender-ref ref="InfoFileAppender"/> -->
</root>
</log4j:configuration>
catalina.base这个路径变量如果工程跑在tomcat 就是和tomcat 存放日志一样的路径如果是jar 部署就是通过main函数的
String log4jBasePath = System.getProperty("user.dir"); System.setProperty("catalina.base", log4jBasePath);
进行赋值System.getProperty("user.dir"); 获取到的路径是当前jar包存放路径的绝对地址
然后在root-context.xml 文件中import log4j.xml 文件如下:
<import resource="classpath:log4j.xml" ></import>
2.4:linux上运行出现的问题
1:The string "--" is not permitted within comments xml文件注释出现问题了;
解决方法:1)将项目的字符编码,改为utf-8就可以正确解析 但是改成这样之后 main本地测试main函数启动会报编码错 误(除非xml里面没有中文注释),用这种方法的话本地就要以原先的tomcat启动 部署的时候用jar包,或者把所有中文注释都去掉本地才能跑main函数;
2)第二种方案是把jdk升级成1.8 但是现在很多软件依赖于jdk1.7 所以解决方法是在linux 上装2个jdk
目前把工程修改成jar 和 war 2种都支持的部署方式,本地调试还是用tomcat 启动