Heroku + Docker + Boot Musim Semi

Berikut ini akan fokus pada pengalaman saya menjalankan aplikasi Boot Musim Semi bersandar pada mesin virtual gratis layanan cloud Heroku . Salah satu keuntungan utama dari penyedia ini adalah memungkinkan untuk membuat mesin virtual gratis dengan batasan jam kerja, dan untuk ini, hanya pendaftaran yang cukup. Bahkan detail pembayaran tidak perlu dikonfirmasi, meskipun jika Anda mengonfirmasinya, Anda bisa mendapatkan bonus tambahan. Anda dapat membaca lebih lanjut tentang harganya di sini . Dari sudut pandang saya, kebijakan mereka mengenai sumber daya gratis hampir tidak memiliki analog.

Jadi, setelah Anda membuat aplikasi di Heroku, ada beberapa cara untuk menggunakan kode Anda di dalamnya

  • komit di repositori heroku git
  • ikat aplikasi ke repositori github
  • menggunakan wadah buruh pelabuhan

Selanjutnya, kami akan mempertimbangkan yang terakhir dari metode ini. Untuk melanjutkan, kita perlu aplikasi berikut


Alat terakhir ini akan memberi kita kesempatan untuk melakukan semua operasi untuk bekerja dengan cloud dari baris perintah.

Kami mulai dengan membuat aplikasi Spring Boot melalui Spring Initializr . Sebagai dependensi tambahkan Spring Web Starter. Itu sudah cukup.

Dalam paket yang sama di mana kelas utama aplikasi berada, kami menambahkan kelas paling sederhana dari pengendali REST sehingga aplikasi entah bagaimana menunjukkan tanda-tanda kehidupan.

@RestController public class DemoController { @GetMapping("/check") public String check() { return "Application is alive"; } } 

Tambahkan ke file application.properties

 server.port=${PORT:8080} 

Pengaturan ini sangat penting untuk menjalankan wadah di Heroku. Faktanya adalah bahwa dalam jaringan internal layanan, aplikasi diluncurkan pada beberapa port bebas pada saat peluncuran, yang jumlahnya ditransmisikan melalui variabel lingkungan PORT. Selain itu, aplikasi harus memiliki waktu untuk terhubung ke port ini dalam 60 detik pertama setelah peluncuran, jika tidak maka akan berhenti.

Di bagian plugins dari file pom.xml kami menambahkan dockerfile-plugin dari Spotify, yang akan membantu kami dengan perakitan gambar buruh pelabuhan dari aplikasi kami.

 <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.6</version> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <repository>registry.heroku.com/${project.artifactId}/web</repository> <tag>latest</tag> <buildArgs> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin> 

Konfigurasi plug-in seperti itu akan mulai membangun gambar sebagai bagian dari target instal, dan mendorong gambar ke dalam repositori buruh pelabuhan Heroku sebagai bagian dari target penyebaran. Ngomong-ngomong, untuk dapat menjalankan maven deploy, Anda harus menonaktifkan penyebaran file jar yang sudah dirakit (kami tidak perlu mengunggahnya ke mana saja). Anda dapat melakukan ini menggunakan opsi maven.deploy.skip di bagian properti file pom.xml.

 <properties> <java.version>1.8</java.version> <maven.deploy.skip>true</maven.deploy.skip> </properties> 

Selanjutnya, buat Dockerfile di folder root proyek (di sebelah pom.xml)

 FROM openjdk:8-jdk-alpine ARG JAR_FILE RUN mkdir -p /apps COPY ./target/${JAR_FILE} /apps/app.jar COPY ./entrypoint.sh /apps/entrypoint.sh RUN chmod +x /apps/entrypoint.sh CMD ["/apps/entrypoint.sh"] 

Seperti yang Anda lihat, kami meneruskan nama file jar yang dirakit di sini sebagai argumen ke majelis (ARG JAR_FILE). Nilai argumen ini diatur dalam pengaturan plugin pakar.

Script entrypoint.sh juga akan ditempatkan di root proyek dan itu akan sangat sederhana.

 #!/usr/bin/env sh /usr/bin/java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Xmx256m -Xss512k -XX:MetaspaceSize=100m -jar /apps/app.jar 

Perhatikan parameter JVM yang membatasi memori, dan terutama untuk dua parameter pertama. Mereka termasuk mode manajemen memori khusus, yang diperlukan ketika aplikasi java diluncurkan di dalam wadah Docker. Memori yang tersedia untuk aplikasi pada mesin Heroku gratis dibatasi hingga 512MB. Melebihi batas ini akan mengakhiri aplikasi. Jika Anda ingin menggunakan Java 9+, maka dua opsi pertama harus diganti dengan satu -XX: + UseContainerSupport . Anda dapat membaca lebih lanjut di sini . Tampaknya juga dukungan kontainer tidak lagi menjadi fitur eksperimental di Java 8. Detail di sini.

Setelah menyelesaikan langkah-langkah ini, coba mulai
 mvnw clean install 

Jika semuanya dilakukan dengan benar, maka aplikasi dan gambar buruh pelabuhan untuk itu harus dibangun. Anda dapat memeriksa apakah gambar itu dibuat menggunakan perintah
 docker images 

Sekarang mari kita atur cloud dan gunakan Heroku CLI yang sudah disebutkan untuk ini. Tentu saja, untuk menyelesaikan langkah-langkah ini, Anda harus mendaftarkan akun di Heroku.

Pertama-tama, kita harus masuk. Untuk melakukan ini, jalankan perintah
 heroku login 
dan ikuti instruksi di bawah ini.

Setelah itu, Anda harus masuk ke repositori heroku Docker. Untuk melakukan ini, jalankan perintah
 heroku container:login 
tanpa ini, kita tidak dapat mendorong gambar buruh pelabuhan kami.

Selanjutnya, kita membuat aplikasi menggunakan perintah
 heroku apps:create <app-name> 

Harap dicatat bahwa nama aplikasi harus cocok dengan nama artefak yang ditentukan dalam pom.xml . Mungkin di sini Anda harus meluangkan waktu untuk memilih nama aplikasi, yang masih belum ditempati oleh siapa pun.

Setelah aplikasi dibuat, jalankan
 mvnw clean deploy 

dan tunggu aplikasi yang akan dibangun dan dorong gambar buruh pelabuhan terjadi. Harap dicatat bahwa push hanya dimungkinkan jika nama gambar cocok dengan templat registry.heroku.com/<app-name>/web dan aplikasi dengan nama <app-name> telah dibuat. Jika Anda melihat pengaturan plugin maven, Anda akan melihat bahwa semuanya dilakukan persis seperti itu.

Langkah terakhir untuk gambar yang akan digunakan dan diluncurkan adalah perintah
 heroku container:release web --app=<app-name> 

Setelah itu, ikuti tautan https: // <app-name> .herokuapp.com / periksa dan setelah beberapa saat Anda akan melihat teks yang akan ditampilkan oleh pengendali pengendali.

Cara lain untuk membuka aplikasi yang sedang berjalan di browser adalah dengan menggunakan perintah
 heroku open --app=<app-name> 

Jika sesuatu tidak berfungsi, log dapat dilihat di antarmuka Web Heroku atau dengan perintah
 heroku logs 

Itu saja! Semoga panduan ini bermanfaat!

Beberapa tautan bermanfaat


1. Dokumentasi Heroku CLI devcenter.heroku.com/categories/command-line
2. Tentang fitur manajemen memori di Java devcenter.heroku.com/articles/java-memory-issues Java
3. devcenter.heroku.com/categories/deploying-with-docker
4. Contoh aplikasi Java dari Heroku. Ada metode penyebaran yang berbeda, tetapi berguna untuk melihat github.com/heroku/java-getting-started
5. Panduan Heroku untuk meluncurkan aplikasi Java (bukan melalui Docker) devcenter.heroku.com/articles/getting-started-with-java?singlepage=true
6. Materi yang Baik tentang Menggunakan Java di Docker habr.com/en/company/hh/blog/450954
7. Tentang opsi untuk meluncurkan Java dalam wadah Docker www.oracle.com/technetwork/java/javase/8u191-relnotes-5032181.html#JDK-8146115

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


All Articles