Java 中的微服务 API 网关模式:使用统一端点简化服务访问
微服务 API 网关设计模式的意图
API 网关设计模式旨在为微服务架构中的一组微服务提供统一的接口。它充当客户端的单一入口点,将请求路由到相应的微服务并聚合结果,从而简化客户端代码。
也称为
- API 门面
- 前端后端 (BFF)
微服务 API 网关模式的详细说明,附带实际案例
实际案例
在一个大型电子商务平台中,API 网关用作所有客户端请求的单一入口点,简化了客户端开发。当用户访问网站或使用移动应用程序时,他们对产品信息、用户身份验证、订单处理和支付的请求都会通过 API 网关路由。API 网关处理诸如用户身份验证、速率限制以防止滥用以及用于监控目的的日志记录等任务,从而提高整体安全性优化。此设置简化了客户端界面,并确保所有后端微服务可以独立发展,而不会直接影响客户端,从而增强微服务通信。这也通过提供一个集中式点来执行策略和监控流量来增强安全性。
通俗易懂的说
对于使用微服务架构实现的系统,API 网关是聚合对单个微服务的调用的单一入口点。
维基百科说
API 网关是充当 API 前端的服务器,接收 API 请求,执行限流和安全策略,将请求传递到后端服务,然后将响应传递回请求者。网关通常包括一个转换引擎,以动态地协调和修改请求和响应。网关还可以提供诸如收集分析数据和提供缓存等功能。网关可以提供功能来支持身份验证、授权、安全、审计和法规遵从性。
Java 中微服务 API 网关的编程示例
此实现显示了 API 网关模式对于电子商务网站的外观。ApiGateway
使用 ImageClientImpl
和 PriceClientImpl
分别调用 Image 和 Price 微服务。在台式设备上查看网站的客户可以看到价格信息和产品的图像,因此 ApiGateway
调用这两个微服务,并将数据聚合到 DesktopProduct
模型中。但是,移动用户只能看到价格信息;他们看不到产品图像。对于移动用户,ApiGateway
仅检索价格信息,用于填充 MobileProduct
。
以下是 Image 微服务的实现。
public interface ImageClient {
String getImagePath();
}
public class ImageClientImpl implements ImageClient {
@Override
public String getImagePath() {
var httpClient = HttpClient.newHttpClient();
var httpGet = HttpRequest.newBuilder()
.GET()
.uri(URI.create("http://localhost:50005/image-path"))
.build();
try {
var httpResponse = httpClient.send(httpGet, BodyHandlers.ofString());
return httpResponse.body();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
以下是 Price 微服务的实现。
public interface PriceClient {
String getPrice();
}
public class PriceClientImpl implements PriceClient {
@Override
public String getPrice() {
var httpClient = HttpClient.newHttpClient();
var httpGet = HttpRequest.newBuilder()
.GET()
.uri(URI.create("http://localhost:50006/price"))
.build();
try {
var httpResponse = httpClient.send(httpGet, BodyHandlers.ofString());
return httpResponse.body();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
在这里,我们可以看到 API 网关如何将请求映射到微服务。
public class ApiGateway {
@Resource
private ImageClient imageClient;
@Resource
private PriceClient priceClient;
@RequestMapping(path = "/desktop", method = RequestMethod.GET)
public DesktopProduct getProductDesktop() {
var desktopProduct = new DesktopProduct();
desktopProduct.setImagePath(imageClient.getImagePath());
desktopProduct.setPrice(priceClient.getPrice());
return desktopProduct;
}
@RequestMapping(path = "/mobile", method = RequestMethod.GET)
public MobileProduct getProductMobile() {
var mobileProduct = new MobileProduct();
mobileProduct.setPrice(priceClient.getPrice());
return mobileProduct;
}
}
何时在 Java 中使用微服务 API 网关模式
- 在构建微服务架构时,如果需要将微服务的复杂性从客户端抽象出来。
- 当单个请求需要使用多个微服务时。
- 用于在单一点执行身份验证、授权和安全实施。
- 为了优化客户端和服务之间的通信,尤其是在云环境中。
微服务 API 网关模式 Java 教程
- 探索新的 Spring Cloud Gateway (Baeldung)
- Spring Cloud - Gateway (tutorialspoint)
- 开始使用 Spring Cloud Gateway (DZone)
微服务 API 网关模式的优缺点
好处
- 将客户端与微服务解耦,允许服务独立发展。
- 通过聚合对多个服务的请求来简化客户端。
- 安全、日志记录和速率限制等跨领域关注点的集中位置。
- 缓存和请求压缩等性能优化的潜力。
权衡
- 引入了单点故障,虽然这可以通过高可用性设置来缓解。
- 如果未正确扩展,可能会成为瓶颈。
- 增加了部署和管理的复杂性。
Java 中微服务 API 网关模式的实际应用
- 电子商务平台,其中多个服务(产品信息、定价、库存)被聚合以用于单个视图。
- 使用各种后端服务的移动应用程序,但需要简化的界面以方便使用。
- 利用多个微服务架构的云原生应用程序。
相关的 Java 设计模式
- 聚合器微服务 - API 网关模式通常与聚合器微服务模式一起使用,以提供对一组微服务的统一接口。
- 断路器 - API 网关可以使用断路器模式来防止在调用多个微服务时出现级联故障。
- 代理 - API 网关模式是代理模式的一种专门形式,其中网关充当客户端的单一入口点,将请求路由到相应的微服务并聚合结果。