Penerapan Aplikasi Musim Semi Biru-Hijau dengan Nginx Web Server

gambar


Catatan perev. - Dengan artikel ini, kami memulai serangkaian terjemahan yang ditujukan untuk topik Zero Downtime Deployment. Publikasi berikut akan menyoroti penyebaran versi baru aplikasi dengan basis data dan penyebaran di Kubernetes.


Terlepas dari kenyataan bahwa solusi teknis yang dijelaskan di bawah ini kontroversial, tujuan artikel ini adalah untuk membiasakan pembaca secara langsung dengan pendekatan penyebaran Biru-Hijau, yang, secara kebetulan, berlaku tidak hanya untuk aplikasi Musim Semi.


Tujuan penyebaran Biru-Hijau adalah untuk menghilangkan waktu henti selama penerapan versi baru aplikasi.


Downtime dikaitkan dengan tidak tersedianya server ketika versi baru aplikasi diinstal untuk menggantikan yang lama. Gagasan penyebaran Biru / Hijau adalah untuk menyebarkan versi baru aplikasi di tempat terpisah di mana Anda dapat melakukan pengujian, sampai keputusan akhir dibuat untuk beralih ke itu sebagai yang utama.


gambar


Pada artikel ini, kita akan melihat cara mengkonfigurasi penyebaran Blue-Green dari aplikasi boot Spring. Kami akan menggunakan Nginx sebagai server web utama untuk mengalihkan permintaan yang masuk ke aplikasi kami.


Pengaturan server


Panduan ini mengasumsikan bahwa Anda memiliki server dan aplikasi Spring boot yang berjalan yang dapat digunakan untuk itu.


Di server, buka direktori home Anda dan buat dua folder: blue dan green . Maka kita membutuhkan dua tautan simbolis yang available dan testing . Tautan ini akan menunjuk ke folder biru atau hijau. Misalnya, jika available poin menjadi green , maka testing poin menjadi blue .


 mkdir blue mkdir green ln -s ./green ./available ln -s ./blue ./testing 

Setiap folder akan berisi aplikasi Spring dan konfigurasi Nginx sendiri. Di beberapa titik selama penyebaran, kedua aplikasi akan bekerja secara bersamaan (meskipun pada port yang berbeda), dan untuk beralih dari aplikasi biru ke hijau, kita hanya perlu mengubah konfigurasi Nginx menjadi hijau atau biru.


gambar


Konfigurasi nginx


Katakanlah kita memiliki domain springsite.com. Konfigurasi hijau Nginx akan mengalihkan semua panggilan ke springsite.com/api/ ke aplikasi green di port 8080, dan semua panggilan ke springsite.com/api-test/ ke aplikasi blue di port 8090.


Mari kita buat file konfigurasi ini. Buka editor favorit Anda dan tambahkan konten berikut.


 http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name mysite.com; location /api { proxy_pass http://localhost:8090/api; } location /api-test { proxy_pass http://localhost:8080/api; } } include servers/*; } 

 http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name mysite.com; location /api { proxy_pass http://localhost:8080/api; } location /api-test { proxy_pass http://localhost:8090/api; } } include servers/*; } 

Struktur file akan terlihat seperti ini:


 --root |--- blue |--- nginx.conf.blue |--- app-V2.jar |--- green |--- nginx.conf.green |--- app-V1.jar |--- available -> ./green |--- testing -> ./blue 

Misalkan kita ingin menggunakan versi baru dalam wadah blue . Kami dapat mengujinya saat versi sebelumnya masih tersedia . Setelah semua orang senang dengan versi baru, kita hanya perlu mengubah tautannya!


Buat file swap.sh di folder yang berisi folder blue dan green :


 touch swap.sh chmod +x swap.sh 

Tambahkan konten berikut ke file swap.sh :


 #!/bin/bash testing_now=$(ls -l ./ | grep testing) if [[ "$testing_now" == *blue ]] then testing="blue" active="green" else testing="green" active="blue" fi #remove current links rm ./available rm ./testing rm -f /etc/nginx/nginx.conf #create new links with the active/inactive reversed ln -s ./$inactive ./available ln -s ./$active ./testing ln -s /home/ubuntu/spring/$active/nginx.conf /etc/nginx/nginx.conf #reload the http server service nginx reload echo swap completed $active is now available 

Pada titik ini, kita dapat menjalankan 2 aplikasi Pegas pada port 8090 dan 8080 dan mengubahnya dengan menjalankan sudo ./swap.sh .


Sebarkan


Berkat tautan simbolik, kami tahu bahwa aplikasi utama selalu ditunjukkan dengan available , dan aplikasi yang sedang diuji dengan testing . Karena itu, kita harus selalu menggunakan versi baru aplikasi di folder testing menggunakan tautan simbolis. Diasumsikan bahwa kita baru saja mengemas aplikasi, dan sekarang kita dapat mengunduhnya menggunakan scp .


 scp -r -i ~/.ssh/MyKeyPair.pem <package name.jar> <user>@<ip>:spring/testing 

Pindah


Menyiapkan penyebaran Biru-Hijau di server Anda akan secara signifikan mengurangi waktu henti . Panduan ini menjelaskan cara menggunakan versi baru aplikasi Anda yang berada di server fisik yang sama. Ini dapat disesuaikan dengan situasi dengan beberapa server fisik dan penyeimbang beban. Namun, ini akan membutuhkan memiliki dua kali lebih banyak lingkungan produksi yang diperlukan. Untuk infrastruktur yang sangat besar, ini tidak mungkin atau sangat mahal.


Ini mengarah pada pertanyaan: Bagaimana perusahaan besar mengelola untuk merilis versi baru dari aplikasi mereka tanpa downtime? Pikirkan Google atau Facebook yang selalu tersedia!


Menggunakan penyebaran Biru-Hijau di sini tidak realistis karena banyaknya server yang diperlukan. Pembaruan aplikasi dilakukan secara bertahap: server dikeluarkan dari layanan satu per satu, dan dikembalikan setelah pembaruan. Selain itu, versi baru juga dirilis secara bertahap: pada awalnya, hanya sebagian kecil dari server yang akan bekerja dengan versi baru. Kemudian, jika tidak ada masalah atau bug ditemukan, semakin banyak server akan mulai dengan kode baru. Pada titik ini, metrik kinerja penting seperti CPU, memori, dan kinerja kueri dievaluasi. Jika semuanya berjalan dengan baik, rilis sudah selesai, dan versi baru aplikasi akan diluncurkan di setiap server di seluruh dunia.


Kesimpulan


Saya harap Anda sekarang mengerti bagaimana mengatasi masalah downtime berkat penyebaran Biru-Hijau. Sekarang Anda dapat mengkonfigurasi penyebaran Biru-Hijau dasar aplikasi Musim Semi Anda dengan NGINX.


Seperti yang mungkin Anda perhatikan, ketika kami menggunakan solusi ini, versi lama dan saat ini dari aplikasi Anda bekerja secara bersamaan dan keduanya terhubung ke database. Ini dapat menyebabkan masalah yang tidak terduga ketika mengubah struktur database. Artikel hebat ini https://spring.io/blog/2016/05/31/zero-downtime-deployment-with-a-database menjelaskan cara menangani situasi seperti itu.


Dan akhirnya, Anda mungkin tertarik pada fakta bahwa AWS dan Google Cloud Compute menawarkan layanan Penyebaran Blue-Green di luar kotak:


https://aws.amazon.com/quickstart/architecture/blue-green-deployment/
https://cloud.google.com/solutions/continuous-delivery/


Baca juga artikel lain di blog kami:


Source: https://habr.com/ru/post/id470568/


All Articles