分布式架构学习之:005--构建Dubbo服务的可执行jar包

来源:互联网 发布:非诚勿扰php程序员 编辑:程序博客网 时间:2024/06/14 04:28

Dubbo服务的运行方式:

 1、使用Servlet容器运行(Tomcat、Jetty等)----不可取缺点:增加复杂性(端口、管理)浪费资源(内存),让容器来加载spring配置等

 2、自建Main方法类来运行(Spring容器) ----不建议(本地调试可用)缺点: Dobbo本身提供的高级特性没用上自已编写启动类可能会有缺陷

public class DubboProvider {private static final Log log = LogFactory.getLog(DubboProvider.class);public static void main(String[] args) {try {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring-context.xml");context.start();} catch (Exception e) {log.error("== DubboProvider context start error:",e);}synchronized (DubboProvider.class) {while (true) {try {DubboProvider.class.wait();} catch (InterruptedException e) {log.error("== synchronized error:",e);}}}}    }

 3、使用Dubbo框架提供的Main方法类来运行(Spring容器)----建议使用优点:框架本身提供(com.alibaba.dubbo.container.Main)可实现优雅关机(ShutdownHook)

pom文件

注意spring-context.xml中使用import引入其他的配置文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>wusc.edu.common</groupId><artifactId>edu-common-parent</artifactId><version>1.0-SNAPSHOT</version><relativePath>../edu-common-parent</relativePath></parent><groupId>wusc.edu.service</groupId><artifactId>edu-service-user</artifactId><version>${edu-service-user.version}</version><packaging>jar</packaging><name>edu-service-user</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><log4j.leve>debug</log4j.leve><log4j.ale>debug</log4j.ale></properties><build><finalName>edu-service-user</finalName><resources><resource><targetPath>${project.build.directory}/classes</targetPath><directory>src/main/resources</directory><filtering>true</filtering><includes><include>**/*.xml</include><include>**/*.properties</include></includes></resource><!-- 结合com.alibaba.dubbo.container.Main --><resource><targetPath>${project.build.directory}/classes/META-INF/spring</targetPath><directory>src/main/resources/spring</directory><filtering>true</filtering><includes><include>spring-context.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><!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 --><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><!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 --><useUniqueVersions>false</useUniqueVersions><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix></manifest><manifestEntries><Class-Path>.</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><outputDirectory>${project.build.directory}/lib</outputDirectory></configuration></execution></executions></plugin></plugins></build><dependencies><dependency><groupId>wusc.edu.common</groupId><artifactId>edu-common</artifactId><version>${edu-common.version}</version></dependency><dependency><groupId>wusc.edu.common</groupId><artifactId>edu-common-config</artifactId><version>${edu-common-config.version}</version></dependency><dependency><groupId>wusc.edu.common</groupId><artifactId>edu-common-core</artifactId><version>${edu-common-core.version}</version></dependency><dependency><groupId>wusc.edu.facade</groupId><artifactId>edu-facade-user</artifactId><version>${edu-facade-user.version}</version></dependency><!-- Common Dependency Begin --><dependency><groupId>antlr</groupId><artifactId>antlr</artifactId></dependency><dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId></dependency><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId></dependency><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><classifier>jdk15</classifier><scope>compile</scope></dependency><dependency><groupId>ognl</groupId><artifactId>ognl</artifactId></dependency><dependency><groupId>oro</groupId><artifactId>oro</artifactId></dependency><dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId></dependency><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId></dependency><dependency><groupId>commons-digester</groupId><artifactId>commons-digester</artifactId></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></dependency><dependency><groupId>commons-validator</groupId><artifactId>commons-validator</artifactId></dependency><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId></dependency><dependency><groupId>net.sf.ezmorph</groupId><artifactId>ezmorph</artifactId></dependency><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId></dependency><dependency><groupId>javax.transaction</groupId><artifactId>jta</artifactId></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></dependency><!-- Common Dependency End --><!-- Spring Dependency Begin --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-instrument</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-instrument-tomcat</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-oxm</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-struts</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc-portlet</artifactId></dependency><!-- Spring Dependency End --><!-- MyBatis Dependency Begin --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId></dependency><!-- MyBatis Dependency End --><!-- Struts2 Dependency Begin --><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-json-plugin</artifactId></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-convention-plugin</artifactId></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-spring-plugin</artifactId></dependency><dependency><groupId>org.apache.struts.xwork</groupId><artifactId>xwork-core</artifactId></dependency><!-- Struts2 Dependency End --><!-- Others Begin --><dependency><groupId>org.apache.tomcat</groupId><artifactId>servlet-api</artifactId><scope>provided</scope></dependency><dependency><groupId>org.apache.tomcat</groupId><artifactId>jsp-api</artifactId><scope>provided</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId></dependency><!-- Others End --><!-- Mysql Driver Begin --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- Mysql Driver End --><!-- dubbo 需要的jar start --><dependency><groupId>org.jboss.netty</groupId><artifactId>netty</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId></dependency><dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId></dependency><!-- dubbo 需要的jar end --></dependencies></project>


在Linux上手工部署

一、环境变量设置

vi /etc/profile

## java env

export JAVA_HOME=/usr/local/java/jdk1.7.0_72 export JRE_HOME=$JAVA_HOME/jre

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/li/tools.jar:$JRE_HOME/lib/rt.jar

export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

 

 source /etc/profile

二、部署目录规范


三、启动与停止

java -jar edu-service-xxx.jar &

ps -ef|grep java

kill PID

kill -9 PID

四、服务命名规范


五、服务脚本注意事项


一个脚本示例

#!/bin/sh## java envexport JAVA_HOME=/usr/local/java/jdk1.7.0_72export JRE_HOME=$JAVA_HOME/jre## service nameAPP_NAME=userSERVICE_DIR=/home/wusc/edu/service/$APP_NAMESERVICE_NAME=edu-service-$APP_NAMEJAR_NAME=$SERVICE_NAME\.jarPID=$SERVICE_NAME\.pidcd $SERVICE_DIRcase "$1" in    start)        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >/dev/null 2>&1 &        echo $! > $SERVICE_DIR/$PID        echo "=== start $SERVICE_NAME"        ;;    stop)        kill `cat $SERVICE_DIR/$PID`        rm -rf $SERVICE_DIR/$PID        echo "=== stop $SERVICE_NAME"        sleep 5#### edu-service-aa.jar## edu-service-aa-bb.jar        P_ID=`ps -ef | grep -w "$SERVICE_NAME" | grep -v "grep" | awk '{print $2}'`        if [ "$P_ID" == "" ]; then            echo "=== $SERVICE_NAME process not exists or stop success"        else            echo "=== $SERVICE_NAME process pid is:$P_ID"            echo "=== begin kill $SERVICE_NAME process, pid is:$P_ID"            kill -9 $P_ID        fi        ;;    restart)        $0 stop        sleep 2        $0 start        echo "=== restart $SERVICE_NAME"        ;;    *)        ## restart        $0 stop        sleep 2        $0 start        ;;esacexit 0


dubbo官方提供的脚本【dubbo-demo-provider】

start.sh

#!/bin/bashcd `dirname $0`BIN_DIR=`pwd`cd ..DEPLOY_DIR=`pwd`CONF_DIR=$DEPLOY_DIR/confSERVER_NAME=`sed '/dubbo.application.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`SERVER_PROTOCOL=`sed '/dubbo.protocol.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`SERVER_PORT=`sed '/dubbo.protocol.port/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`LOGS_FILE=`sed '/dubbo.log4j.file/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`if [ -z "$SERVER_NAME" ]; then    SERVER_NAME=`hostname`fiPIDS=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`if [ -n "$PIDS" ]; then    echo "ERROR: The $SERVER_NAME already started!"    echo "PID: $PIDS"    exit 1fiif [ -n "$SERVER_PORT" ]; then    SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l`    if [ $SERVER_PORT_COUNT -gt 0 ]; then        echo "ERROR: The $SERVER_NAME port $SERVER_PORT already used!"        exit 1    fifiLOGS_DIR=""if [ -n "$LOGS_FILE" ]; then    LOGS_DIR=`dirname $LOGS_FILE`else    LOGS_DIR=$DEPLOY_DIR/logsfiif [ ! -d $LOGS_DIR ]; then    mkdir $LOGS_DIRfiSTDOUT_FILE=$LOGS_DIR/stdout.logLIB_DIR=$DEPLOY_DIR/libLIB_JARS=`ls $LIB_DIR|grep .jar|awk '{print "'$LIB_DIR'/"$0}'|tr "\n" ":"`JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "JAVA_DEBUG_OPTS=""if [ "$1" = "debug" ]; then    JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "fiJAVA_JMX_OPTS=""if [ "$1" = "jmx" ]; then    JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "fiJAVA_MEM_OPTS=""BITS=`java -version 2>&1 | grep -i 64-bit`if [ -n "$BITS" ]; then    JAVA_MEM_OPTS=" -server -Xmx2g -Xms2g -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "else    JAVA_MEM_OPTS=" -server -Xms1g -Xmx1g -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC "fiecho -e "Starting the $SERVER_NAME ...\c"nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -classpath $CONF_DIR:$LIB_JARS com.alibaba.dubbo.container.Main > $STDOUT_FILE 2>&1 &COUNT=0while [ $COUNT -lt 1 ]; do        echo -e ".\c"    sleep 1     if [ -n "$SERVER_PORT" ]; then        if [ "$SERVER_PROTOCOL" == "dubbo" ]; then        COUNT=`echo status | nc -i 1 127.0.0.1 $SERVER_PORT | grep -c OK`        else            COUNT=`netstat -an | grep $SERVER_PORT | wc -l`        fi    else    COUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`    fi    if [ $COUNT -gt 0 ]; then        break    fidoneecho "OK!"PIDS=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`echo "PID: $PIDS"echo "STDOUT: $STDOUT_FILE"

stop.sh

#!/bin/bashcd `dirname $0`BIN_DIR=`pwd`cd ..DEPLOY_DIR=`pwd`CONF_DIR=$DEPLOY_DIR/confSERVER_NAME=`sed '/dubbo.application.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`if [ -z "$SERVER_NAME" ]; then    SERVER_NAME=`hostname`fiPIDS=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`if [ -z "$PIDS" ]; then    echo "ERROR: The $SERVER_NAME does not started!"    exit 1fiif [ "$1" != "skip" ]; then    $BIN_DIR/dump.shfiecho -e "Stopping the $SERVER_NAME ...\c"for PID in $PIDS ; do    kill $PID > /dev/null 2>&1doneCOUNT=0while [ $COUNT -lt 1 ]; do        echo -e ".\c"    sleep 1    COUNT=1    for PID in $PIDS ; do        PID_EXIST=`ps -f -p $PID | grep java`        if [ -n "$PID_EXIST" ]; then            COUNT=0            break        fi    donedoneecho "OK!"echo "PID: $PIDS"


server.sh

#!/bin/bashcd `dirname $0`if [ "$1" = "start" ]; then./start.shelseif [ "$1" = "stop" ]; then./stop.shelseif [ "$1" = "debug" ]; then./start.sh debugelseif [ "$1" = "restart" ]; then./restart.shelseif [ "$1" = "dump" ]; then./dump.shelseecho "ERROR: Please input argument: start or stop or debug or restart or dump"    exit 1fififififi

dump.sh

#!/bin/bashcd `dirname $0`BIN_DIR=`pwd`cd ..DEPLOY_DIR=`pwd`CONF_DIR=$DEPLOY_DIR/confSERVER_NAME=`sed '/dubbo.application.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`LOGS_FILE=`sed '/dubbo.log4j.file/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`if [ -z "$SERVER_NAME" ]; thenSERVER_NAME=`hostname`fiPIDS=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`if [ -z "$PIDS" ]; then    echo "ERROR: The $SERVER_NAME does not started!"    exit 1fiLOGS_DIR=""if [ -n "$LOGS_FILE" ]; thenLOGS_DIR=`dirname $LOGS_FILE`elseLOGS_DIR=$DEPLOY_DIR/logsfiif [ ! -d $LOGS_DIR ]; thenmkdir $LOGS_DIRfiDUMP_DIR=$LOGS_DIR/dumpif [ ! -d $DUMP_DIR ]; thenmkdir $DUMP_DIRfiDUMP_DATE=`date +%Y%m%d%H%M%S`DATE_DIR=$DUMP_DIR/$DUMP_DATEif [ ! -d $DATE_DIR ]; thenmkdir $DATE_DIRfiecho -e "Dumping the $SERVER_NAME ...\c"for PID in $PIDS ; dojstack $PID > $DATE_DIR/jstack-$PID.dump 2>&1echo -e ".\c"jinfo $PID > $DATE_DIR/jinfo-$PID.dump 2>&1echo -e ".\c"jstat -gcutil $PID > $DATE_DIR/jstat-gcutil-$PID.dump 2>&1echo -e ".\c"jstat -gccapacity $PID > $DATE_DIR/jstat-gccapacity-$PID.dump 2>&1echo -e ".\c"jmap $PID > $DATE_DIR/jmap-$PID.dump 2>&1echo -e ".\c"jmap -heap $PID > $DATE_DIR/jmap-heap-$PID.dump 2>&1echo -e ".\c"jmap -histo $PID > $DATE_DIR/jmap-histo-$PID.dump 2>&1echo -e ".\c"if [ -r /usr/sbin/lsof ]; then/usr/sbin/lsof -p $PID > $DATE_DIR/lsof-$PID.dumpecho -e ".\c"fidoneif [ -r /bin/netstat ]; then/bin/netstat -an > $DATE_DIR/netstat.dump 2>&1echo -e ".\c"fiif [ -r /usr/bin/iostat ]; then/usr/bin/iostat > $DATE_DIR/iostat.dump 2>&1echo -e ".\c"fiif [ -r /usr/bin/mpstat ]; then/usr/bin/mpstat > $DATE_DIR/mpstat.dump 2>&1echo -e ".\c"fiif [ -r /usr/bin/vmstat ]; then/usr/bin/vmstat > $DATE_DIR/vmstat.dump 2>&1echo -e ".\c"fiif [ -r /usr/bin/free ]; then/usr/bin/free -t > $DATE_DIR/free.dump 2>&1echo -e ".\c"fiif [ -r /usr/bin/sar ]; then/usr/bin/sar > $DATE_DIR/sar.dump 2>&1echo -e ".\c"fiif [ -r /usr/bin/uptime ]; then/usr/bin/uptime > $DATE_DIR/uptime.dump 2>&1echo -e ".\c"fiecho "OK!"echo "DUMP: $DATE_DIR"



0 0
原创粉丝点击