微服务架构 - 动手实践 MSA
在本章中,我们将构建一个微服务应用程序,它将使用不同的可用服务。我们都知道,微服务不是一种经济高效的应用程序构建方式,因为我们构建的每个服务本质上都是全栈的。在本地环境中构建微服务需要高端系统配置,因为您需要让四个服务器实例保持运行,以便可以在某个时间点使用它。为了构建我们的第一个微服务,我们将使用一些可用的 SOA 端点,并在我们的应用程序中使用它们。
系统配置和设置
在进入构建阶段之前,请相应地准备您的系统。您需要一些公共 Web 服务。您可以轻松地在 Google 上找到这些服务。如果您想使用 SOAP Web 服务,那么您将获得一个 WSDL 文件,然后您需要从那里使用特定的 Web 服务。对于 REST 服务,您只需要一个链接即可使用相同的服务。在此示例中,您将在一个应用程序中整合三种不同的 Web 服务"SOAP"、"REST"和"自定义"。
应用程序架构
您将使用微服务实施计划创建一个 Java 应用程序。您将创建一个自定义服务,该服务的输出将作为其他服务的输入。
以下是开发微服务应用程序的步骤。
步骤 1:为 SOAP 服务创建客户端 − 有许多免费的 Web API 可用于学习 Web 服务。在本教程中,我们使用 GeoIP 服务"http://www.webservicex.net/。" 其网站上的以下链接提供了 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 应用程序 − 通过选择"新建项目"创建一个普通的 Java 应用程序 -> "JAVA 项目"并点击完成,如以下屏幕截图所示。
步骤 5:添加 SOAP 客户端 − 在步骤 1 中,您已为 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 服务 − 您已生成客户端文件,但不知道应该在整个包中调用哪个方法?为此,您需要再次引用用于生成客户端文件的 WSDL。每个 WSDL 文件都应有一个"wsdl:service"标记,搜索此标记。它应该是该 Web 服务的入口点。以下是此应用程序的服务端点。
现在您需要在应用程序中实现此服务。以下是实现 SOAP Web 服务所需的一组 Java 代码。
GeoIPService newGeoIPService = new GeoIPService(); GeoIPServiceSoap newGeoIPServiceSoap = newGeoIPService.getGeoIPServiceSoap(); GeoIP newGeoIP = newGeoIPServiceSoap.getGeoIP(Ipaddress); // Ipaddress 是我们自己的 Web 服务的输出。 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(); } //从字符串中获取 IP 地址和其他信息 StringTokenizer st = new StringTokenizer(inputToOtherService); countryCode = st.nextToken("|"); CountryName = st.nextToken("|"); ipAddress = st.nextToken("|"); // 使用 Web 服务的输出调用 SOAP Web 服务--- // 获取给定 IP 地址的位置 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 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(); } } }
运行此文件后,您将在控制台中看到以下输出。您已成功开发了第一个微服务应用程序。