Въведение в Ratpack

1. Общ преглед

Ratpack е набор от JVM базирани библиотеки, създадени за съвременни високопроизводителни приложения в реално време. Той е построен на върха на вградения Нети , възникнали от събития в мрежа на двигателя и е напълно съвместим с реактивен дизайн модел.

В тази статия ще научим как да използваме Ratpack и ще създадем малко приложение, използвайки го.

2. Защо Ratpack?

Основните предимства на Ratpack:

  • много е лек, бърз и мащабируем
  • консумира по-малко памет от други рамки като DropWizard; интересен резултат от сравнение на бенчмарка можете да намерите тук
  • тъй като е построен на върха на Нети , Ratpack е напълно възникнали от събития и без блокиране в природата
  • той има поддръжка за управление на зависимости Guice
  • подобно на Spring Boot , Ratpack има свои собствени библиотеки за тестване за бързо настройване на тестови случаи

3. Създаване на приложение

За да разберем как работи Ratpack, нека започнем, като създадем малко приложение с него.

3.1. Зависимости на Maven

Първо, нека добавим следните зависимости в нашия pom.xml:

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

Можете да проверите най-новата версия на Maven Central.

Имайте предвид, че въпреки че използваме Maven като наша система за изграждане, съгласно препоръката на Ratpack, по-добре е да използвате Gradle като инструмент за изграждане, тъй като Ratpack има първокласна поддръжка на Gradle, осигурена чрез приставката Gradle на Ratpack.

Можем да използваме следния скрипт за изграждане на Gradle:

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. Изграждане на приложението

След като нашето управление на компилация е конфигурирано, трябва да създадем клас, за да стартираме вградения сървър на Netty и да изградим прост контекст за обработка на заявките по подразбиране:

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!!!")))); } }

Както виждаме, с помощта на RatpackServer вече можем да стартираме сървъра (порт 5050 по подразбиране). Методът handlers () приема функция, която получава обект Chain, който картографира всички съответни входящи заявки. Този „API на веригата на манипулатора“ се използва за изграждане на стратегия за обработка на отговора.

Ако пуснем този кодов фрагмент и натиснем браузъра на // localhost: 5050, „Добре дошли в Baeldung ratpack !!!“ трябва да се покаже.

По същия начин можем да картографираме HTTP POST заявка.

3.3. Обработка на параметри на пътя на URL

В следващия пример трябва да уловим някакъв параметър на URL пътя в нашето приложение. В Ratpack използваме PathTokens, за да ги уловим:

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

Тук картографираме параметъра на URL адреса на името . Всеки път, когато дойде заявка като // localhost: 5050 / Джон , отговорът ще бъде „Здравей, Джон !!!“.

3.4. Промяна на заглавката на заявка / отговор с / без филтър

Понякога трябва да модифицираме вградения заглавен HTTP отговор според нашите нужди. Ratpack има MutableHeaders за персонализиране на изходящи отговори.

Например трябва да променим следните заглавия в отговора: Access-Control-Allow-Origin , Accept-Language и 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") + "!!!"))));

С помощта на MutableHeaders, които зададохме , настройваме трите заглавки и ги натискаме във веригата .

По същия начин можем да проверим и заглавията на входящите заявки:

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

Същото може да се постигне чрез създаване на филтър. Ratpack има интерфейс Handler , който може да бъде приложен за създаване на филтър. Той има само един метод handle (), който приема текущия контекст като параметър:

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(); } }

Можем да използваме този филтър по следния начин:

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

3.5. JSON парсер

Ratpack вътрешно използва по-бърз jackson за разбор на JSON. Можем да използваме модула Jackson, за да анализираме всеки обект в JSON.

Нека създадем прост POJO клас, който ще се използва за синтактичен анализ:

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

Тук създадохме един прост POJO клас на име Employee , който има три параметъра: id, заглавие и име . Сега ще използваме този обект на служител, за да конвертираме в JSON и да го върнем, когато бъде ударен определен URL:

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)))));

Както виждаме, ние ръчно добавяме два обекта на служител в списък и ги анализираме като JSON, използвайки модула Jackson . Веднага след като URL адресът / data / staff бъде ударен, обектът JSON ще бъде върнат.

Следва да се отбележи тук е, че ние не използвате ObjectMapper изобщо , тъй като Джаксън модул Ratpack ще направя нещо необходимо в движение.

3.6. База данни в паметта

Ratpack има първокласна поддръжка за бази данни в паметта. Той използва HikariCP за обединяване на JDBC връзка. За да го използваме, трябва да добавим зависимостта на модула HikariCP на Ratpack в pom.xml :

 io.ratpack ratpack-hikari 1.4.5 

Ако използваме Gradle , същото трябва да се добави във файла за изграждане на Gradle:

compile ratpack.dependency('hikari')

Сега трябва да създадем SQL файл с DDL изрази на таблица, така че таблиците да се създават веднага щом сървърът работи и работи. Ще създадем файла DDL.sql в директорията src / main / resources и ще добавим някои DDL изрази в него.

Тъй като използваме база данни H2, трябва да добавим и зависимости за това.

Сега, използвайки HikariModule, можем да инициализираме базата данни по време на изпълнение:

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. Тестване

Както бе споменато по-рано, Ratpack има първокласна поддръжка за jUnit тестови случаи. С помощта на MainClassApplicationUnderTest можем лесно да създадем тестови случаи и да тестваме крайните точки:

@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(); } }

Моля, обърнете внимание, че трябва да прекратим ръчно изпълняващия се екземпляр MainClassApplicationUnderTest, като извикаме метода close () , тъй като той може ненужно да блокира JVM ресурси. Ето защо използвахме @After анотация, за да прекратим принудително екземпляра след изпълнението на тестовия случай.

5. Заключение

В тази статия видяхме простотата на използване на Ratpack.

Както винаги, пълният изходен код е достъпен в GitHub.