微服务架构-手工创建SOA【翻译】

java技术文章

2019-02-13

13

0

在这个章节中,我们将用SOA结构开发一个基于CRUD的应用。在稍后的章节中,我们将拆分这个服务为微服务,这样,我们将学习SOA和微服务之间结构的不同之处。
 

系统配置和安装

在这个章节棕,我们将构建一个简单的CRUD应用,无论什么时候调用我们的服务时将返回一个JSON对象做为一个响应输出,我们将使用Jersey框架开发这个事例。下面是在本地环境搭建的步骤。
 

开发一个CRUD应用

步骤1--我们将使用NetBeans作为开发IDE。请从NetBeans官网下载最后一个可用版本 https://netbeans.org/downloads/
 
步骤2-打开你的NetBeans IDE,依次点击FILE-->New Project.如下图,选择“Maven”栏目并且选择"Project from ArchType"作为一个工程,接着点击下一步。
这里将下载所有需要的jar包到你所创建的每一个Maven工程中和RESTful Web Service中。
 
步骤3-在上面的步骤中点击下一步按钮,如下图显示,这里,你必须选择一个指定的Maven结构。
在搜索框中,搜索“Jersey-archType-Webapp(2.16)”并且勾选“Show Older”复选框。
 
步骤4-如果你选择了同一个,你将进入到如下图界面。从列表中选择首选的jar,并且点击下一步继续。
 
步骤5-在这个步骤中,你需要提供工程名称和它的组ID和包名明细。在提供所有这些信息后,点击完成按钮继续。
 
步骤6-在你的工作空间完成如上操作后,你的工程目录看起来如下图:
切换到你的“Dependencies”文件夹,你将找到maven下载的工程需要的所有jar包。
 
步骤7-你的工作空间已经创建完成,你将可以开始编写代码。在顶部创建4个class类,包名如下图显示的一样。你可以找到MyResource.java已经被maven创建,maven将探测你将创建的web service。
 
步骤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-现在我们将创建我们的数据库类,在这个学习章节部分,我们将不使用任何DB作为我们的数据库,我们将使用一个内建的java缓存作为临时缓存代替。你会在如下的set代码中看到我们使用MAP作为我们的数据库。我们执行的所有web service操作,将工作在这个类定义的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-现在我们构建我们的service类,在顶端创建“ProfileService.java”类,复制粘贴如下set代码。这个类,我们将向外暴露我们声明的所有web service方法。我们需要创建一个关联我们数据库类的类,比如:我们的这个缓存数据库能在这个类中进行处理。
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 getAllProfile() {
      List list = new ArrayList(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 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--clean构建工程并且运行。如果一切正常,在地址栏中输入如下地址:

http://localhost:8080/UserProfile/webapi/Profile
你将在浏览器中获得如下输出
 
不同的方法能使用Postman【接口测试工具】调用适当的方法URL进行测试。

@GET方法--如下的截图示范我们怎样能通过请求获得期望的结果,返回所有的用户明细。

@POST方法--如下请求可以用来测试我们的post方法。注意怎样自动的生成proid。

@PUT-这个方法将更新实体。下面的图片示范怎样从请求URL中携带Jersey的proid并且更新同一个用户的描述答复。

 

用同样的方式,你能检查你的web service其他方法是否可用。

在前面的章节中,我们开发了一个暴露CRUD功能的web service。现在无论什么时候我们在我们的应用中试图实现这些服务,我们需要创建这个应用的客户端并且关联我们的应用。在这个章节中,我们将学习怎样使用微服务概念构建这个功能。下面是使用上面步骤构建我们的用例图。

职务应该是我们服务的整个点。在这个事例中“ProfileResource.java”履行一个职务的责任。这个类将调用不同的方法执行不同的操作,比如:添加、更新和删除。
 

分解CRUD应用

根据微服务的主要原理,我们需要仅仅有一个业务任务对应每一个模块,因此一个职务不应该表现对应所有4个CRUD功能。考虑如下事例,这里我们将创建一个新角色,比如将概念地告诉你微服务是SOA的一个结构表现形式。
“Main user” 是一个与”Application Controller”交互的用户,去服务每一个需求。“Application Controller” 是一个根据从终端用户的请求调用不同“Resource Managers”的用户。“Resource Manager”表示需要去做工作的一个用户。让我们快速的查看应用不同单元不同角色。
  • End User/Main Users −从一些源请求到控制应用.
  • Application − 接收请求并且重定向到一些指定资源管理器.
  • Resource Manager − 实际工作,比如:更新、删除和添加用户.
看怎样把一个类的所有表现拆分成不同表现的类。

 欢迎访问:www.hongfu951.com博客,查看更多文章

发表评论

全部评论:0条

鸿福951

努力打造一个好用的webui

热评文章

推荐文章