Microservice-architecture-hands-on-soa

提供:Dev Guides
移動先:案内検索

マイクロサービスアーキテクチャ-ハンズオンSOA

この章では、SOAアーキテクチャを使用したCRUDベースのアプリケーションを開発します。 後の章で、このサービスをマイクロサービスに分割し、SOAとマイクロサービスアーキテクチャの基本的な違いを学習します。

システム構成とセットアップ

このセクションでは、サンプルのCRUDアプリケーションを作成します。このアプリケーションは、サービスを呼び出すたびにJSONオブジェクトを応答として返します。 Jerseyフレームワークを使用して同じものを開発します。 以下は、ローカルシステム環境をセットアップする手順です。

CRUDアプリケーションの開発

  • ステップ1 *-NetBeansを開発IDEとして使用します。 NetBeansの公式Webサイトhttps://netbeans.org/downloads/で入手可能な最新バージョンをダウンロードしてインストールしてください。
  • ステップ2 *-NetBeans IDEを開きます。 「ファイル→新規プロジェクト」に進みます。 次のスクリーンショットが表示されます。 カテゴリとして「Maven」を選択し、プロジェクトとして「Project from ArchType」を選択して、「次へ」をクリックします。

スクリーンショットポップアップ

これにより、必要なすべてのjarファイルがダウンロードされ、初めてのMavenプロジェクトとRESTful Webサービスが作成されます。

  • ステップ3 *-前のステップで[次へ]ボタンを押すと、次のスクリーンショットが表示されます。 ここでは、Mavenアーキタイプを指定する必要があります。

Mavenアーキタイプ

検索ボックスで「Jersey-archType-Webapp(2.16)」を検索し、「Show Older」チェックボックスをオンにします。

  • ステップ4 *-同じものを選択すると、次の画面にリダイレクトされます。 リストから優先jarを選択し、[次へ]をクリックして続行します。

リダイレクトされた画面

  • ステップ5 *-このステップでは、プロジェクトの名前とグループID、およびパッケージの詳細を指定する必要があります。 これらの情報をすべて入力したら、[完了]をクリックして続行します。

グループID

  • ステップ6 *-ワークスペースのセットアップが完了しました。 プロジェクトディレクトリは次のようになります。

ワークスペースの設定

「依存関係」フォルダーを確認すると、Mavenがこのプロジェクトに必要なすべてのjarファイルを自動的にダウンロードしていることがわかります。

依存関係

  • ステップ7 *-ワークスペースがセットアップされ、コーディングを開始できます。 次のスクリーンショットで説明するように、4つのクラスとパッケージを作成します。 Mavenは独自のWebサービスを構築することを検出するのに十分なほど賢いため、MyResource.javaはMavenによってすでに作成されています。

ソースパッケージ

  • ステップ8 *-上記のステップが完了したら、次のようにUserProfile.javaであるPOJOクラスを構築します。
package com.finddevguides.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メモリを使用して、一時メモリとして動作します。 次のコードセットでわかるように、データベースとしてMAPを使用します。 実行するすべてのWebサービス操作は、クラスで定義されたこのMAPで作業します。
package com.finddevguides.userprofile.DAO;

import com.finddevguides.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サービスメソッドを宣言するクラスです。 このクラスで一時データベースにアクセスできるように、DatabaseClassの参照を1つ作成する必要があります。
package com.finddevguides.userprofile.service;

import com.finddevguides.userprofile.DAO.DatabaseClass;
import com.finddevguides.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","finddevguides.com");
      UserProfile m2 = new UserProfile(2L,"Tutorials2","Point2","finddevguides.com2");
      UserProfile m3 = new UserProfile(3L,"Tutorials3","Point3","finddevguides.com3");
      UserProfile m4 = new UserProfile(4L,"Tutorials4","Point4","finddevguides.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にリンクされるResourceクラスを作成し、対応するサービスが呼び出されます。
package com.finddevguides.userprofile.Resource;

import com.finddevguides.userprofile.Model.UserProfile;
import com.finddevguides.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 *-プロジェクトをクリーンビルドして実行します。 すべてがうまくいけば、 *http://localhost:8080/UserProfile/webapi/Profile” URLにアクセスしながら、ブラウザーで次の出力を取得する必要があります。

XML表現を使用してさまざまなエントリが入力されていることがわかります。

ユーザープロファイル

適切なメソッドURLを適用することにより、Postmanを使用して別のメソッドをテストできます。

  • @ GETメソッド*-次のスクリーンショットは、すべてのユーザーの詳細を返すgetリクエストに必要な結果を取得する方法を示しています。

スクリーンショットのデモ

*@ POST* -次のリクエストを使用して、Postメソッドをテストできます。 proIdが自動的に生成されていることに注意してください。

投稿方法

*@ PUT* -このメソッドはエントリを更新します。 次のスクリーンショットは、JerseyがリクエストURLからproIdを取得し、同じユーザープロファイルの返信を更新する方法を示しています。

同じユーザープロファイルの返信

同様に、Webサービスで利用可能な他のメソッドを確認できます。

前のセクションでは、CRUD機能を公開する1つのサービスを開発しました。 このサービスをアプリケーションに実装しようとするたびに、このアプリケーションのクライアントを作成し、アプリケーションにアタッチする必要があります。 この章では、マイクロサービスの概念を使用してこの機能を構築する方法を学習します。 以下は、上記の手順を使用して構築されたアプリケーションの図表示です。

俳優

アクターは、サービスのエントリポイントである必要があります。 この場合、「ProfileResource.java」がアクターの役割を果たします。 このクラスはさまざまなメソッドを呼び出して、追加、更新、削除などのさまざまな操作を実行します。

CRUDアプリケーションの分解

マイクロサービスの主な原則によれば、各モジュールに必要なビジネスタスクは1つだけであるため、1つのアクターが4つのCRUD機能すべてを担当することはできません。 MicroserviceがSOAのアーキテクチャ表現であることが概念的に明確になるように、いくつかの新しい役割を導入した次の例を考えてください。

建築表現

「メインユーザー」とは、自分のニーズに応えるために「アプリケーションコントローラー」と通信するユーザーです。 「アプリケーションコントローラー」は、エンドユーザーからの要求に応じて異なる「リソースマネージャー」を呼び出すだけです。 「リソースマネージャー」は、実行する必要があるジョブを実行します。 アプリケーションのさまざまなユニットのさまざまな役割を簡単に見てみましょう。

  • エンドユーザー/メインユーザー-アプリケーションコントローラーへのいくつかのリソースのリクエスト。
  • アプリケーション-リクエストを受信し、それを特定のリソースマネージャーに転送します。
  • リソースマネージャー-ユーザーの更新、削除、および追加の実際のジョブを実行します。

1つのクラスの合計責任が他の異なるクラスにどのように分散されるかを確認してください。