마이크로 서비스 아키텍처-실습 SOA

이 장에서는 SOA 아키텍처를 사용하여 CRUD 기반 애플리케이션을 개발합니다. 이어지는 장의 뒷부분에서이 서비스를 마이크로 서비스로 나누고 SOA와 마이크로 서비스 아키텍처의 기본적인 차이점을 알아볼 것입니다.

시스템 구성 및 설정

이 섹션에서는 서비스를 호출 할 때마다 응답으로 JSON 객체를 반환하는 샘플 CRUD 애플리케이션을 빌드합니다. 동일한 개발을 위해 Jersey 프레임 워크를 사용할 것입니다. 다음은 로컬 시스템 환경을 설정하는 단계입니다.

CRUD 애플리케이션 개발

Step 1− NetBeans를 개발 IDE로 사용할 것입니다. NetBeans 공식 웹 사이트에서 사용 가능한 최신 버전을 다운로드하여 설치하십시오.https://netbeans.org/downloads/.

Step 2− NetBeans IDE를 엽니 다. “파일-> 새 프로젝트”로 이동합니다. 다음 스크린 샷이 나타납니다. 카테고리로 "Maven"을 선택하고 프로젝트로 "Project from ArchType"을 선택하고 Next를 누르십시오.

그러면 첫 번째 Maven 프로젝트와 RESTful 웹 서비스를 만드는 데 필요한 모든 jar 파일이 다운로드됩니다.

Step 3− 이전 단계에서 다음 버튼을 누르면 다음 스크린 샷이 나타납니다. 여기에서 Maven Archetype을 지정해야합니다.

검색 상자에서 "Jersey-archType-Webapp (2.16)"을 검색하고 "이전 항목 표시"확인란을 선택합니다.

Step 4− 동일한 항목을 선택하면 다음 화면으로 이동합니다. 목록에서 선호하는 항아리를 선택하고 다음을 눌러 계속하십시오.

Step 5−이 단계에서는 프로젝트 이름과 그룹 ID, 패키지 세부 정보를 제공해야합니다. 이 모든 정보를 제공 한 후 마침을 눌러 계속합니다.

Step 6− 작업 공간 설정이 완료되었습니다. 프로젝트 디렉토리는 다음과 같습니다.

"Dependencies"폴더를 확인하면 Maven이이 프로젝트에 필요한 모든 jar 파일을 자동으로 다운로드 한 것을 알 수 있습니다.

Step 7− 작업 공간이 설정되었으며 코딩으로 시작할 수 있습니다. 계속해서 다음 스크린 샷에 언급 된대로 4 개의 클래스와 패키지를 만듭니다. MyResource.java는 Maven에 의해 이미 생성되어 있음을 알 수 있습니다. Maven은 자신의 웹 서비스를 빌드 할 것이라는 것을 감지 할만큼 충분히 똑똑하기 때문입니다.

Step 8 − 위 단계를 완료하면 다음과 같이 UserProfile.java 인 POJO 클래스를 구성합니다.

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

Step 9− 이제 Database 클래스를 생성합니다. 이것은 학습 자료의 일부이므로 DB를 데이터베이스로 사용하지 않습니다. 내장 된 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
   }
}

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

Step 11 −이 단계에서는 URL과 연결될 Resource 클래스를 생성하고 해당 서비스를 호출합니다.

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

Step 12− 프로젝트를 클린 빌드하고 실행합니다. 모든 것이 잘되면 브라우저에 다음과 같은 출력이 표시됩니다.http://localhost:8080/UserProfile/webapi/Profile” URL.

XML 표현을 사용하여 다양한 항목이 채워지는 것을 볼 수 있습니다.

적절한 방법 URL을 적용하여 Postman을 사용하여 다른 방법을 테스트 할 수 있습니다.

@GET method − 다음 스크린 샷은 모든 사용자 세부 정보를 반환하는 get 요청에 대해 원하는 결과를 얻는 방법을 보여줍니다.

@POST− 다음 요청을 사용하여 Post 메서드를 테스트 할 수 있습니다. proId가 어떻게 자동으로 생성되었는지 확인하십시오.

@PUT−이 방법은 항목을 업데이트합니다. 다음 스크린 샷은 Jersey가 요청 URL에서 proId를 가져와 동일한 사용자 프로필 응답을 업데이트하는 방법을 보여줍니다.

같은 방법으로 웹 서비스에서 사용 가능한 다른 방법을 확인할 수 있습니다.

이전 섹션에서는 CRUD 기능을 노출하는 하나의 서비스를 개발했습니다. 이제 애플리케이션에서이 서비스를 구현하려고 할 때마다이 애플리케이션의 클라이언트를 만들고이를 애플리케이션에 연결해야합니다. 이 장에서는 마이크로 서비스 개념을 사용하여이 기능을 구축하는 방법을 배웁니다. 다음은 위의 단계를 사용하여 빌드 된 애플리케이션의 다이어그램 표현입니다.

배우는 우리 서비스의 진입 점이되어야합니다. 이 경우“ProfileResource.java”는 행위자의 책임을 수행합니다. 이 클래스는 추가, 업데이트 및 삭제와 같은 다른 작업을 수행하기 위해 다른 메서드를 호출합니다.

CRUD 애플리케이션 분해

마이크로 서비스의 주요 원칙에 따르면 각 모듈에 대해 하나의 비즈니스 작업 만 있으면되므로 한 명의 행위자가 4 개의 CRUD 기능을 모두 담당해서는 안됩니다. 마이크로 서비스가 SOA의 아키텍처 표현이라는 것을 개념적으로 명확하게 알 수 있도록 몇 가지 새로운 역할을 도입 한 다음 예제를 고려하십시오.

"주 사용자"는 자신의 요구를 충족시키기 위해 "애플리케이션 컨트롤러"와 통신하는 사용자입니다. "애플리케이션 컨트롤러"는 최종 사용자의 요청에 따라 다른 "리소스 관리자"를 호출하는 것입니다. “Resource Manager”는 수행해야하는 작업을 수행합니다. 애플리케이션의 다른 단위의 다른 역할에 대해 간단히 살펴 보겠습니다.

  • End User/Main Users − Application Controller에 대한 일부 리소스 요청.

  • Application − 요청을 수신하고 특정 리소스 관리자에게 전달합니다.

  • Resource Manager − 사용자를 업데이트, 삭제 및 추가하는 실제 작업을 수행합니다.

한 클래스의 총 책임이 다른 클래스에 어떻게 분배되는지 확인하십시오.