Kiến trúc Microservice - SOA thực hành

Trong chương này, chúng tôi sẽ phát triển một ứng dụng dựa trên CRUD với kiến ​​trúc SOA. Sau đó trong các chương tiếp theo, chúng ta sẽ chia dịch vụ này thành microservice và chúng ta sẽ tìm hiểu sự khác biệt cơ bản giữa kiến ​​trúc SOA và microservice.

Cấu hình và thiết lập hệ thống

Trong phần này, chúng tôi sẽ xây dựng một ứng dụng CRUD mẫu, ứng dụng này sẽ trả về một đối tượng JSON dưới dạng phản hồi bất cứ khi nào chúng tôi gọi dịch vụ của mình. Chúng tôi sẽ sử dụng khung Jersey để phát triển tương tự. Sau đây là các bước để thiết lập môi trường hệ thống cục bộ của bạn.

Phát triển ứng dụng CRUD

Step 1- Chúng tôi sẽ sử dụng NetBeans làm IDE phát triển. Vui lòng tải xuống và cài đặt phiên bản mới nhất có sẵn trên trang web chính thức của NetBeanshttps://netbeans.org/downloads/.

Step 2- Mở IDE NetBeans của bạn. Đi tới “Tệp -> Dự án mới”. Ảnh chụp màn hình sau bật lên. Chọn “Maven” làm danh mục và chọn “Dự án từ ArchType” làm dự án và nhấn Tiếp theo.

Thao tác này sẽ tải xuống tất cả các tệp jar cần thiết để tạo dự án Maven đầu tiên của bạn và Dịch vụ Web RESTful.

Step 3- Khi nhấn nút Tiếp theo ở bước trước, ảnh chụp màn hình sau sẽ xuất hiện. Tại đây, bạn sẽ phải chỉ định Maven Archetype.

Trong hộp tìm kiếm, hãy tìm kiếm “Jersey-ArchType-Webapp (2.16)” và chọn hộp kiểm “Hiển thị Cũ hơn”.

Step 4- Khi đã chọn xong, bạn sẽ được chuyển đến màn hình sau. Chọn bình ưa thích từ danh sách và nhấn Tiếp theo để tiếp tục.

Step 5- Trong bước này, bạn cần cung cấp tên dự án và Id nhóm của nó cũng như chi tiết gói. Sau khi cung cấp tất cả thông tin này, hãy nhấn Hoàn tất để tiếp tục.

Step 6- Bạn đã hoàn tất việc thiết lập không gian làm việc của mình. Thư mục dự án sẽ giống như sau.

Kiểm tra thư mục “Phụ thuộc” của bạn và bạn sẽ thấy rằng Maven đã tự động tải xuống tất cả các tệp jar cần thiết cho dự án này.

Step 7- Không gian làm việc của bạn đã được thiết lập và bạn có thể bắt đầu với việc viết mã. Hãy tiếp tục và tạo bốn lớp và gói như được đề cập trong ảnh chụp màn hình sau. Bạn có thể tìm thấy MyResource.java đã được tạo bởi Maven, vì Maven đủ thông minh để phát hiện rằng bạn sẽ xây dựng dịch vụ web của riêng mình.

Step 8 - Sau khi thực hiện xong bước trên, chúng ta sẽ xây dựng lớp POJO của mình là UserProfile.java như sau.

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- Bây giờ chúng ta sẽ tạo lớp Cơ sở dữ liệu của chúng ta. Vì đây là một phần của tài liệu học tập, chúng tôi sẽ không sử dụng bất kỳ DB nào làm cơ sở dữ liệu của mình. Chúng tôi sẽ sử dụng một bộ nhớ Java có sẵn để hoạt động như bộ nhớ tạm thời của chúng tôi. Như bạn có thể thấy trong bộ mã sau, chúng tôi sẽ sử dụng MAP làm cơ sở dữ liệu của mình. Tất cả các hoạt động dịch vụ web mà chúng tôi thực hiện, chúng tôi sẽ làm việc trên MAP này được xác định trong lớp.

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- Bây giờ chúng ta hãy xây dựng lớp dịch vụ của mình. Hãy tiếp tục và sao chép, dán bộ mã sau vào lớp “ProfileService.java”. Đây là lớp mà chúng tôi sẽ khai báo tất cả các phương thức dịch vụ web của chúng tôi sẽ được hiển thị cho thế giới bên ngoài. Chúng ta cần tạo một tham chiếu của Lớp cơ sở dữ liệu để cơ sở dữ liệu tạm thời của chúng ta có thể được truy cập trong lớp này.

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 - Trong bước này, chúng ta sẽ tạo lớp Resource của mình sẽ được liên kết với URL và dịch vụ tương ứng sẽ được gọi.

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- Làm sạch xây dựng dự án và chạy nó. Nếu mọi thứ suôn sẻ thì bạn sẽ nhận được kết quả sau trong trình duyệt, trong khi truy cậphttp://localhost:8080/UserProfile/webapi/Profile” URL.

Bạn có thể thấy các mục nhập khác nhau được điền bằng cách sử dụng biểu diễn XML.

Phương pháp khác có thể được kiểm tra bằng Postman bằng cách áp dụng URL phương pháp thích hợp.

@GET method - Ảnh chụp màn hình sau đây trình bày cách chúng tôi có thể nhận được kết quả mong muốn cho yêu cầu nhận, trả về tất cả thông tin chi tiết của người dùng.

@POST- Yêu cầu sau có thể được sử dụng để kiểm tra phương pháp Đăng của chúng tôi. Lưu ý cách proId đã được tạo tự động.

@PUT- Phương pháp này sẽ cập nhật các mục nhập. Ảnh chụp màn hình sau đây minh họa cách Jersey lấy proId từ URL yêu cầu và cập nhật câu trả lời hồ sơ người dùng tương tự.

Theo cách tương tự, bạn có thể kiểm tra các phương pháp khác có sẵn trong các dịch vụ web của mình.

Trong phần trước, chúng tôi đã phát triển một dịch vụ sẽ hiển thị chức năng CRUD. Bây giờ bất cứ khi nào chúng tôi cố gắng triển khai dịch vụ này trong ứng dụng của mình, chúng tôi cần tạo một ứng dụng khách của ứng dụng này và đính kèm nó vào ứng dụng của chúng tôi. Trong chương này, chúng ta sẽ học cách xây dựng chức năng này bằng cách sử dụng khái niệm Microservice. Sau đây là biểu diễn sơ đồ của ứng dụng của chúng tôi được xây dựng bằng các bước trên.

Tác nhân phải là đầu vào của dịch vụ của chúng tôi. Trong trường hợp này “ProfileResource.java” thực hiện trách nhiệm của một tác nhân. Lớp này sẽ gọi các phương thức khác nhau để thực hiện các thao tác khác nhau như thêm, cập nhật và xóa.

Phân hủy ứng dụng CRUD

Theo nguyên tắc chính của microservice, chúng ta chỉ cần có một nhiệm vụ nghiệp vụ cho mỗi mô-đun, do đó một tác nhân không nên chịu trách nhiệm cho cả bốn chức năng CRUD. Hãy xem xét ví dụ sau, nơi chúng tôi đã giới thiệu một số vai trò mới để bạn hiểu rõ về mặt khái niệm rằng Microservice là một đại diện kiến ​​trúc của SOA.

“Người dùng chính” là người dùng giao tiếp với “Bộ điều khiển ứng dụng” để phục vụ nhu cầu của một người. “Người điều khiển ứng dụng” là người chỉ gọi các “Người quản lý tài nguyên” khác nhau tùy theo yêu cầu từ người dùng cuối. “Người quản lý tài nguyên” thực hiện công việc bắt buộc phải thực hiện. Chúng ta hãy xem nhanh các vai trò khác nhau của các đơn vị khác nhau của ứng dụng.

  • End User/Main Users - Yêu cầu một số tài nguyên tới Bộ điều khiển ứng dụng.

  • Application - Nhận yêu cầu và chuyển tiếp yêu cầu tương tự đến Người quản lý tài nguyên cụ thể.

  • Resource Manager - Thực hiện công việc cập nhật, xóa và thêm người dùng.

Xem tổng trách nhiệm của một lớp được phân bổ như thế nào giữa các lớp khác.