微服務架構 - 實踐SOA



在本節中,我們將開發一個基於CRUD的應用程式,使用SOA架構。在後續章節中,我們將把此服務分解成微服務,並學習SOA和微服務架構之間的基本區別。

系統配置和設定

在本節中,我們將構建一個示例CRUD應用程式,每當我們呼叫我們的服務時,它將返回一個JSON物件作為響應。我們將使用Jersey框架來開發它。以下是設定本地系統環境的步驟。

開發CRUD應用程式

步驟1 − 我們將使用NetBeans作為開發IDE。請下載並安裝NetBeans官方網站上提供的最新版本 https://netbeans.org/downloads/

步驟2 − 開啟你的NetBeans IDE。轉到“檔案 -> 新建專案”。以下螢幕截圖將彈出。選擇“Maven”作為類別,選擇“從ArchType建立專案”作為專案,然後點選下一步。

Screenshot Pops Up

這將下載建立你的第一個Maven專案和RESTful Web服務所需的所有jar檔案。

步驟3 − 在上一步中點選下一步按鈕後,將出現以下螢幕截圖。在這裡,您需要指定Maven原型。

Maven Archetype

在搜尋框中,搜尋“Jersey-archType-Webapp(2.16)”並勾選“顯示舊版本”複選框。

步驟4 − 選擇後,您將被重定向到以下螢幕。從列表中選擇首選jar,然後點選下一步繼續。

Redirected Screen

步驟5 − 在此步驟中,您需要提供專案名稱及其GroupId以及包詳細資訊。提供所有這些資訊後,點選完成繼續。

Group Id

步驟6 − 工作區設定完成。專案目錄將如下所示。

Workspace Setup

檢視你的“依賴項”資料夾,您會發現Maven已自動下載此專案所需的所有jar檔案。

Dependencies

步驟7 − 您的工作區已設定好,您可以開始編碼了。繼續建立四個類和包,如以下螢幕截圖所示。您可以發現MyResource.java已由Maven建立,因為Maven足夠智慧,可以檢測到您將要構建自己的Web服務。

Source Packages

步驟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作為我們的資料庫。我們執行的所有Web服務操作都將在此類中定義的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”類中複製貼上以下程式碼集。這是我們將宣告所有要公開給外部世界的Web服務方法的類。我們需要建立我們資料庫類的一個引用,以便可以在此類中訪問我們的臨時資料庫。

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 − 在此步驟中,我們將建立我們的資源類,該類將與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 − 清理構建專案並執行它。如果一切順利,則在訪問https://:8080/UserProfile/webapi/Profile”URL時,您應該在瀏覽器中獲得以下輸出。

您可以看到使用XML表示法填充了不同的條目。

User Profiles

可以透過使用適當的方法URL應用Postman來測試不同的方法。

@GET方法 − 以下螢幕截圖演示瞭如何獲得get請求的所需結果,該請求返回所有使用者詳細資訊。

Screenshot Demonstrates

@POST − 以下請求可用於測試我們的Post方法。請注意proId是如何自動生成的。

Post method

@PUT − 此方法將更新條目。以下螢幕截圖演示了Jersey如何從請求URL中獲取proId並更新相同使用者配置檔案回覆。

Same User Profile Reply

同樣,您可以檢查Web服務中可用的其他方法。

在上一節中,我們開發了一個服務,它將公開CRUD功能。現在,每當我們嘗試在應用程式中實現此服務時,都需要建立此應用程式的客戶端並將其附加到我們的應用程式。在本節中,我們將學習如何使用微服務概念構建此功能。以下是使用上述步驟構建的應用程式的示意圖。

Actor

參與者應該是我們服務的入口點。在這種情況下,“ProfileResource.java”承擔參與者的職責。此類將呼叫不同的方法來執行不同的操作,例如新增、更新和刪除。

CRUD應用程式的分解

根據微服務的主要原則,每個模組都應該只有一個業務任務,因此一個參與者不應該負責所有四個CRUD功能。請考慮以下示例,我們在此示例中引入了一些新角色,以便您可以清楚地瞭解微服務是SOA的架構表示。

Architectural Representation

“主要使用者”是與“應用程式控制器”通訊以滿足其需求的使用者。“應用程式控制器”只是根據終端使用者的請求呼叫不同的“資源管理器”。“資源管理器”完成需要完成的工作。讓我們快速瞭解應用程式不同單元的不同角色。

  • 終端使用者/主要使用者 − 嚮應用程式控制器請求某些資源。

  • 應用程式 − 接收請求並將其轉發到特定的資源管理器。

  • 資源管理器 − 執行更新、刪除和新增使用者的實際工作。

請參閱一個類的總責任是如何分佈在其他不同類中的。

廣告