В этой главе мы разработаем приложение на основе CRUD с архитектурой SOA. Позже в последующих главах мы разберем этот сервис на микросервис и узнаем основное различие между SOA и архитектурой микросервисов.
Конфигурация и настройка системы
В этом разделе мы создадим пример приложения CRUD, которое будет возвращать объект JSON в качестве ответа при каждом вызове нашего сервиса. Мы будем использовать структуру Джерси, чтобы разработать то же самое. Ниже приведены шаги по настройке среды вашей локальной системы.
Разработка приложения CRUD
Шаг 1. Мы будем использовать NetBeans в качестве среды разработки. Загрузите и установите последнюю версию, доступную на официальном веб-сайте NetBeans https://netbeans.org/downloads/ .
Шаг 2. Откройте свою среду IDE NetBeans. Перейдите в «Файл -> Новый проект». Появится следующий скриншот. Выберите «Maven» в качестве категории и выберите «Project from ArchType» в качестве проекта и нажмите «Далее».
Это загрузит все необходимые файлы jar для создания вашего первого проекта Maven и веб-службы RESTful.
Шаг 3 — При нажатии кнопки «Далее» на предыдущем шаге появляется следующий снимок экрана. Здесь вам нужно будет указать Maven Archetype.
В окне поиска выполните поиск по запросу «Jersey-archType-Webapp (2.16)» и установите флажок «Показать более старый».
Шаг 4 — Как только вы выбрали то же самое, вы будете перенаправлены на следующий экран. Выберите предпочитаемую банку из списка и нажмите «Далее», чтобы продолжить.
Шаг 5 — На этом шаге вам необходимо указать название вашего проекта и идентификатор группы, а также сведения о пакете. После предоставления всей этой информации нажмите «Готово», чтобы продолжить.
Шаг 6 — Вы закончили настройку рабочего пространства. Каталог проекта будет выглядеть следующим образом.
Проверьте папку «Зависимости», и вы обнаружите, что Maven автоматически загрузил все необходимые файлы JAR для этого проекта.
Шаг 7 — Ваше рабочее пространство настроено, и вы можете начать с кодирования. Создайте четыре класса и пакеты, как указано на следующем снимке экрана. Вы можете обнаружить, что MyResource.java уже создан Maven, поскольку Maven достаточно умен, чтобы определить, что вы собираетесь создать свой собственный веб-сервис.
Шаг 8. После выполнения вышеуказанного шага мы создадим наш класс POJO, который будет UserProfile.java, следующим образом.
package com.tutorialspoint.userprofile.Model; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class UserProfile { private long ProId; private String FName; private String LName; private String Add; public UserProfile(){} public UserProfile(long Proid, String Fname, String Lname,String Add) { this.ProId = Proid; this.FName = Fname; this.LName = Lname; this.Add = Add; } public long getProId() { return ProId; } public void setProId(long ProId) { this.ProId = ProId; } public String getFName() { return FName; } public void setFName(String FName) { this.FName = FName; } public String getLName() { return LName; } public void setLName(String LName) { this.LName = LName; } public String getAdd() { return Add; } public void setAdd(String Add) { this.Add = Add; } }
Шаг 9 — Теперь мы создадим наш класс базы данных. Поскольку это часть учебного материала, мы не будем использовать БД в качестве нашей базы данных. Мы будем использовать встроенную память Java, чтобы работать как наша временная память. Как вы можете видеть в следующем наборе кода, мы будем использовать MAP в качестве нашей базы данных. Все операции веб-службы, которые мы выполняем, мы будем работать с этой MAP, определенной в классе.
package com.tutorialspoint.userprofile.DAO; import com.tutorialspoint.userprofile.Model.UserProfile; import java.util.HashMap; import java.util.Map; public class DatabaseClass { private static Map<Long,UserProfile> messages = new HashMap<Long,UserProfile>(); public static Map<Long,UserProfile> getUsers() { return messages; // Each time this method will return entire map as an instance of database } }
Шаг 10 — Теперь давайте построим наш класс обслуживания. Затем скопируйте и вставьте следующий код в класс «ProfileService.java». Это класс, в котором мы будем объявлять все методы наших веб-сервисов, которые будут доступны для внешнего мира. Нам нужно создать одну ссылку на наш DatabaseClass, чтобы наша временная база данных была доступна в этом классе.
package com.tutorialspoint.userprofile.service; import com.tutorialspoint.userprofile.DAO.DatabaseClass; import com.tutorialspoint.userprofile.Model.UserProfile; import java.util.ArrayList; import java.util.List; import java.util.Map; public class ProfileService { private Map<Long,UserProfile> Userprofiles = DatabaseClass.getUsers(); // Creating some predefine profile and populating the same in the map public ProfileService() { UserProfile m1 = new UserProfile(1L,"Tutorials1","Point1","TutorialsPoint.com"); UserProfile m2 = new UserProfile(2L,"Tutorials2","Point2","TutorialsPoint.com2"); UserProfile m3 = new UserProfile(3L,"Tutorials3","Point3","TutorialsPoint.com3"); UserProfile m4 = new UserProfile(4L,"Tutorials4","Point4","TutorialsPoint.com4"); Userprofiles.put(1L, m1); Userprofiles.put(2L, m2); Userprofiles.put(1L, m3); Userprofiles.put(2L, m4); } //Method to fetch all profile public List<UserProfile> getAllProfile() { List<UserProfile> list = new ArrayList<UserProfile>(Userprofiles.values()); return list; } // Method to fetch only one profile depending on the ID provided public UserProfile getProfile(long id) { return Userprofiles.get(id); } //Method to add profile public UserProfile addProfile(UserProfile UserProfile) { UserProfile.setProId(Userprofiles.size()+1); Userprofiles.put(UserProfile.getProId(), UserProfile); return UserProfile; } //method to update Profile public UserProfile UpdateProfile(UserProfile UserProfile) { if(UserProfile.getProId()<=0) { return null; } else { Userprofiles.put(UserProfile.getProId(), UserProfile); return UserProfile; } } //method to delete profile public void RemoveProfile(long Id) { Userprofiles.remove(Id); } }
Шаг 11 — На этом шаге мы создадим наш класс Resource, который будет связан с URL, и будет вызвана соответствующая служба.
package com.tutorialspoint.userprofile.Resource; import com.tutorialspoint.userprofile.Model.UserProfile; import com.tutorialspoint.userprofile.service.ProfileService; import java.util.List; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/Profile") @Consumes(MediaType.APPLICATION_XML) @Produces(MediaType.APPLICATION_XML) public class ProfileResource { ProfileService messageService = new ProfileService(); @GET public List<UserProfile> getProfile() { return messageService.getAllProfile(); } @GET @Path("/{ProID}") public UserProfile getProfile(@PathParam("ProID")long Id) { return messageService.getProfile(Id); } @POST public UserProfile addProfile(UserProfile profile) { return messageService.addProfile(profile); } @PUT @Path("/{proID}") public UserProfile UpdateProfile(@PathParam("proID")long Id,UserProfile UserProfile) { UserProfile.setProId(Id); return messageService.UpdateProfile(UserProfile); } @DELETE @Path("/{ProID}") public void deleteProfile(@PathParam("ProID")long Id) { messageService.RemoveProfile(Id); } }
Шаг 12 — Чистая сборка проекта и запуск его. Если все идет хорошо, вы должны получить следующий вывод в браузере, имея доступ к URL http: // localhost: 8080 / UserProfile / webapi / Profile .
Вы можете видеть, что различные записи заполняются с использованием представления XML.
Другой метод может быть протестирован с помощью Postman, применяя правильный метод URL.
Метод @GET — на следующем снимке экрана показано, как мы можем получить желаемый результат для запроса get, который возвращает все данные пользователя.
@POST — следующий запрос может быть использован для проверки нашего метода Post. Обратите внимание, как proId был сгенерирован автоматически.
@PUT — этот метод обновит записи. На следующем снимке экрана показано, как Джерси берет proId из URL-адреса запроса и обновляет тот же ответ профиля пользователя.
Таким же образом вы можете проверить другие методы, доступные в ваших веб-сервисах.
В предыдущем разделе мы разработали один сервис, который будет предоставлять функциональность CRUD. Теперь, когда мы пытаемся внедрить этот сервис в наше приложение, нам нужно создать клиент этого приложения и прикрепить его к нашему приложению. В этой главе мы узнаем, как создать эту функциональность, используя концепцию микросервиса. Ниже приведено схематическое представление нашего приложения, созданного с использованием описанных выше шагов.
Актер должен быть отправной точкой нашего сервиса. В этом случае «ProfileResource.java» выполняет ответственность актера. Этот класс будет вызывать разные методы для выполнения разных операций, таких как добавление, обновление и удаление.
Декомпозиция приложения CRUD
Согласно основному принципу микросервиса, нам нужно иметь только одну бизнес-задачу для каждого из модулей, поэтому один участник не должен отвечать за все четыре функции CRUD. Рассмотрим следующий пример, в котором мы представили несколько новых ролей, так что вам будет концептуально ясно, что Microservice является архитектурным представлением SOA.
«Основной пользователь» — это пользователь, который связывается с «Контроллером приложений» для удовлетворения своих потребностей. «Контроллер приложений» — это тот, кто просто вызывает разных «менеджеров ресурсов» в зависимости от запроса от конечного пользователя. «Resource Manager» выполняет ту работу, которую необходимо выполнить. Давайте кратко рассмотрим различные роли различных модулей приложения.
-
Конечный пользователь / Основные пользователи — Запросы на некоторые ресурсы для Application Controller.
-
Приложение — получает запрос и перенаправляет его конкретному менеджеру ресурсов.
-
Resource Manager — выполняет реальную работу по обновлению, удалению и добавлению пользователей.
Конечный пользователь / Основные пользователи — Запросы на некоторые ресурсы для Application Controller.
Приложение — получает запрос и перенаправляет его конкретному менеджеру ресурсов.
Resource Manager — выполняет реальную работу по обновлению, удалению и добавлению пользователей.
Посмотрите, как общая ответственность одного класса распределяется между различными другими классами.