1. Обзор
С ростом популярности архитектуры микросервисов и разработки облачных приложений растет потребность в быстром и легком сервере приложений.
В этом вводном уроке мы рассмотрим Open Liberty framework для создания и использования веб-сервиса RESTful. Мы также рассмотрим некоторые из основных функций, которые он предоставляет.
2. Открытая свобода
Open Liberty-это открытый фреймворк для экосистемы Java, позволяющий разрабатывать микросервисы с использованием функций Eclipse MicroProfile и Jakarta EE платформ .
Это гибкая, быстрая и легкая среда выполнения Java, которая кажется перспективной для разработки облачных микросервисов.
Фреймворк позволяет нам настраивать только те функции, которые нужны нашему приложению, что приводит к меньшему объему памяти при запуске. Кроме того, он может быть развернут на любой облачной платформе с использованием контейнеров типа Docker и Kubernetes .
Он поддерживает быструю разработку путем живой перезагрузки кода для быстрой итерации.
3. Сборка и запуск
Сначала мы создадим простой проект на основе Maven с именем open-liberty , а затем добавим последний liberty-maven-plugin plugin в pom.xml :
io.openliberty.tools liberty-maven-plugin 3.3-M3
Или мы можем добавить последнюю версию open liberty-runtime Maven dependency в качестве альтернативы liberty-maven-plugin :
io.openliberty openliberty-runtime 20.0.0.1 zip
Аналогично, мы можем добавить последнюю зависимость Gradle в build.gradle :
dependencies { libertyRuntime group: 'io.openliberty', name: 'openliberty-runtime', version: '20.0.0.1' }
Затем мы добавим последние зависимости jakarta.jakarta-web-api и micro profile Maven:
jakarta.platform jakarta.jakartaee-web-api 8.0.0 provided org.eclipse.microprofile microprofile 3.2 pom provided
Затем давайте добавим свойства HTTP-порта по умолчанию в pom.xml :
9080 9443
Далее мы создадим server.xml файл в каталоге src/main/liberty/config :
mpHealth-2.0
Здесь мы добавили функцию mp Health-2.0 для проверки работоспособности приложения.
Вот и все со всеми основными настройками. Давайте запустим команду Maven для компиляции файлов в первый раз:
mvn clean package
Наконец, давайте запустим сервер с помощью команды Maven, предоставленной Liberty:
mvn liberty:dev
Вуаля! Наше приложение запущено и будет доступно по адресу localhost:9080 :
Кроме того, мы можем получить доступ к здоровью приложения по адресу localhost:9080/health :
{"checks":[],"status":"UP"}
Команда liberty:dev запускает Открытый сервер Liberty в режиме разработки , который выполняет горячую перезагрузку любых изменений, внесенных в код или конфигурацию, без перезапуска сервера.
Аналогично, команда liberty:run доступна для запуска сервера в рабочем режиме.
Кроме того, мы можем использовать | liberty:start-server и liberty: stop-server для запуска/остановки сервера в фоновом режиме .
4. Сервлет
Чтобы использовать сервлеты в приложении, мы добавим функцию servlet-4.0 в server.xml :
... servlet-4.0
Добавьте последнюю версию servlet-4.0 Maven dependency при использовании open liberty-runtime Maven dependency в pom.xml :
io.openliberty.features servlet-4.0 20.0.0.1 esa
Однако если мы используем плагин liberty-maven-plugin plugin, то в этом нет необходимости.
Затем мы создадим класс App Servlet , расширяющий класс HttpServlet :
@WebServlet(urlPatterns="/app") public class AppServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String htmlOutput = "Hello! Welcome to Open Liberty
"; response.getWriter().append(htmlOutput); } }
Здесь мы добавили аннотацию @WebServlet , которая сделает AppServlet доступным по указанному шаблону URL.
Давайте обратимся к сервлету по адресу localhost:9080/app :
5. Создайте веб-сервис RESTful
Во-первых, давайте добавим функцию jax rs-2.1 в server.xml :
... jaxrs-2.1
Затем , мы создадим класс Api Application , который предоставляет конечные точки веб-службе RESTful:
@ApplicationPath("/api") public class ApiApplication extends Application { }
Здесь мы использовали аннотацию @ApplicationPath для URL-пути.
Затем давайте создадим класс Person , который обслуживает модель:
public class Person { private String username; private String email; // getters and setters // constructors }
Далее мы создадим класс PersonResource для определения HTTP-сопоставлений:
@RequestScoped @Path("persons") public class PersonResource { @GET @Produces(MediaType.APPLICATION_JSON) public ListgetAllPersons() { return Arrays.asList(new Person(1, "normanlewis", "[email protected]")); } }
Здесь мы добавили метод getAllPersons для сопоставления GET с конечной точкой /api/persons . Итак, мы готовы с веб-сервисом RESTful, и команда liberty:dev загрузит изменения на лету.
Давайте обратимся к веб-сервису /api/persons RESTful с помощью запроса curl GET:
curl --request GET --url http://localhost:9080/api/persons
Затем мы получим в ответ массив JSON:
[{"id":1, "username":"normanlewis", "email":"[email protected]"}]
Аналогично, мы можем добавить отображение POST, создав метод add Person :
@POST @Consumes(MediaType.APPLICATION_JSON) public Response addPerson(Person person) { String respMessage = "Person " + person.getUsername() + " received successfully."; return Response.status(Response.Status.CREATED).entity(respMessage).build(); }
Теперь мы можем вызвать конечную точку с помощью запроса curl POST:
curl --request POST --url http://localhost:9080/api/persons \ --header 'content-type: application/json' \ --data '{"username": "normanlewis", "email": "[email protected]"}'
Ответ будет выглядеть так:
Person normanlewis received successfully.
6. Настойчивость
6.1. Конфигурация
Давайте добавим поддержку персистентности в наши веб-сервисы RESTful.
Во-первых, мы добавим зависимость derby Maven к pom.xml :
org.apache.derby derby 10.14.2.0
Затем мы добавим несколько функций, таких как jpa-2.2 , jsonp-1.1 и cdi-2.0 к server.xml :
... jpa-2.2 jsonp-1.1 cdi-2.0
Здесь функция jsonp-1.1 предоставляет Java API для обработки JSON, а функция cdi-2.0 обрабатывает области действия и внедрение зависимостей.
Далее мы создадим persistence.xml в каталоге src/main/resources/META-INF :
jdbc/jpadatasource
Здесь мы использовали EclipseLink DDL generation для автоматического создания схемы базы данных. Мы также можем использовать другие альтернативы, такие как Hibernate.
Затем давайте добавим конфигурацию DataSource в server.xml :
Обратите внимание, что имя jndi имеет ту же ссылку на тег jta-data-source в persistence.xml.
6.2. Сущность и DAO
Затем мы добавим аннотацию @Entity и идентификатор к нашему классу Person :
@Entity public class Person { @GeneratedValue(strategy = GenerationType.AUTO) @Id private int id; private String username; private String email; // getters and setters }
Далее давайте создадим класс PersonDao , который будет взаимодействовать с базой данных с помощью экземпляра EntityManager :
@RequestScoped public class PersonDao { @PersistenceContext(name = "jpa-unit") private EntityManager em; public Person createPerson(Person person) { em.persist(person); return person; } public Person readPerson(int personId) { return em.find(Person.class, personId); } }
Обратите внимание, что @PersistenceContext определяет ту же ссылку на тег persistence-unit в persistence.xml .
Теперь мы введем зависимость PersonDao в класс PersonResource :
@RequestScoped @Path("person") public class PersonResource { @Inject private PersonDao personDao; // ... }
Здесь мы использовали аннотацию @Inject , предоставленную функцией CDI.
Наконец, мы обновим метод AddPerson класса Person Resource для сохранения объекта Person :
@POST @Consumes(MediaType.APPLICATION_JSON) @Transactional public Response addPerson(Person person) { personDao.createPerson(person); String respMessage = "Person #" + person.getId() + " created successfully."; return Response.status(Response.Status.CREATED).entity(respMessage).build(); }
Здесь метод AddPerson аннотируется аннотацией @Transactional для управления транзакциями в управляемых компонентах CDI.
Давайте вызовем конечную точку с уже обсужденным запросом curl POST:
curl --request POST --url http://localhost:9080/api/persons \ --header 'content-type: application/json' \ --data '{"username": "normanlewis", "email": "[email protected]"}'
Затем мы получим текстовый ответ:
Person #1 created successfully.
Аналогично, давайте добавим метод getPerson с GET mapping для извлечения объекта Person :
@GET @Path("{id}") @Produces(MediaType.APPLICATION_JSON) @Transactional public Person getPerson(@PathParam("id") int id) { Person person = personDao.readPerson(id); return person; }
Давайте вызовем конечную точку с помощью запроса curl GET:
curl --request GET --url http://localhost:9080/api/persons/1
Затем мы получим объект Person в качестве ответа JSON:
{"email":"[email protected]","id":1,"username":"normanlewis"}
7. Используйте RESTful Web Service С Помощью JSON-B
Во-первых, мы включим возможность прямой сериализации и десериализации моделей, добавив функцию jsonb-1.0 в server.xml :
... jsonb-1.0
Затем давайте создадим класс Rest Consumer с помощью метода consumer With Json b :
public class RestConsumer { public static String consumeWithJsonb(String targetUrl) { Client client = ClientBuilder.newClient(); Response response = client.target(targetUrl).request().get(); String result = response.readEntity(String.class); response.close(); client.close(); return result; } }
Здесь мы использовали класс Client Builder для запроса конечных точек веб-службы RESTful.
Наконец, давайте напишем модульный тест для использования веб-службы /api/person RESTful и проверим ответ:
@Test public void whenConsumeWithJsonb_thenGetPerson() { String url = "http://localhost:9080/api/persons/1"; String result = RestConsumer.consumeWithJsonb(url); Person person = JsonbBuilder.create().fromJson(result, Person.class); assertEquals(1, person.getId()); assertEquals("normanlewis", person.getUsername()); assertEquals("[email protected]", person.getEmail()); }
Здесь мы использовали класс Jsonbuilder для разбора ответа String в объект Person .
Кроме того, мы можем использовать Микропрофильный Rest-клиент, добавив функцию mpRestClient-1.3 для использования веб-сервисов RESTful . Он предоставляет интерфейс Rest Client Builder для запроса конечных точек веб-службы RESTful.
8. Заключение
В этой статье мы рассмотрели Open Liberty framework — быструю и легкую среду выполнения Java, которая предоставляет полные возможности платформ Eclipse MicroProfile и Jakarta EE.
Для начала мы создали веб-сервис RESTful с использованием JAX-RS. Затем мы включили персистентность, используя такие функции, как JPA и CDI.
Наконец, мы использовали веб-сервис RESTful с помощью JSON-B.
Как обычно, все реализации кода доступны на GitHub .