アセンブリを使用してスプリングブートマイクロサービスプロジェクトをパッケージ化する前に、現在のスプリングブートプロジェクトのいくつかの一般的な展開方法についてお話したいと思います。
Dockerコンテナを使用して展開し、SpringbootのアプリケーションをDocker画像にビルドし、コンテナを介して画像を起動します。この方法は、大規模なアプリケーションとアプリケーション拡張機能が必要な場合に非常に便利です。現在の産業レベルの展開ソリューションですが、Dockerエコシステムテクノロジーを習得する必要があります。
Fatjarを使用して展開して直接起動します。これは、多くの初心者や非常に小規模な状況向けの簡単なアプリケーション展開方法です。
この記事では、主に2番目の展開方法のためのよりフレンドリーなパッケージングソリューションを提供します。これは、展開管理を容易にするためです。最初の方法は、将来私のブログで書かれているかもしれません。
1.なぜスプリングブートを使用してパッケージ化する必要があるのですか?
最近、プロジェクトチームを見ました。彼らはスプリングブートを使用してプロジェクトを開発し、スプリングブートファッジャである運用およびメンテナンスチームとの相互作用を構築しました。さらに、このオリジナルのパッケージは、従来のプロジェクト開発会社の運用および保守担当者にとって間違いなく非常に致命的です。プロジェクトが配信された後、構成ファイル全体がJARに隠され、さまざまな環境の構成ファイルを変更することが非常に困難になります。したがって、会社に新しいテクノロジーを導入する場合、サービス指向およびエンジニアリングになる方法を検討する必要があります。技術的なフレームワークのみを参照する場合は、いくつかの依存関係を追加し、APIを読み、実行するコードを数行書くだけでいいかもしれません。
上記の問題に対処するには、サービス指向でエンジニアリング指向である必要があり、2つの問題を大まかに解決する必要があります。
スプリングブートが瓶の外側に構成ファイルをロードできるようにします。
通常、Windowsの下のシェルまたはバットであるサービスベースの起動スクリプトを提供します。 Springbootのアプリケーションサービススクリプトを使用すると、Springbootアプリケーションをコンテナリーに起動および停止できます。
2。パッケージ化されたスプリングブートアプリケーション構造図
ここでは、アセンブリを使用してスプリングブートサービスをパッケージ化した後、まずレンダリングを見ていきます。
3。サービスパッケージの重要な手順
以下は、スプリングブートを梱包するための詳細な手順です。
3.1アセンブリパッケージプラグインを追加します
<Plugin> <artifactid> maven-assembly-plugin </artifactid> <version> 3.0.0 </version> <configuration> <configuration> <decriptors> <desicriptor> src/main/assembly/assembly.xml </descriptor> </decriptors> </configuration> <実行<goal>シングル</goal> </goal> </execution> </executions> </plugin>
上記のコードから、メインディレクトリにアセンブリ構成を配置しました。これは習慣であり、ここに置くことはできません。プロジェクトのアセンブリの一般的な構造図は次のとおりです。
3.2 Assembly.xml構成
アセンブリの構成は、次の構成に似ています。これは、パッケージングサービススクリプト、JAR、構成ファイルなどにすぎません。次のコードから、アセンブリが構成ファイルを構成の下に入力していることがわかります。
<Assembly> <id> 1.0 </id> <formats> <format> tar.gz </format> </formats> <filesets> <fileset> <fileset> <fileset> <fileset> <directory> src/main/assembly/bin </directory> <outputdirectory> bin </outputdirectory> <filemode> <directory> src/main/assembly/config </directory> <outputdirectory> config </outputdirectory> <filemode> 0644 </filemode> </fileset> <fileset> <directory>ターゲット</directory> <OutputDirectory> lib </outputdirectory> <Directory> src/main/resources </directory> <OutputDirectory> logs </outputDirectory> <fileMode> 0755 </fileMode> <expludes> <explude> **/*</exclude> </expludes> </fileset> </filesets> </assembly>
3.3サービスサービススクリプトの書き込み
Linux環境のスクリプトを作成します。
最初のもの:Start.sh起動スクリプト
#!/bin/bashserver_name = 'spring-vue'#jar name jar_name = 'springboot-vue.jar'cd `dirname $ 0`bin_dir =` pwd`cd ..deploy_dir = `pwd`conf_conf_dir = $ deploy_dir_dir_dir_dir_dir_port =` sed '/server.port/!d;s/.*=/' config/application.properties | tr -d '/r'`#アプリケーションサーバーのポート番号を取得server_port = `sed -nr'/port:[0-9]+/s/.*ポート:+([0-9]+)。 Grep Java | grep "$ conf_dir" | awk '{print $ 2}' if ["$ 1" = "status"];次に[-n "$ pids"];次に、「$ server_nameが実行されています...!」 echo "pid:$ pids" exit 0 else echo "$ server_nameが停止します" exit 0 fifiif [-n "$ pids"];次に、エコー「エラー:$ server_nameが既に開始されました!」 echo "pid:$ pids" exit 1fiif [-n "$ server_port"];その後、server_port_count = `netstat -tln | Grep $ server_port | wc -l` if [$ server_port_count -gt 0];次に、「エラー:$ server_nameポート$ server_portが既に使用されています!」 exit 1 fifilogs_dir = $ deploy_dir/logsif [! -d $ logs_dir];次に、mkdir $ logs_dirfistdout_file = $ logs_dir/stdout.logjava_opts = "-djava.awt.headless = true -djava.net.preferipv4stack = true" java_debug_opts = "" if "" $ 1 "" = "" = "" = "" = 1 "" "$ 1" "" "$ 1" "=" "= 1" "=" "= 1" "その後、Java_debug_opts = "-xdebug -xnoagent -djava.compiler = none -xrunjdwp:Transport = dt_socket、address = 8000、server = y、suspend = n" fijava_jmx_opts = "" if ["$ 1" = "jmx"];次に、Java_jmx_opts = "-dcom.sun.management.jmxremote.port = 1099 -dcom.sun.management.jmxremote.ssl = false -dcom.sun.management.jmxremote.authenticate = fals" fals "fijava_opts =" bits = " grep -i 64 -bit`if [-n "$ bits"];次にJava_mem_opts = "-server -xmx512m -xms512m -xmn256m -xx:permsize = 128m -xss256k -xx:+disableExplicitgc -xx:+useconcmarksweepgc -xx -XX:LargePagesizeInbytes = 128m -xx:+usefastaccessormethods -xx:+usecmsinitiatingocccupancyonly -xx:cmsinitiatingoccupancyfraction = 70 "else java_mem_opts =" -server -xms512m -xmx512m2m2m2m2m2m2m2M -xxx: -xx:survivorratio = 2 -xx:+useParallelgc "ficonfig_files =" -dlogging.path = $ logs_dir -dlogging.config = $ conf_dir/log4j2.xml -dspring.config.location = $ conf_dir/application.properties "no -e -e" noe -e " $ java_opts $ java_mem_opts $ java_debug_opts $ java_jmx_opts $ config_files -jar $ deploy_dir/lib/$ jar_name> $ stdout_file 2>&1&1&1&count = 0while [$ count 1]; do echo -e "./c"スリープ1 [-n "$ server_port"];その後、count = `netstat -an | Grep $ server_port | wc -l` else count = `ps -f | Grep Java | grep "$ deploy_dir" | awk '{print $ 2}' | wc -l` fi if [$ count -gt 0];その後、fidoneecho "ok!" pids = `ps -f |を破りますGrep Java | grep "$ deploy_dir" | awk '{print $ 2}' `echo" pid:$ pids "echo" stdout:$ stdout_file "use case:#start of application./start.sh# debug mode./start debug#start jmx監視と開始jmx監視。 $ 0`bin_dir = `pwd`cd ..deploy_dir =` pwd`conf_dir = $ deploy_dir/configserver_name = $ deploy_dirpids = `ps -ef | Grep Java | grep "$ conf_dir" | awk '{print $ 2}' `if [-z" $ pids "];次に、エコー「エラー:$ server_nameが起動しません!」 exit 1fiif ["$ 1"!= "skip"];次に、$ bin_dir/dump.shfiecho -e "$ server_name .../cを停止します。 $ pid> /dev /null 2>&1donecount = 0 while [$ count -lt 1]を殺します; $ echo -e "./c" sleep 1 count = 1を$ pidsのpidでsleep sleep 1 count = 1。 do pid_exist = `ps -f -p $ pid | grep java` if [-n "$ pid_exist"];その後、count = 0 break fi doneecho "ok!"エコー「pid:$ pids」Windows環境のスタートアップスクリプト:
echo offset app_name = springboot-vue.jarset config = -dlogging.path = ../logs -dlogging.config = ../config/config/config/config/config/config/config/config/config/config/dspring.config.location = ../config/application.yml set debug_opts = if "" "= =" "" ""(debug_opts ""(debug_opts "」 -xloggc:../ logs/gc.log -verbose:gc -xx:+printgcdetails -xx:+heapdumponoutofmemoryerror -xx = ../logs goto debug)set jmx_opts = if ""%1 "" "jmx_opts" "(set jmx_opts -dcom.sun.management.jmxremote -dcom.sun.management.jmxremote.port = 9888 -dcom.sun.management.jmxremote.ssl = false -dcom.sun.management.jmxremote.authenticate = false goto jmx -xmx512m -server%debug_opts%jmx_opts%config%-jar ../lib/%app_name%goto end:debugecho "debug" java -xms512m -xmx512m -server%debug_opts%confut -jar ../ lyb/です。 -XMS512M -XMX512M -SERVER%JMX_OPTS%CONFIG%-JAR ../LIB/%APP_NAME%GOTO END:EndPause
さまざまなスプリングブートプロジェクトの場合、スクリプトを適切に変更するだけです。スペースを保存するために、ここに他のスクリプトをリストしません。提出したデモを参照できます:https://github.com/shalousun/springboot-vue.git
注:上記のスクリプトは、Dubboの役人から参照されています。実際、ダボプロジェクトの軽量構造にも似ています。
4。パッケージング後のログパス処理
2番目のセクションの図では、パッケージ化されたアプリケーションログが通常、ログディレクトリに出力されていることがわかります。ただし、さまざまなシステムプラットフォームの場合、構成されたログ出力パスは同じですが、最終的には必ずしもログに出力されるとは限りません。テスト後、Windowsプラットフォームで相対的なログパスを使用することは問題ありません。/ログ。しかし、Linuxシステムで相対パスを使用するためには、ログに出力することはできません。したがって、Linuxプラットフォームで絶対パスを作成することをお勧めします。ただし、私が提供したスクリプトで、出力ログへのパスを設定します
-dlogging.path = ../logs
したがって、log4j2の強力な解析能力を組み合わせることで、log42のログパスを設定できます。
<プロパティ名= "log_home"> $ {sys:logging.path} </property>ただし、Springbootアプリケーションのアクセスログは、Linuxで絶対パスのみを使用するようです。
#server ConfigServer:PORT:8080 UNDERTOW:ACCESSLOG:ENABLED:TRUE dir:/usr/xxx/logslogging:path:/usr/xxx/logs
もちろん、構成を使用して問題を後で解決する学生は、それらを修正するように思い出させることができます。
要約:
この計画自体は新しいものをもたらすものではなく、ほとんどのスクリプトはDubboの公式スクリプトを参照していますが、それらについていくつかの改善を行っています。しかし、重要なポイントは、実際の技術アプリケーションシナリオに基づいてこのテクノロジーを使用するために必要なサービスとエンジニアリングについて考える方法です。
上記は、編集者が導入したスプリングブートアセンブリベースのサービスパッケージソリューションです。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!