通过 Zuul API 网关执行请求

步骤 1: 运行 netflix-eureka-naming-server。

步骤 2: 在端口 8000 上运行 currency-exchange-service

步骤 3: 在端口 8100 上运行 currency-conversion-service

步骤 4: 运行 netflix-zuul-api-gateway-server。

步骤 5: 打开浏览器,调用 URL [http://localhost:8761](http://localhost:8761/)。它显示所有已在 Eureka 命名服务器上注册的服务。

executing-a-request-through-zuul-api-gateway.png

步骤 6: 调用 URL http://localhost:8000/currency-exchange/from/EUR/to/INR。我们会收到响应,但请求不会经过 Zuul API 网关。

executing-a-request-through-zuul-api-gateway-1.png

让我们通过 Zuul API 网关执行请求。我们使用以下 URL:http://localhost:8765/{application-name}/{uri}。端口 8765 是 Zuul API 网关服务器的默认端口。

在我们的案例中,应用程序名称currency-exchange-serviceURI/currency-exchange/from/EUR/to/INR。因此,完整的 URL 如下所示:

http://localhost:8765/currency-exchange-service/currency-exchange/from/EUR/to/INR

步骤 7: 复制上述 URL 并将其粘贴到浏览器中。我们会收到与上面相同的响应,但这次请求通过了 Zuul API 网关

executing-a-request-through-zuul-api-gateway-2.png

我们还可以看到打印在 Zuul API 网关服务器上的请求内容。请求打印了请求 URI。

executing-a-request-through-zuul-api-gateway-3.png

我们已经通过 Zuul API 网关发送了请求,而不是直接调用微服务。

在微服务调用之间设置 Zuul API 网关

在前一步中,我们使用直接的 URL 执行了通过 Zuul API 网关代理的 currency-exchange-service。当我们使用 URL http://localhost:8765/currency-exchange-service/currency-exchange/from/EUR/to/INR 时,它使用端口 8765,这是 API 网关的代理。

在本节中,我们将调用 currency-calculation-service(currency-conversion-service),该服务调用 currency-exchange-service。到目前为止,我们一直在直接调用该服务。现在,我们将通过 Zuul API 网关调用它,而不是直接调用 currency-exchange-service。

步骤 1: 选择项目 currency-conversion-service

步骤 2: 打开 CurrencyExchangeServiceProxy.java 文件。

步骤 3: 使用注解 @FeignClient 和属性 name="netflix-zuul-api-gateway-server" 启用 Feign

  1. @FeignClient(name="netflix-zuul-api-gateway-server")

记住:删除或注释掉 CurrencyExchangeServiceProxy.java 文件中的所有其他注解 @FeignClient

步骤 4: 为 Zuul API 网关服务器定义 映射

  1. @GetMapping("/currency-exchange-service/currency-exchange/from/{from}/to/{to}")

记住:删除或注释掉 currency-exchange-service 的映射。

步骤 5: 以我们编写的顺序依次运行 netflix-eureka-naming-server、currency-exchange-service、currency-conversion-servicenetflix-zuul-api-gateway-server

记住:确保所有 四个 服务都正常运行。

步骤 6: 打开浏览器,调用 URL http://localhost:8100/currency-converter-feign/from/USD/to/INR/quantity/1000。它返回以下响应:

executing-a-request-through-zuul-api-gateway-4.png

让我们看看 NetflixZullApiGatewayServerApplication 的日志。

步骤 7: 点击控制台图标旁边的箭头,并选择 NetflixZullApiGatewayServerApplication

executing-a-request-through-zuul-api-gateway-5.png

它显示了一些日志,如下图所示。

executing-a-request-through-zuul-api-gateway-6.png

步骤 8: 再次刷新 URL。它在控制台上显示一个日志。

executing-a-request-through-zuul-api-gateway-7.png

每当我们通过 Feign 调用 CurrencyClaculationService(currency-converter-service)时,它都会通过 API 网关服务器进行路由。网关执行了一个名为 ZuulLoggingFilter 的过滤器,该过滤器调用了 currency-exchange-service。

现在让我们拦截 currency converter-servicecurrency-exchange-service 之间的调用。这意味着在调用 URL 时,API 网关会执行 两次

  • 第一次,当我们调用 currency-conversion-service 时,API 网关会执行。这意味着在执行 currency-conversion-service 之前。currency-conversion-service 通过 API 网关路由。
  • 第二次,当 currency-conversion-service 调用 currency-exchange-service 时,API 网关会执行。这意味着在执行 currency-conversion-service 之后,但在执行 currency-exchange-service 之前。currency-exchange-service 也通过 API 网关路由。

让我们在项目中实现拦截。

通过 API 网关发送请求 [http://localhost:8765](http://localhost:8765/)。URI 将为 /{application-name}/{uri}。完整的 URL 如下所示:

http://localhost:8765/currency-conversion-service/currency-converter-feign/from/USD/to/INR/quantity/1000

调用上述 URL。它返回与 URL http://localhost:8100/currency-converter-feign/from/USD/to/INR/quantity/1000 返回的相同响应。

executing-a-request-through-zuul-api-gateway-8.png

我们可以在日志中看到,日志过滤器执行了 两次。第一次它调用了 currency-converter-service,第二次是在 currency-converter-service 调用 currency-exchange-service 时。
executing-a-request-through-zuul-api-gateway-9.png

在本节中,我们已经通过 Zuul API 网关服务器执行了这两个服务。

标签: spring, Spring教程, spring cloud, spring cloud教程, spring cloud框架, spring cloud面试题, springcloud组件, springcloud微服务架构, springcloud入门教程, springcloud主件, spring cloud架构图