قبل استخدام Assembly لتعبئة مشاريع Microservices Springboot ، أود التحدث عن العديد من طرق النشر الشائعة لمشاريع Springboot في الوقت الحاضر.
استخدم حاويات Docker للنشر ، وبناء تطبيق Springboot في صورة Docker ، ثم بدء الصورة من خلال الحاوية. هذه الطريقة مريحة للغاية عندما تكون هناك حاجة إلى تطبيقات واسعة النطاق وملحقات التطبيق. إنه حل النشر الحالي على المستوى الصناعي ، لكنه يتطلب إتقان تقنية نظام Docker للأنظمة الإيكولوجية.
استخدم fatjar للنشر والبدء مباشرة ، وهي طريقة بسيطة لنشر التطبيق للعديد من المبتدئين أو المواقف الصغيرة جدًا.
توفر هذه المقالة بشكل أساسي حل تغليف أكثر ودية لطريقة النشر الثانية ، والتي تهدف إلى جعل إدارة النشر أسهل. يمكن كتابة الطريقة الأولى في مدونتي في المستقبل.
1. لماذا يجب تعبئة سبرينغ بوت في الخدمة؟
في الآونة الأخيرة رأيت فريق مشروع. لقد استخدموا Springboot لتطوير المشروع وبناء التفاعلات مع فريق التشغيل والصيانة ، وهو فاطرة الحذاء الربيعي. علاوة على ذلك ، فإن هذه الحزمة الأصلية مميتة للغاية بالنسبة لموظفي التشغيل والصيانة في شركات تطوير المشاريع التقليدية. بعد تسليم المشروع ، يتم إخفاء ملف التكوين بأكمله في الجرة ، ويصبح تعديل ملف التكوين لبيئات مختلفة أمرًا صعبًا للغاية. لذلك ، عندما نقدم أي تقنية جديدة في الشركة ، يجب أن نفكر في كيفية التوجه نحو الخدمة والهندسة. إذا نشأنا فقط إلى الإطار الفني ، فقد نحتاج فقط إلى إضافة بعض التبعيات ، وقراءة واجهة برمجة التطبيقات وكتابة بضعة أسطر من التعليمات البرمجية.
لمعالجة المشكلات المذكورة أعلاه ، نحتاج إلى أن نكون موجهين نحو الخدمة والموجهة نحو الهندسة ، ونحن بحاجة إلى حل مشكلتين تقريبًا:
قم بتمكين Springboot لتحميل ملفات التكوين خارج الجرة.
قم بتوفير برنامج نصي بدء تشغيل قائم على الخدمة ، والذي عادةً ما يكون قذيفة أو خفافيش تحت Windows. باستخدام برنامج SPRINGBOOT لخدمة التطبيق ، يمكنك بدء تشغيل تطبيقات Springboot ووقف الحاوية.
2. مخطط بنية تطبيق Springboot المعبأة
هنا نلقي نظرة أولاً على العروض بعد استخدام Assembly لتعبئة خدمة Springboot.
3. خطوات مهمة لتعبئة الخدمة
فيما يلي الخطوات التفصيلية لتعبئة سبرينج.
3.1 إضافة مكون الإضافي حزمة التجميع
<Spundin> <StifactId> maven-assembly-plugin </shintifactid> <الإصدار> 3.0.0 </version> <configuration> <واصفات> <واصف> src/main/assectly/assecly. <vide> Single </sivel> </forts> </execution> </exراضية> </plugin>
من الكود أعلاه ، لقد وضعت تكوين التجميع في الدليل الرئيسي. هذه عادة ، ولا يمكنك وضعها هنا. فيما يلي رسم تخطيطي للهيكل العام للتجميع في المشروع:
3.2 Assembly.xml التكوين
يشبه تكوين التجميع التكوين التالي ، والذي ليس أكثر من نصوص خدمة التعبئة والتغليف ، الجرار ، ملفات التكوين ، وما إلى ذلك من الكود التالي ، ستجد أن التجميع قد كتبت ملف التكوين ضمن التكوين.
<Enssionbly> <Id> 1.0 </id> <تنسيق> <Spondat> tar.gz </simpat> </isplates> <Ipilesets> <Ipileset> <IpaLeet> <Cirlive> src/main/assembly/config </directory> <DoutpeDirectory> config </outputDirectory> <filemode> 0644 </filemode> </filectet> <ileset> <cirlive> الهدف </fille> <routpionDirectory> lib </ <Criptory> src/main/resources </directory> <DoutpeDirectory> سجلات </outputdirectory> <filemode> 0755 </filemode> <assecteds> <sective> **/*</exclude> </excludes> </fileset> </filesets> </assectly>
3.3 كتابة البرامج النصية للخدمات
الآن اكتب البرامج النصية لبيئة Linux.
الأول: START.SH STARPL SCRIPT
#!/bin/bashserver_name = 'spring-vue'# jar name jar_name = 'springboot-vue.jar'cd `dirname $ 0`bin_dir =` pwd`cd '/server.port/! tr -d '/r'`# احصل على رقم المنفذ الخاص بـ Application Server_port = `sed -nr'/port: [0-9]+/s /.* port:+([0-9]+).*// 1/p 'config/application.yml`pids =` ps -f | جريب جافا | 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 بالفعل!" صدى "pid: $ pids" خروج 1fiif [-n "$ server_port"] ؛ ثم server_port_count = `netstat -tln | grep $ server_port | wc -l` if [$ server_port_count -gt 0] ؛ ثم صدى "خطأ: منفذ $ server_name $ server_port المستخدم بالفعل!" الخروج 1 fifilogs_dir = $ deploy_dir/logsfif [! -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 "] ثم java_debug_opts = "-xdebug -xnoagent -djava.compiler = none -xrunjdwp: transport = dt_socket ، address = 8000 ، server = y ، append = n ثم java_jmx_opts = "-dcom.sun.management.jmxremote.port = 1099 -dcom.sun.management.jmxRemote.ssl = false -dcom.sun.management.jmxRemote.authentate = false" fijava_mem_opts = "bits =` java - grep -i 64 bit`if [-n "bits $"] ؛ ثم java_mem_opts = "-server -xmx512m -xms512m -xmn256m -xx: permsize = 128m -xss256k -xx:+disableexplicitgc -xx:+useconcmarksweepgc -xx: -xx: bargepagesizeInbytes = 128m -xx:+uSfastAccessorMethods -xx:+usecmsinitiAtiatingOccupancyonly -xx: cminitiAtiAtingoCupancyfraction = 70 " -xx: survivorratio = 2 -xx:+useParallelgc "ficonfig_files =" -dlogging.path = $ logs_dir -dlogging.config = $ conf_dir/log4j2 $ java_opts $ java_mem_opts $ java_debug_opts $ java_jmx_opts $ config_files -jar $ deploy_dir/lib/$ jar_name> $ stdout_file 2> & 1 & count = 0while [$ count -lt 1] ؛ do echo -e "./c" sleep 1 if [-n "$ server_port"] ؛ ثم العد = `netstat -an | grep $ server_port | wc -l` آخر العد = `ps -f | جريب جافا | GREP "$ deploy_dir" | awk '{print $ 2}' | wc -l` fi if [$ count -gt 0] ؛ ثم كسر fidoneecho "موافق!" pids = `ps -f | جريب جافا | GREP "$ deploy_dir" | awk '{print $ 2}' `echo" pid: $ pids "echo" stdout: $ stdout_file "استخدام case:# ابدأ التطبيق. $ 0`bin_dir = `pwd`cd ..deploy_dir =` pwd`conf_dir = $ deploy_dir/configserver_name = $ deploy_dirpids = `ps -ef | جريب جافا | grep "$ conf_dir" | awk '{print $ 2}' `if [-z" $ pids "] ؛ ثم صدى "خطأ: لم يبدأ $ server_name!" الخروج 1fiif ["$ 1"! = "Skip"] ؛ ثم $ bin_dir/dump.shfiecho -e "إيقاف $ server_name .../c" لـ pid in $ pids ؛ هل تقتل $ pid> /dev /null 2> & 1doneCount = 0 ووجي [$ count -lt 1] ؛ هل الصدى -e ". do pid_exist = `ps -f -p $ pid | grep java` if [-n "$ pid_exist"] ؛ ثم العد = 0 Break fi doneOneecho "حسنًا!" صدى "pid: $ pids"البرنامج النصي بدء التشغيل لبيئة Windows:
صدى إزاحة app_name = springboot -vue.jarset config = -dlogging.path = ../logs -dlogging.config = ../config/log4j2.xml -dspring.config.location = ../config/application.ym set debug_opts = "٪ 1" " -xloggc: ../ logs/gc.log -verbose: gc -xx:+printgcdetails -xx:+heapdumponoutofMemoryRor -xx: heapdumppath = ../logs goto debug) set jmx_opts = if "٪ 1" "" -dcom.sun.management.jmxremote -dcom.sun.management.jmxremote.port = 9888 -dcom.sun.management.jmxRemote.ssl = false -dcom.sun.management.jmxRemote.Authentate = false goto jmx) echo "applist app_name ٪" -xmx512m -server ٪ debug_opts ٪ jmx_opts ٪ ٪ config ٪ -jar ../lib/٪app_name٪goto end: debugecho "debug" java -xms512m -xmx512m -Server ٪ debug_opts ٪ -jar .. -XMS512M -XMX512M -Server ٪ JMX_OPTS ٪ ٪ config ٪ -jar ../lib/٪app_name٪goto النهاية: Endpause
لمشاريع Springboot المختلفة ، تحتاج فقط إلى تعديل البرنامج النصي بشكل مناسب. من أجل توفير المساحة ، لن أدرج نصوص أخرى هنا. يمكنك الرجوع إلى العرض التوضيحي الذي قدمته: https://github.com/shalousun/springboot-vue.git
ملاحظة: يتم الرجوع إلى البرنامج النصي أعلاه من مسؤول Dubbo. في الواقع ، يشبه أيضًا البناء الخفيف للوزن لمشاريع Dubbo.
4. معالجة مسار السجل بعد التغليف
في الشكل في القسم الثاني ، يمكنك أن ترى أن سجلات التطبيق المعبأة يتم إخراجها عمومًا إلى دليل السجلات. ومع ذلك ، بالنسبة لمنصات النظام المختلفة ، على الرغم من أن مسارات إخراج السجل التي تم تكوينها هي نفسها ، إلا أنها قد لا يتم إخراجها بالضرورة إلى السجلات في النهاية. بعد الاختبار ، لا توجد مشكلة في استخدام مسارات السجل النسبية في منصة Windows ../ السجلات ، ولكن لاستخدام المسارات النسبية في أنظمة Linux ، لا يمكن إخراجها إلى سجلات. لذلك ، يوصى بكتابة المسارات المطلقة في نظام Linux. ومع ذلك ، في البرنامج النصي الذي قدمته ، اضبط المسار على سجل الإخراج
-dlogging.path = ../سجلات
لذلك ، الجمع بين قدرة التحليل القوية لـ log4j2 ، يمكنك تعيين مسار السجل لـ LOG42:
<property name = "log_home"> $ {sys: logging.path} </property>ومع ذلك ، يبدو أن سجل الوصول لتطبيقات Springboot يستخدم فقط المسارات المطلقة تحت Linux.
# خادم configserver: المنفذ: 8080 Instow: Accesslog: ممكّن: True dir:/usr/xxx/logslogging: path:/usr/xxx/logs
بالطبع ، يمكن للطلاب الذين يستخدمون التكوين لحل المشكلة في وقت لاحق تذكيرهم بتصحيحها.
تلخيص:
لا تجلب هذه الخطة نفسها أي شيء جديد ، ويتم الإشارة إلى معظم البرامج النصية إلى البرامج النصية الرسمية لـ Dubbo ، لكنهم قاموا ببعض التحسينات عليها. ولكن النقطة المهمة هي كيفية التفكير في الخدمة والهندسة اللازمة لاستخدام هذه التكنولوجيا بناءً على سيناريوهات التطبيق الفني الفعلي.
ما سبق هو حل تغليف الخدمات المستند إلى مجموعة سبرينغ بوت التي قدمها المحرر. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!