Bootstrap

Dubbo框架jar部署总结

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 启动

                
   


;