📜  微服务架构-动手MSA

📅  最后修改于: 2020-11-24 06:03:49             🧑  作者: Mango


在本章中,我们将构建一个使用不同可用服务的微服务应用程序。我们都知道,微服务并不是构建应用程序的经济高效的方式,因为我们构建的每个服务本质上都是全栈的。在本地环境中构建微服务将需要高端系统配置,因为您需要具有四个服务器实例才能保持运行,以便可以在某个时间点使用它。为了构建我们的第一个微服务,我们将使用一些可用的SOA端点,并且将在我们的应用程序中使用它们。

系统配置和设置

在继续进行构建阶段之前,请相应地准备系统。您将需要一些公共Web服务。您可以轻松地对此进行Google搜索。如果要使用SOAP Web服务,则将获得一个WSDL文件,然后从那里开始使用特定的Web服务。对于REST服务,您只需一个链接即可使用相同的链接。在此示例中,您将在一个应用程序中阻塞三个不同的Web服务“ SOAP”,“ REST”和“ custom”。

应用架构

您将使用微服务实施计划创建一个Java应用程序。您将创建一个自定义服务,该服务的输出将用作其他服务的输入。

以下是开发微服务应用程序要遵循的步骤。

步骤1:为SOAP服务创建客户端-有许多免费的Web API可用来学习Web服务。就本教程而言,请使用“ http://www.webservicex.net/”的GeoIP服务 WSDL文件在其网站“ webservicex.net ”上的以下链接中提供要从此WSDL文件生成客户端,您需要做的就是在终端中运行以下命令。

wsimport http://www.webservicex.net/geoipservice.asmx?WSDL

此命令将在一个名为“ SEI”的文件夹下生成所有必需的客户端文件,该文件夹以服务端点接口命名。

第2步:创建自定义Web服务-遵循本教程前面提到的相同过程,并构建一个名为“ CustomRest”的基于Maven的REST api。完成后,您将找到一个名为“ MyResource.java”的类。继续并使用以下代码更新此类。

package com.tutorialspoint.customrest;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("myresource")
public class MyResource {
   @GET
   @Produces(MediaType.TEXT_PLAIN)
   
   public String getIt() {
      return "IND|INDIA|27.7.65.215";
   }
}

一切完成后,继续并在服务器上运行该应用程序。您应该在浏览器中获得以下输出。

网络服务

这是Web服务器,一旦被调用,它将返回一个字符串对象。这是输入服务,它提供可由其他应用程序使用以生成记录的输入。

步骤3:配置另一个Rest API-在此步骤中,使用位于services.groupkt.com的另一个Web服务调用时将返回JSON对象。

步骤4:创建JAVA应用程序-通过选择“ New Project”->“ JAVA project”创建一个普通的Java应用程序,然后单击Finish,如下面的屏幕快照所示。

JAVA应用

步骤5:添加SOAP客户端-在步骤1中,您已经为SOAP Web服务创建了客户端文件。继续,并将这些客户端文件添加到当前项目中。成功添加客户端文件后,您的应用程序目录将如下所示。

SOAP Web服务

步骤6:创建您的主应用程序-创建您的主类,您将在其中使用所有这三个Web服务。右键单击源项目,然后创建一个名为“ MicroServiceInAction.java”的新类。下一个任务是从此调用不同的Web服务。

步骤7:调用您的自定义Web服务-为此,请继续并添加以下代码集以实现调用您自己的服务。

try {
   url = new URL("http://localhost:8080/CustomRest/webapi/myresource");
   conn = (HttpURLConnection) url.openConnection();
   conn.setRequestMethod("GET");
   conn.setRequestProperty("Accept", "application/json");
   
   if (conn.getResponseCode() != 200) {
      throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
   }
   
   BufferedReader br = new BufferedReader(new InputStreamReader(
      (conn.getInputStream())));
   while ((output = br.readLine()) != null) {
      inputToOtherService = output;
   }
   conn.disconnect();

} catch (MalformedURLException e) {
   e.printStackTrace();
} catch (IOException e) {
   e.printStackTrace();
}

步骤8:使用SOAP Services-您已经生成了客户端文件,但是您不知道在整个包中应调用哪种方法?为此,您需要再次参考用于生成客户端文件的WSDL。每个WSDL文件都应使用一个“ wsdl:service”标签搜索该标签。它应该是该Web服务的入口。以下是此应用程序的服务端点。

WSDL服务

现在,您需要在应用程序中实现此服务。以下是实现SOAP Web服务所需的Java代码集。

GeoIPService newGeoIPService = new GeoIPService();
GeoIPServiceSoap newGeoIPServiceSoap = newGeoIPService.getGeoIPServiceSoap();
GeoIP newGeoIP = newGeoIPServiceSoap.getGeoIP(Ipaddress);  
// Ipaddress is output of our own web service.

System.out.println("Country Name from SOAP Webserivce ---"+newGeoIP.getCountryName());

步骤9:使用REST Web服务-到目前为止,其中两个服务已被使用。在此步骤中,将在您的自定义Web服务的帮助下使用另一个具有自定义URL的REST Web服务。使用以下代码集执行此操作。

String url1="http://services.groupkt.com/country/get/iso3code/";//customizing the Url
url1 = url1.concat(countryCode);

try {
   URL url = new URL(url1);
   HttpURLConnection conn = (HttpURLConnection) url.openConnection();
   conn.setRequestMethod("GET");
   conn.setRequestProperty("Accept", "application/json");
   
   if (conn.getResponseCode() != 200) {
      throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
   }
   
   BufferedReader br = new BufferedReader(new InputStreamReader(
      (conn.getInputStream())));
   while ((output = br.readLine()) != null) {
      System.out.println(output);
   }
   conn.disconnect();

} catch (MalformedURLException e) {
   e.printStackTrace();
} catch (IOException e) {
   e.printStackTrace();
}

步骤10:使用所有服务-考虑到您的“ CustomRest” Web服务正在运行并且已连接到Internet,如果一切都成功完成,则以下应为您的合并主类。

package microserviceinaction;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.StringTokenizer;

import net.webservicex.GeoIP;
import net.webservicex.GeoIPService;
import net.webservicex.GeoIPServiceSoap;

public class MicroServiceInAction {
   static URL url;
   static HttpURLConnection conn;
   static String output;
   static String inputToOtherService;
   static String countryCode;
   static String ipAddress;
   static String CountryName;
   public static void main(String[] args) {
      //consuming of your own web service
      try {
         url = new URL("http://localhost:8080/CustomRest/webapi/myresource");
         conn = (HttpURLConnection) url.openConnection();
         conn.setRequestMethod("GET");
         conn.setRequestProperty("Accept", "application/json");
         
         if (conn.getResponseCode() != 200) {
            throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
         }
         
         BufferedReader br = new BufferedReader(new InputStreamReader(
            (conn.getInputStream())));
         while ((output = br.readLine()) != null) {
            inputToOtherService = output;
         }
         conn.disconnect();
      
      } catch (MalformedURLException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
      
      //Fetching IP address from the String and other information
      StringTokenizer st = new StringTokenizer(inputToOtherService);
      countryCode = st.nextToken("|");
      CountryName = st.nextToken("|");
      ipAddress = st.nextToken("|");
      
      // Call to SOAP web service with output of your web service--- 
      // getting the location of our given IP address
      String Ipaddress = ipAddress;
      GeoIPService newGeoIPService = new GeoIPService();
      GeoIPServiceSoap newGeoIPServiceSoap = newGeoIPService.getGeoIPServiceSoap();
      GeoIP newGeoIP = newGeoIPServiceSoap.getGeoIP(Ipaddress);
      System.out.println("Country Name from SOAP Webservice ---"+newGeoIP.getCountryName());
      
      // Call to REST API --to get all the details of our country
      String url1 = "http://services.groupkt.com/country/get/iso3code/"; //customizing the Url
      url1 = url1.concat(countryCode);
      
      try {
         URL url = new URL(url1);
         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
         conn.setRequestMethod("GET");
         conn.setRequestProperty("Accept", "application/json");
            
         if (conn.getResponseCode() != 200) {
            throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
         }
      
         BufferedReader br = new BufferedReader(new InputStreamReader(
            (conn.getInputStream())));
         while ((output = br.readLine()) != null) {
            System.out.println(output);
         }
      
         conn.disconnect();
      } catch (MalformedURLException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

运行此文件后,您将在控制台中看到以下输出。您已经成功开发了第一个微服务应用程序。

在控制台中输出