Pengenalan Ratpack

1. Gambaran keseluruhan

Ratpack adalah sekumpulan perpustakaan berasaskan JVM yang dibina untuk aplikasi masa nyata berprestasi tinggi moden. Ia dibina di atas enjin rangkaian berpacu acara Netty yang tertanam dan sepenuhnya mematuhi corak reka bentuk reaktif.

Dalam artikel ini, kita akan belajar bagaimana menggunakan Ratpack dan kita akan membina aplikasi kecil menggunakannya.

2. Mengapa Ratpack?

Kelebihan utama Ratpack:

  • ia sangat ringan, pantas dan berskala
  • ia menggunakan memori yang lebih sedikit daripada kerangka lain seperti DropWizard; hasil perbandingan penanda aras yang menarik boleh didapati di sini
  • kerana ia dibina di atas Netty , Ratpack benar-benar didorong oleh acara dan tidak menyekat
  • ia mempunyai sokongan untuk pengurusan pergantungan Guice
  • seperti Spring Boot , Ratpack mempunyai pustaka ujian sendiri untuk menyiapkan kes-kes ujian dengan cepat

3. Membuat Aplikasi

Untuk memahami bagaimana Ratpack berfungsi, mari mulakan dengan membuat aplikasi kecil dengannya.

3.1. Ketergantungan Maven

Pertama, mari tambahkan kebergantungan berikut ke dalam pom.xml kami :

 io.ratpack ratpack-core 1.4.5   io.ratpack ratpack-test 1.4.5 

Anda boleh menyemak versi terbaru di Maven Central.

Perhatikan bahawa walaupun kami menggunakan Maven sebagai sistem build kami, sesuai saranan Ratpack, lebih baik menggunakan Gradle sebagai alat build kerana Ratpack memiliki dukungan Gradle kelas pertama yang disediakan melalui plugin Ratpack's Gradle.

Kita boleh menggunakan skrip Gradle build berikut:

buildscript { repositories { jcenter() } dependencies { classpath "io.ratpack:ratpack-gradle:1.4.5" } } apply plugin: "io.ratpack.ratpack-java" repositories { jcenter() } dependencies { testCompile 'junit:junit:4.11' runtime "org.slf4j:slf4j-simple:1.7.21" } test { testLogging { events 'started', 'passed' } } 

3.2. Membangun Aplikasi

Setelah pengurusan binaan kami dikonfigurasi, kami perlu membuat kelas untuk memulakan pelayan Netty yang terbenam dan membina konteks mudah untuk menangani permintaan lalai:

public class Application { public static void main(String[] args) throws Exception { RatpackServer.start(server -> server.handlers(chain -> chain .get(ctx -> ctx.render("Welcome to Baeldung ratpack!!!")))); } }

Seperti yang kita lihat, dengan menggunakan RatpackServer kita sekarang dapat memulakan pelayan (port lalai 5050). Kaedah pengendali () mengambil fungsi yang menerima objek Rantai, yang memetakan semua permintaan masuk masing-masing. "Handler Chain API" ini digunakan untuk membangun strategi penanganan respons.

Sekiranya kita menjalankan coretan kod ini dan memukul penyemak imbas di // localhost: 5050, "Selamat datang di Baeldung ratpack !!!" harus dipaparkan.

Begitu juga, kita dapat memetakan permintaan HTTP POST.

3.3. Mengendalikan Parameter Laluan URL

Dalam contoh seterusnya, kita perlu menangkap beberapa parameter jalur URL dalam aplikasi kita. Di Ratpack kami menggunakan PathTokens untuk menangkapnya:

RatpackServer.start(server -> server .handlers(chain -> chain .get(":name", ctx -> ctx.render("Hello " + ctx.getPathTokens().get("name") + " !!!"))));

Di sini, kami memetakan parameter URL nama . Setiap kali permintaan seperti // localhost: 5050 / John datang, responsnya adalah "Hello John !!!".

3.4. Permintaan / Respons Pengubahsuaian Header Dengan / Tanpa Penapis

Kadang kala, kita perlu mengubah tajuk respons HTTP sebaris berdasarkan keperluan kita. Ratpack mempunyai MutableHeaders untuk menyesuaikan respons keluar.

Sebagai contoh, kita perlu mengubah tajuk berikut sebagai tindak balas: Access-Control-Allow-Origin , Accept-Language , dan Accept-Charset :

RatpackServer.start(server -> server.handlers(chain -> chain.all(ctx -> { MutableHeaders headers = ctx.getResponse().getHeaders(); headers.set("Access-Control-Allow-Origin", "*"); headers.set("Accept-Language", "en-us"); headers.set("Accept-Charset", "UTF-8"); ctx.next(); }).get(":name", ctx -> ctx .render("Hello " + ctx.getPathTokens().get("name") + "!!!"))));

Dengan menggunakan MutableHeaders yang kita tetapkan adalah menetapkan tiga header dan mendorongnya ke dalam Chain .

Dengan cara yang sama, kita dapat memeriksa tajuk permintaan masuk juga:

ctx.getRequest().getHeaders().get("//TODO")

Perkara yang sama dapat dicapai dengan membuat penapis. Ratpack mempunyai antara muka Handler , yang dapat dilaksanakan untuk membuat filter. Ia hanya mempunyai satu kaedah pengendalian (), yang mengambil Konteks semasa sebagai parameter:

public class RequestValidatorFilter implements Handler { @Override public void handle(Context ctx) throws Exception { MutableHeaders headers = ctx.getResponse().getHeaders(); headers.set("Access-Control-Allow-Origin", "*"); ctx.next(); } }

Kita boleh menggunakan penapis ini dengan cara berikut:

RatpackServer.start( server -> server.handlers(chain -> chain .all(new RequestValidatorFilter()) .get(ctx -> ctx.render("Welcome to baeldung ratpack!!!")))); }

3.5. Penyusun JSON

Ratpack secara dalaman menggunakan jackson yang lebih pantas untuk menguraikan JSON. Kita boleh menggunakan modul Jackson untuk menguraikan objek ke JSON.

Mari buat kelas POJO ringkas yang akan digunakan untuk menghuraikan:

public class Employee { private Long id; private String title; private String name; // getters and setters }

Di sini, kami telah membuat satu kelas POJO sederhana bernama Karyawan , yang mempunyai tiga parameter: id, tajuk , dan nama . Sekarang kita akan menggunakan objek Karyawan ini untuk menukar menjadi JSON dan kembali sama ketika URL tertentu dipukul:

List employees = new ArrayList(); employees.add(new Employee(1L, "Mr", "John Doe")); employees.add(new Employee(2L, "Mr", "White Snow")); RatpackServer.start( server -> server.handlers(chain -> chain .get("data/employees", ctx -> ctx.render(Jackson.json(employees)))));

Seperti yang dapat kita lihat, kita menambahkan dua objek Karyawan secara manual ke dalam senarai dan menguraikannya sebagai JSON menggunakan modul Jackson . Sebaik sahaja URL / data / pekerja dipukul, objek JSON akan dikembalikan.

Point untuk komen di sini adalah bahawa kita tidak menggunakan ObjectMapper sama sekali sejak modul Jackson Ratpack akan melakukan yg diperlukan dengan cepat.

3.6. Pangkalan Data Dalam Memori

Ratpack has the first class support for in-memory databases. It uses HikariCP for JDBC connection pooling. In order to use it, we need to add Ratpack's HikariCP module dependency in the pom.xml:

 io.ratpack ratpack-hikari 1.4.5 

If we are using Gradle, the same needs to be added in the Gradle build file:

compile ratpack.dependency('hikari')

Now, we need to create an SQL file with table DDL statements so that the tables are created as soon as the server is up and running. We'll create the DDL.sql file in the src/main/resources directory and add some DDL statements into it.

Since we're using H2 database, we have to add dependencies for that too.

Now, by using HikariModule, we can initialize the database at the runtime:

RatpackServer.start( server -> server.registry(Guice.registry(bindings -> bindings.module(HikariModule.class, config -> { config.setDataSourceClassName("org.h2.jdbcx.JdbcDataSource"); config.addDataSourceProperty("URL", "jdbc:h2:mem:baeldung;INIT=RUNSCRIPT FROM 'classpath:/DDL.sql'"); }))).handlers(...));

4. Testing

Seperti disebutkan sebelumnya, Ratpack mempunyai sokongan kelas pertama untuk kes ujian jUnit. Dengan menggunakan MainClassApplicationUnderTest kita dapat dengan mudah membuat kes ujian dan menguji titik akhir:

@RunWith(JUnit4.class) public class ApplicationTest { MainClassApplicationUnderTest appUnderTest = new MainClassApplicationUnderTest(Application.class); @Test public void givenDefaultUrl_getStaticText() { assertEquals("Welcome to baeldung ratpack!!!", appUnderTest.getHttpClient().getText("/")); } @Test public void givenDynamicUrl_getDynamicText() { assertEquals("Hello dummybot!!!", appUnderTest.getHttpClient().getText("/dummybot")); } @Test public void givenUrl_getListOfEmployee() throws JsonProcessingException { List employees = new ArrayList(); ObjectMapper mapper = new ObjectMapper(); employees.add(new Employee(1L, "Mr", "John Doe")); employees.add(new Employee(2L, "Mr", "White Snow")); assertEquals(mapper.writeValueAsString(employees), appUnderTest.getHttpClient().getText("/data/employees")); } @After public void shutdown() { appUnderTest.close(); } }

Harap maklum bahawa kita perlu menghentikan tayangan MainClassApplicationUnderTest yang dijalankan secara manual dengan memanggil kaedah tutup () kerana mungkin menyekat sumber JVM secara tidak perlu. Itulah sebabnya kami telah menggunakan @Setelah anotasi untuk menghentikan kejadian secara paksa setelah kes ujian dijalankan.

5. Kesimpulan

Dalam artikel ini, kami melihat kesederhanaan menggunakan Ratpack.

Seperti biasa, kod sumber penuh tersedia di GitHub.