1. 程式人生 > >maven打包dubbo介面之最佳實踐

maven打包dubbo介面之最佳實踐

之前剛開始學習dubbo的時候,曾寫過一個入門的小例子,當時生產者也是用tomcat去跑的,其實dubbo只需要提供service層介面就好了,並不需要和http相關的東西,所以其實並不需要用tomcat去跑,我們完全打成其他的包直接去跑,這樣dubbo介面也不會tomcat效能的限制,而打包可以說是maven最擅長的事情之一,今天就記錄一下我們公司的實際專案中使用maven-assembly-plugin打包的方法。

1. 首先在pom檔案中,新增maven-assembly-plugin外掛

<plugin>
<artifactId>maven-assembly-plugin</artifactId
>
<configuration> <descriptor>src/main/assembly/assembly.xml</descriptor> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single </goal> </goals> </execution> </executions
>
</plugin>

在該外掛的第四行我們指定了一個assembly.xml檔案,下面我們就看看assembly.xml的內容

2. assembly.xml檔案

<assembly>
<id>assembly</id>
<formats>
<format>tar.gz</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<fileSet>
<outputDirectory
>
/</outputDirectory> <includes> <include>README.txt</include> </includes> </fileSet> <fileSet> <directory>src/main/scripts</directory> <outputDirectory>/bin</outputDirectory> </fileSet> </fileSets> <dependencySets> <dependencySet> <useProjectArtifact>true</useProjectArtifact> <outputDirectory>lib</outputDirectory> </dependencySet> </dependencySets> </assembly>

該檔案的第四行中的tar.gz指的就是打包的檔案格式,對於Linux使用者,對這個格式一定非常熟悉,當然大家也可以指定為zip格式,另外在該檔案的第十五行,指定了一個scripts資料夾,那麼這裡面放的又是什麼呢?我們知道打包之後的系統我們要跑起來才能用,那麼這裡面放的就是對我們的系統操作的一些指令碼,打包之後,我們的系統都是一些jar檔案,放在了倒數第四行指定的lib檔案中,而這些指令碼則放在了和lib同級的bin檔案中,下面就讓我們一一看看scripts中幾個檔案的內容

3. scripts資料夾

①. start.bat

@echo off & setlocal enabledelayedexpansion

set LIB_JARS=""
cd ..\lib
for %%i in (*) do set LIB_JARS=!LIB_JARS!;..\lib\%%i
cd ..\bin

if ""%1"" == ""debug"" goto debug
if ""%1"" == ""jmx"" goto jmx

java -Xms64m -Xmx1024m -XX:MaxPermSize=64M -classpath ..\conf;%LIB_JARS% com.alibaba.dubbo.container.Main
goto end

:debug
java -Xms64m -Xmx1024m -XX:MaxPermSize=64M -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -classpath ..\conf;%LIB_JARS% com.alibaba.dubbo.container.Main
goto end

:jmx
java -Xms64m -Xmx1024m -XX:MaxPermSize=64M -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -classpath ..\conf;%LIB_JARS% com.alibaba.dubbo.container.Main

:end
pause

②. start.sh

#!/bin/bash
cd `dirname $0`
BIN_DIR=`pwd`
cd ..
DEPLOY_DIR=`pwd`
CONF_DIR=$DEPLOY_DIR/conf

USER=www
GROUP=www

#SERVER_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'`
SERVER_NAME=""
SERVER_PROTOCOL=""
SERVER_PORT=""
LOGS_FILE=""

if [ -z "$SERVER_NAME" ]; then
    SERVER_NAME=`hostname`
fi

PIDS=`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 1
fi

if [ -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
    fi
fi

LOGS_DIR="/data/logs/`basename $DEPLOY_DIR`"

if [ ! -d $LOGS_DIR ]; then
    mkdir -p $LOGS_DIR
    chown -R $USER.$GROUP $LOGS_DIR
fi
STDOUT_FILE=$LOGS_DIR/`basename $DEPLOY_DIR`.log

LIB_DIR=$DEPLOY_DIR/lib
LIB_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 "
fi
JAVA_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 "
fi
JAVA_MEM_OPTS=""
BITS=`java -version 2>&1 | grep -i 64-bit`
if [ -n "$BITS" ]; then
    JAVA_MEM_OPTS=" -server -Xmx2g -Xms2g -Xmn720m -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 -Xms2g -Xmx2g -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC "
fi

echo -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=0
while [ $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
    fi
done

echo "OK!"
PIDS=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`
echo "PID: $PIDS"
echo "STDOUT: $STDOUT_FILE"

③. stop.sh

#!/bin/bash
cd `dirname $0`
BIN_DIR=`pwd`
cd ..
DEPLOY_DIR=`pwd`
CONF_DIR=$DEPLOY_DIR/conf

SERVER_NAME=`sed '/dubbo.application.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`

if [ -z "$SERVER_NAME" ]; then
    SERVER_NAME=`hostname`
fi

PIDS=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`
if [ -z "$PIDS" ]; then
    echo "ERROR: The $SERVER_NAME does not started!"
    exit 1
fi

if [ "$1" != "skip" ]; then
    $BIN_DIR/dump.sh
fi

echo -e "Stopping the $SERVER_NAME ...\c"
for PID in $PIDS ; do
    kill $PID > /dev/null 2>&1
done

COUNT=0
while [ $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
    done
done

echo "OK!"
echo "PID: $PIDS"

④. restart.sh

#!/bin/bash
cd `dirname $0`
./stop.sh
./start.sh

⑤. server.sh

#!/bin/bash
cd `dirname $0`
if [ "$1" = "start" ]; then
./start.sh
else
if [ "$1" = "stop" ]; then
./stop.sh
else
if [ "$1" = "debug" ]; then
./start.sh debug
else
if [ "$1" = "restart" ]; then
./restart.sh
else
if [ "$1" = "dump" ]; then
./dump.sh
else
echo "ERROR: Please input argument: start or stop or debug or restart or dump"
    exit 1
fi
fi
fi
fi
fi

⑥. dump.sh

#!/bin/bash
cd `dirname $0`
BIN_DIR=`pwd`
cd ..
DEPLOY_DIR=`pwd`
CONF_DIR=$DEPLOY_DIR/conf

SERVER_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" ]; then
SERVER_NAME=`hostname`
fi

PIDS=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`
if [ -z "$PIDS" ]; then
    echo "ERROR: The $SERVER_NAME does not started!"
    exit 1
fi

LOGS_DIR=""
if [ -n "$LOGS_FILE" ]; then
LOGS_DIR=`dirname $LOGS_FILE`
else
LOGS_DIR=$DEPLOY_DIR/logs
fi
if [ ! -d $LOGS_DIR ]; then
mkdir $LOGS_DIR
fi
DUMP_DIR=$LOGS_DIR/dump
if [ ! -d $DUMP_DIR ]; then
mkdir $DUMP_DIR
fi
DUMP_DATE=`date +%Y%m%d%H%M%S`
DATE_DIR=$DUMP_DIR/$DUMP_DATE
if [ ! -d $DATE_DIR ]; then
mkdir $DATE_DIR
fi

echo -e "Dumping the $SERVER_NAME ...\c"
for PID in $PIDS ; do
jstack $PID > $DATE_DIR/jstack-$PID.dump 2>&1
echo -e ".\c"
jinfo $PID > $DATE_DIR/jinfo-$PID.dump 2>&1
echo -e ".\c"
jstat -gcutil $PID > $DATE_DIR/jstat-gcutil-$PID.dump 2>&1
echo -e ".\c"
jstat -gccapacity $PID > $DATE_DIR/jstat-gccapacity-$PID.dump 2>&1
echo -e ".\c"
jmap $PID > $DATE_DIR/jmap-$PID.dump 2>&1
echo -e ".\c"
jmap -heap $PID > $DATE_DIR/jmap-heap-$PID.dump 2>&1
echo -e ".\c"
jmap -histo $PID > $DATE_DIR/jmap-histo-$PID.dump 2>&1
echo -e ".\c"
if [ -r /usr/sbin/lsof ]; then
/usr/sbin/lsof -p $PID > $DATE_DIR/lsof-$PID.dump
echo -e ".\c"
fi
done

if [ -r /bin/netstat ]; then
/bin/netstat -an > $DATE_DIR/netstat.dump 2>&1
echo -e ".\c"
fi
if [ -r /usr/bin/iostat ]; then
/usr/bin/iostat > $DATE_DIR/iostat.dump 2>&1
echo -e ".\c"
fi
if [ -r /usr/bin/mpstat ]; then
/usr/bin/mpstat > $DATE_DIR/mpstat.dump 2>&1
echo -e ".\c"
fi
if [ -r /usr/bin/vmstat ]; then
/usr/bin/vmstat > $DATE_DIR/vmstat.dump 2>&1
echo -e ".\c"
fi
if [ -r /usr/bin/free ]; then
/usr/bin/free -t > $DATE_DIR/free.dump 2>&1
echo -e ".\c"
fi
if [ -r /usr/bin/sar ]; then
/usr/bin/sar > $DATE_DIR/sar.dump 2>&1
echo -e ".\c"
fi
if [ -r /usr/bin/uptime ]; then
/usr/bin/uptime > $DATE_DIR/uptime.dump 2>&1
echo -e ".\c"
fi

echo "OK!"
echo "DUMP: $DATE_DIR"

至於這些檔案是幹嘛的,相信作為一個程式猿不用老夫一一解釋了,聰明如您,一定一眼就能看出來了,如果您的shell水平目前還不夠,可以先看看老夫的這篇文章,看完之後再看這幾個指令碼可以說完全無壓力。

分享到:

相關推薦

maven打包dubbo介面最佳實踐

之前剛開始學習dubbo的時候,曾寫過一個入門的小例子,當時生產者也是用tomcat去跑的,其實dubbo只需要提供service層介面就好了,並不需要和http相關的東西,所以其實並不需要用tomcat去跑,我們完全打成其他的包直接去跑,這樣dubbo介面也不會tomc

jmeter最佳實踐

安全性 ras rec The http請求 所有 thread coord 匹配 官方文檔: http://jmeter.apache.org/usermanual/best-practices.html 翻譯: 16.最佳實踐 16.1 始終使用最新版本的

前端接收資料流實現圖片預覽效果--ajax 請求二進位制流 圖片 檔案 XMLHttpRequest 請求並處理二進位制流資料 最佳實踐

本文為轉載文章 原文連結:https://www.cnblogs.com/cdemo/p/5225848.html 首先要謝謝這位大神的無私貢獻!解決了我的問題也完美表達了我當時的心路歷程 ajax 請求二進位制流 圖片 檔案 XMLHttpRequest 請求並處理二進位制流資料 之最佳實踐

微信小程式客服訊息實時通知最佳實踐

我們做微信小程式開發的都知道,只要在小程式頁面中新增如下程式碼即可進入小程式的客服會話介面:  <button open-type="contact" >聯絡我們</button>  微信小程式客服會話介面如下圖所示: 但是,客戶給我們小程式發的訊息,微信伺服器並不會通知小程式管

Spring Boot學習筆記2——基本使用最佳實踐[z]

前言 在上一篇文章Spring Boot 學習筆記1——初體驗之3分鐘啟動你的Web應用已經對Spring Boot的基本體系與基本使用進行了學習,本文主要目的是更加進一步的來說明對於Spring Boot使用上的具體的細節以及使用上的最佳實踐, 經過了幾天的文件閱讀和實驗,將自己這幾天的學習心得在

ajax 請求二進位制流 圖片 檔案 XMLHttpRequest 請求並處理二進位制流資料 最佳實踐

寫在前面 :從提出需求到完美的解決問題,實現過程是曲折的。 需求:在前(web client)後(Restful Service)端完全解耦的模式框架下,webclient需要請求 Service 返回的圖片檔案(二進位制流),並在client端顯示。 第一步思考:拿到此需求, 基於程式設計師的狂妄心

ajax 請求二進位制流 圖片 檔案 XMLHttpRequest 請求並處理二進位制流資料 最佳實踐

寫在前面 :從提出需求到完美的解決問題,實現過程是曲折的。需求:在前(web client)後(Restful Service)端完全解耦的模式框架下,webclient需要請求 Service 返回的圖片檔案(二進位制流),並在client端顯示。第一步思考:拿到此需求,

Java Exception處理最佳實踐

本文是Exception處理的一篇不錯的文章,從Java Exception的概念介紹起,依次講解了Exception的型別(Checked/Unchecked),Exception處理的最佳實現:   1. 選擇Checked還是Unchecked的幾個經典依據   2. Exception的封裝

Java Exception 處理最佳實踐

 本文是Exception處理的一篇不錯的文章,從Java Exception的概念介紹起,依次講解了Exception的型別(Checked/Unchecked),Exception處理的最佳實現: 1. 選擇Checked還是Unchecked的幾個經典依據 2. Exc

【FastDev4Android框架開發】AndroidAnnnotations注入框架使用最佳實踐SharedPreferences(十七)

轉載請標明出處:  (一).前言:    前面我們已經對於AndroidAnnotations使用Adapters和lists做了講解,今天我們開始具體學習一下使用DI框架SharedPrefe

maven打包dubbo服務依賴jar包缺失問題

在dubbo服務對應的pom檔案中加入以下內容(install完以後會在pom.xml同級目錄生成dependency-reduced-pom.xml檔案不用管這是打包外掛自動生成的)<!--

Android學習筆記——UI基礎編寫介面最佳實踐

參考書籍:Android第一行程式碼(第二版).郭霖著 1、製作Nine-Patch圖片 一種被特殊處理過的png圖片,能夠指定那些區域可以被拉伸、哪些不可以。在Android sdk目錄下有一個tools資料夾,找到draw9patch.bat檔案來製作N

maven+SSM+shiro+junit+jetty+log4j環境配置的最佳實踐

一次 bject catch mapping getbean tco 客戶 包名 目錄 思路大致是 jetty插件 -> junit -> SpringMVC -> Spring -> Mybatis整合 -> shiro整合 -> lo

遊戲運維的最佳實踐:搜狐暢遊自動化運維旅!

運維 遊戲 搜狐暢遊 搜狐黎誌剛見證了暢遊遊戲自動化運維平臺的從無到有,通過在其中踩過的坑、解過的結,他向大家來闡述遊戲運維的進階之路。本文主要圍繞暢遊遊戲管理體系與運維自動化的演變歷程、運維自動化的實現及未來運維四方面展開。暢遊運維管理體系與運維自動化的演變歷程暢遊運維管理體系演變歷程從 200

Android最佳實踐性能 - 多線程

ndt andro 單位 多線程 same Coding amount other err 在單獨線程執行代碼 參考地址:http://developer.andr

Mongo實戰數據空洞的最佳實踐

journal 初始 beat objectid use bpa 沒有 lda replica 問題背景: 某天,開發部的同事跑過來反映: mongodb數據文件太大,快把磁盤撐爆了!其中某個db占用最大(運營環境這個db的數據量其實很小) 分析: 開發環境有大量測試的增/

git最佳實踐feature和hotfix分支

我們 width style git最佳實踐 圖片 技術 功能 就是 因此   先來復習一波,git的最佳分支管理流程:   再簡單復習各個分支: master: 主分支,主要用來版本發布。 develop:日常開發分支,該分支正常保存了開發的最新代碼。 feature

智能合約最佳實踐 Solidity 編碼規範

Solidity 區塊鏈 智能合約 每一門語言都有其相應的編碼規範, Solidity 也一樣, 下面官方推薦的規範及我的總結,供大家參考,希望可以幫助大家寫出更好規範的智能合約。 命名規範 避免使用 小寫的l,大寫的I,大寫的O 應該避免在命名中單獨出現,因為很容易產生混淆。 合約、庫、事件、枚

蜜糖,吾砒霜——聊聊軟件開發中的最佳實踐

erb 嚴格 溝通 網絡 any 例子 衍生品 項目 achieve “描述一個事物,唯有一個名詞定義它的概念,唯有一個動詞揭露它的行為,唯有一個形容詞表現它的特征。要做的,就是用心去尋找那個名詞、那個動詞、那個形容詞……” —— 福樓拜 (Gustave Flau

SpringBoot2.X最佳實踐《一》 SpringBoot2.x初體驗

講解 mile height jar ide projects vat demo @param SpringBoot2.X最佳實踐 前言本系列文章,從零基礎接觸 SpringBoot2.x新版本,基礎入門使用,熱部署,到整合各個主流框架Redis4.x,消息隊列Acive