Pengantar Kerangka Kerja Micronaut



1. Apa itu Micronaut


Micronaut adalah kerangka kerja JVM untuk membangun aplikasi modular yang ringan. Ini dikembangkan oleh OCI, perusahaan yang sama dengan yang diberikan Grails kepada kami. Micronaut adalah kerangka kerja modern yang dirancang untuk membuat pembuatan aplikasi layanan microser cepat dan mudah.

Micronaut berisi fitur yang mirip dengan kerangka kerja yang ada seperti Spring, tetapi pada saat yang sama mengimplementasikan beberapa ide baru yang menjadi keunggulannya. Bersama dengan dukungan untuk Java, Groovy, dan Kotlin, ia menawarkan banyak cara untuk membuat aplikasi.

2. Fitur utama


Salah satu fitur Micronaut yang paling menarik adalah dependency injection (DI) pada waktu kompilasi. Sebagian besar kerangka kerja menggunakan objek refleksi dan proxy untuk menyuntikkan dependensi saat runtime. Micronaut juga mengumpulkan data untuk injeksi ketergantungan pada tahap kompilasi. Hasilnya adalah waktu startup aplikasi lebih cepat dan lebih sedikit konsumsi memori.

Peluang berikutnya adalah dukungan kelas satu untuk pemrograman reaktif, baik untuk klien maupun untuk server. Pilihan implementasi spesifik dari pendekatan reaktif diserahkan kepada pengembang solusi, dan RxJava dan Project Reactor didukung di luar kotak.

Plus, Micronaut memiliki beberapa fitur yang menjadikannya kerangka kerja pengembangan asli-cloud yang luar biasa. Ini mendukung banyak mekanisme penemuan layanan, seperti Eureka dan Konsul, dan juga bekerja dengan berbagai sistem penelusuran terdistribusi seperti Zipkin dan Jaeger.

Selain itu, ia menyediakan dukungan untuk membuat fungsi lambda AWS, membuatnya mudah untuk membuat aplikasi tanpa server.

3. Memulai


Cara termudah untuk memulai adalah menggunakan SDKMAN:

> sdk install micronaut 1.0.0.M2

SDKMAN akan menginstal semua binari yang Anda butuhkan untuk membangun, menguji, dan menggunakan aplikasi Micronaut. Selain itu, Anda akan menerima aplikasi konsol Micronaut CLI, yang memungkinkan Anda untuk memulai proyek baru dengan mudah.

Artefak biner juga tersedia di Sonatype dan di Github.

Di bagian berikut, kita akan melihat beberapa fitur Micronaut.

4. Injeksi Ketergantungan (DI)


Seperti disebutkan sebelumnya, Micronaut menangani injeksi ketergantungan pada waktu kompilasi, yang membedakannya dari sebagian besar wadah IoC.

Namun, ia sepenuhnya mendukung anotasi JSR-330, sehingga penanganan kacang mirip dengan kerangka kerja IoC lainnya.

Untuk menyuntikkan bin ke kode kami, kami menggunakan @Inject :

 @Inject private EmployeeService service; 

@Inject berfungsi seperti @Autowired dan dapat digunakan dengan bidang, metode, konstruktor, dan parameter.

Secara default, semua kacang memiliki lingkup - prototipe. Kita dapat dengan cepat membuat singletones menggunakan anotasi @Singleton . Jika beberapa kacang menerapkan antarmuka yang sama, kita dapat menggunakan penjelasan @Primary untuk menyelesaikan konflik:

 @Primary @Singleton public class BlueCar implements Car {} 

@Requires dapat digunakan ketika kacang bersifat opsional, atau untuk melakukan injeksi ketika kondisi tertentu terpenuhi.

Dalam hal ini, ia berperilaku dengan cara yang sama seperti penjelasan Boot Spring - @Conditional .

 @Singleton @Requires(beans = DataSource.class) @Requires(property = "enabled") @Requires(missingBeans = EmployeeService) @Requires(sdk = Sdk.JAVA, value = "1.8") public class JdbcEmployeeService implements EmployeeService {} 

5. Buat server HTTP


Sekarang, mari kita coba membuat aplikasi server HTTP sederhana. Untuk memulai, kami akan menggunakan SDKMAN:

> mn create-app hello-world-server -build maven

Jadi kita akan membuat proyek Java baru dengan Maven di direktori bernama hello-world-server. Di dalam direktori ini kita akan menemukan kode aplikasi utama, file POM Maven dan file proyek lainnya.

Aplikasi paling sederhana terlihat seperti ini:

 public class ServerApplication { public static void main(String[] args) { Micronaut.run(ServerApplication.class); } } 

5.1 Memblokir HttpRequest


Aplikasi itu sendiri hampir tidak menghasilkan apa-apa. Mari kita tambahkan pengontrol dengan dua penangan. Keduanya akan membalas ucapan, tetapi yang satu akan menanggapi permintaan GET dan yang lainnya akan menanggapi POST.

 @Controller("/greet") public class GreetController { @Inject private GreetingService greetingService; @Get("/{name}") public String greet(String name) { return greetingService.getGreeting() + name; } @Post(value = "/{name}", consumes = MediaType.TEXT_PLAIN) public String setGreeting(@Body String name) { return greetingService.getGreeting() + name; } } 

Dari penerjemah: hambamu yang rendah hati pergi dan melakukan semua yang diceritakan dalam artikel ini. Jika pada titik ini Anda akan meluncurkan aplikasi dan melihat apakah itu berfungsi, maka jangan lupa untuk mengaktifkan Annotation Processing di Eclipse / IntelliJ IDEA.

5.2 IO reaktif


Secara default, Micronaut mengimplementasikan penangan ini sebagai I / O pemblokiran tradisional. Namun, kami dapat dengan cepat menerapkan penangan non-pemblokiran dengan hanya mengubah jenis pengembalian ke salah satu jenis non-pemblokiran reaktif.

Sebagai contoh, dengan RxJava kita dapat menggunakan Observable . Demikian pula, dengan Reactor kita dapat mengembalikan tipe Mono atau Flux :

 @Get("/{name}") public Mono<String> greet(String name) { return Mono.just(greetingService.getGreeting() + name); } 

Dari penerjemah: untuk contoh ini Anda akan memerlukan Project Reactor di dependensi Maven:

 <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-core</artifactId> <version>3.1.8.RELEASE</version> </dependency> 

Penangan yang memblokir dan yang tidak memblokir menggunakan server HTTP Netty.

Biasanya, permintaan diproses di kumpulan utas I / O, yang dibuat saat startup, yang membuatnya diblokir.

Namun, jika handler mengembalikan tipe data yang tidak menghalangi, maka Micronaut menggunakan loop peristiwa Netty, membuat seluruh permintaan non-blocking.

6. Buat klien HTTP


Sekarang, mari kita buat aplikasi klien untuk penangan yang baru saja kita buat. Micronaut menyediakan dua cara untuk membuat klien HTTP:

- deklaratif
- perangkat lunak

6.1 Pembuatan deklaratif dari klien HTTP


Cara pertama dan paling sederhana untuk membuat adalah menggunakan pendekatan deklaratif:

 @Client("/greet") public interface GreetingClient { @Get("/{name}") String greet(String name); } 

Perhatikan bahwa kami tidak menerapkan satu baris kode untuk memanggil layanan. Alih-alih, Micronaut memahami cara memohon layanan dari metode tanda tangan dan anotasi.

Untuk menguji klien ini, kita dapat membuat tes JUnit yang menggunakan API server untuk menjalankan server tertanam:

 public class GreetingClientTest { private EmbeddedServer server; private GreetingClient client; @Before public void setup() { server = ApplicationContext.run(EmbeddedServer.class); client = server.getApplicationContext().getBean(GreetingClient.class); } @After public void cleanup() { server.stop(); } @Test public void testGreeting() { assertEquals(client.greet("Mike"), "Hello Mike"); } } 

Dari penerjemah: untuk pembaca yang ingin tahu malas ada proyek siap pakai di Github: github.com/jreznot/micronaut-introduction

6.2 Secara terprogram membuat klien HTTP


Ada opsi untuk membuat klien HTTP tradisional jika Anda memerlukan lebih banyak kontrol atas perilaku dan implementasinya:

 @Singleton public class ConcreteGreetingClient { private RxHttpClient httpClient; public ConcreteGreetingClient(@Client("/") RxHttpClient httpClient) { this.httpClient = httpClient; } public String greet(String name) { HttpRequest<String> req = HttpRequest.GET("/greet/" + name); return httpClient.retrieve(req).blockingFirst(); } public Single<String> greetAsync(String name) { HttpRequest<String> req = HttpRequest.GET("/async/greet/" + name); return httpClient.retrieve(req).first("An error as occurred"); } } 

Klien menggunakan RxJava secara default, sehingga Anda dapat dengan mudah menggunakan panggilan pemblokiran dan non-pemblokiran.

7. Micronaut CLI


Kami sudah melihat bagaimana utilitas Micronaut CLI bekerja ketika kami membuat aplikasi.

Dalam kasus kami, ini adalah aplikasi yang terpisah, tetapi utilitas ini mendukung beberapa fitur lainnya.

7.1 Proyek dari berbagai aplikasi (Federasi)


Dalam Micronaut, federasi hanyalah sekelompok aplikasi individual yang dikembangkan dalam satu proyek. Dengan menggunakan federasi, kita dapat dengan mudah mengatur semuanya bersama-sama dan memastikan mereka menggunakan pengaturan yang sama.

Saat kami menggunakan CLI untuk menghasilkan federasi, utilitas mengambil argumen yang sama dengan perintah create-app. Dia akan membuat direktori utama proyek dan menempatkan setiap aplikasi dalam subdirektori.

7.2 Fitur


Saat membuat aplikasi atau federasi, kita dapat memilih fitur apa yang dibutuhkan aplikasi kita. Ini memungkinkan Anda untuk menggunakan set dependensi minimum dalam proyek.

Kami menunjukkan kemungkinan dalam argumen fitur-gergaji, memisahkannya dengan koma.

Anda dapat membuat daftar fitur yang tersedia dengan perintah berikut:

 > mn profile-info service Provided Features: -------------------- * annotation-api - Adds Java annotation API * config-consul - Adds support for Distributed Configuration with Consul * discovery-consul - Adds support for Service Discovery with Consul * discovery-eureka - Adds support for Service Discovery with Eureka * groovy - Creates a Groovy application [...] More features available 

Dari penerjemah: baik, di sini jangan heran, tim harus dijalankan di luar direktori proyek. Direktori proyek tidak berfungsi, mungkin dalam versi .M3 mereka memperbaikinya. Dia sudah pergi.

7.3 Proyek yang Ada


Kita dapat menggunakan CLI untuk memodifikasi proyek yang ada. Ini memungkinkan kami membuat nampan, klien, pengontrol, dll. Ketika kita menjalankan perintah "mn" di direktori proyek, perintah berikut akan tersedia:

 > mn help | Command Name Command Description ----------------------------------------------- create-bean Creates a singleton bean create-client Creates a client interface create-controller Creates a controller and associated test create-job Creates a job with scheduled method 

8. Kesimpulan


Dalam pengantar singkat tentang Micronaut ini, kami melihat betapa mudahnya membuat server HTTP dan klien yang tidak memblokir. Kami juga melihat beberapa fitur CLI.

Ini hanya sepotong kecil kue yang ditawarkan Micronaut. Di bawah tenda, ia memiliki dukungan untuk fungsi tanpa server, penemuan layanan, penelusuran terdistribusi, pemantauan dan metrik, konfigurasi terdistribusi, dan banyak lagi.

Namun, karena banyak fitur Micronaut telah dipinjam dari kerangka kerja yang ada seperti Grails dan Spring, ia menawarkan fitur unik yang membedakannya dari yang lain.

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


All Articles