Saran menyebarkan file perang vs jar yang dapat dieksekusi dengan wadah yang disematkan

89

Tampaknya ada tren saat ini di ruang java untuk beralih dari penerapan aplikasi web java ke wadah servlet java (atau server aplikasi) dalam bentuk file perang (atau file telinga) dan sebagai gantinya mengemas aplikasi sebagai jar yang dapat dieksekusi dengan server servlet / HTTP tertanam seperti jetty. Dan maksud saya ini lebih pada cara kerangka kerja yang lebih baru memengaruhi bagaimana aplikasi baru dikembangkan dan diterapkan daripada bagaimana aplikasi dikirimkan ke pengguna akhir (karena, misalnya, saya mengerti mengapa Jenkins menggunakan wadah tersemat, sangat mudah untuk diambil dan digunakan. ). Contoh kerangka kerja yang mengadopsi opsi jar yang dapat dieksekusi: Dropwizard , Spring Boot , dan Play (baik itu tidak berjalan di wadah servlet tetapi server HTTP tertanam).

Pertanyaan saya adalah, berasal dari lingkungan di mana kami telah menyebarkan aplikasi kami (hingga saat ini kebanyakan Struts2) ke satu server aplikasi kucing jantan, perubahan, praktik terbaik, atau pertimbangan apa yang perlu dilakukan jika kami berencana menggunakan pendekatan wadah tertanam ? Saat ini, kami memiliki sekitar 10 aplikasi buatan sendiri yang berjalan pada satu server kucing jantan dan untuk aplikasi kecil ini kemampuan untuk berbagi sumber daya dan dikelola pada satu server adalah bagus. Aplikasi kami tidak dimaksudkan untuk didistribusikan ke pengguna akhir untuk dijalankan dalam lingkungan mereka. Namun, jika kita memutuskan untuk memanfaatkan framework java yang lebih baru, apakah pendekatan ini harus berubah? Apakah peralihan ke guci yang dapat dieksekusi didorong oleh meningkatnya penggunaan penerapan cloud (misalnya, Heroku)?

Jika Anda memiliki pengalaman mengelola beberapa aplikasi dalam gaya Play penerapan versus penerapan file perang tradisional di satu server aplikasi, harap bagikan wawasan Anda.

Brice Roncace
sumber

Jawaban:

81

Pertanyaan yang menarik. Ini hanya pandangan saya tentang topik tersebut, jadi ambillah semuanya dengan sebutir garam. Saya terkadang menerapkan dan mengelola aplikasi menggunakan wadah servlet dan server tertanam. Saya yakin masih banyak alasan bagus untuk menggunakan wadah servlet tetapi saya akan mencoba untuk hanya fokus pada mengapa mereka kurang populer saat ini.

Versi singkat: Servlet containers sangat bagus untuk mengelola banyak aplikasi pada satu host tetapi tampaknya tidak terlalu berguna untuk mengelola hanya satu aplikasi. Dengan lingkungan cloud, satu aplikasi per mesin virtual tampaknya lebih disukai dan lebih umum. Kerangka kerja modern ingin kompatibel dengan cloud, oleh karena itu peralihan ke server tertanam.


Jadi menurut saya layanan cloud adalah alasan utama untuk meninggalkan kontainer servlet. Sama seperti wadah servlet yang memungkinkan Anda mengelola aplikasi, layanan cloud memungkinkan Anda mengelola mesin virtual, instance, penyimpanan data, dan banyak lagi. Ini terdengar lebih rumit, tetapi dengan lingkungan cloud, telah terjadi pergeseran ke mesin aplikasi tunggal. Ini berarti Anda dapat sering memperlakukan seluruh mesin seperti itu adalah yang aplikasi. Setiap aplikasi berjalan di mesin dengan ukuran yang sesuai. Instance cloud dapat muncul dan menghilang kapan saja yang sangat bagus untuk penskalaan. Jika sebuah aplikasi membutuhkan lebih banyak sumber daya, Anda membuat lebih banyak contoh.

Di sisi lain, server khusus biasanya kuat tetapi dengan ukuran tetap, jadi Anda menjalankan banyak aplikasi pada satu mesin untuk memaksimalkan penggunaan sumber daya. Mengelola lusinan aplikasi - masing-masing dengan konfigurasinya sendiri, server web, rute dan koneksi, dll. - tidaklah menyenangkan, jadi menggunakan wadah servlet membantu Anda untuk menjaga semuanya tetap dapat dikelola dan diri Anda sendiri waras. Ini lebih sulit untuk diukur. Kontainer servlet di cloud sepertinya tidak terlalu berguna. Mereka harus disiapkan untuk setiap contoh kecil, tanpa memberikan banyak nilai karena mereka hanya mengelola satu aplikasi.

Selain itu, awan itu keren dan hal-hal non-awan itu membosankan (jika kita masih percaya hype). Banyak kerangka kerja mencoba untuk diskalakan secara default, sehingga dapat dengan mudah diterapkan ke awan. Server yang disematkan cepat untuk diterapkan dan dijalankan sehingga tampak seperti solusi yang masuk akal. Kontainer servlet biasanya masih didukung tetapi membutuhkan penyiapan yang lebih rumit.

Beberapa poin lainnya:

  • Server tertanam dapat dioptimalkan untuk kerangka kerja atau lebih terintegrasi dengan alat kerangka kerja (seperti konsol bermain misalnya).
  • Tidak semua lingkungan cloud dilengkapi dengan image mesin yang dapat disesuaikan. Alih-alih menulis skrip inisialisasi untuk mengunduh dan menyiapkan wadah servlet, menggunakan perangkat lunak khusus untuk penerapan aplikasi awan jauh lebih sederhana.
  • Saya belum menemukan pengaturan Tomcat yang tidak menyambut Anda dengan kesalahan ruang gen perm setiap beberapa pemindahan aplikasi Anda. Perlu waktu sedikit lebih lama untuk memulai (kembali) server tertanam tidak menjadi masalah ketika Anda hampir dapat langsung beralih antara instans pementasan dan produksi tanpa waktu henti.
  • Seperti yang telah disebutkan dalam pertanyaan, sangat nyaman bagi pengguna akhir untuk menjalankan aplikasi saja.
  • Server tertanam bersifat portabel dan nyaman untuk pengembangan. Saat ini semuanya berjalan cepat , prototipe dan MVP perlu dibuat dan dikirimkan secepat mungkin. Tidak ada yang mau menghabiskan terlalu banyak waktu menyiapkan lingkungan untuk setiap pengembang.
kapex
sumber
1
Terima kasih telah menjawab, Anda membuat beberapa poin bagus. Cloud adalah faktor pendorong! Dalam situasi kami, saya akan merasa lebih nyaman memiliki server cloud ala model Amazon Web Services (Infrastructure as a Service) dibandingkan dengan hanya menerapkan aplikasi ala Google App Engine (Platform as a Service), tapi saya kira ini sekolah pemikiran lama. Jadi kesimpulannya: kecuali kami berencana untuk memanfaatkan cloud dalam platform sebagai cara layanan, penyebaran perang adalah cara yang harus dilakukan daripada mengelola beberapa aplikasi web java mandiri di satu server. Terima kasih sekali lagi atas masukan Anda.
Brice Roncace
3
Hanya 2cc: Anda dapat menjalankan beberapa aplikasi jar di satu mesin dengan beberapa server HTTP ringan sebagai proxy, yaitu: nginx, ini dapat digunakan sebagai tambahan untuk lalu lintas web biasa seperti CDN khusus, penyeimbang beban, firewall, dll. Jadi masuk akal untuk mempertimbangkan menggunakannya saat merencanakan lalu lintas besar (kinerjanya lebih baik, lalu menangani setiap permintaan - bahkan untuk sumber daya statis melalui aplikasi utama Anda).
biesior