Учебники

Микросервисная архитектура — практическая SOA

В этой главе мы разработаем приложение на основе 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.

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 — выполняет реальную работу по обновлению, удалению и добавлению пользователей.

Посмотрите, как общая ответственность одного класса распределяется между различными другими классами.