API网关
大型项目开发过程中,往往都是由各个不同的微服务组成的,服务可能分布在不同地区不同机房,那用户如何知道访问某服务的时候该服务的实际地址呢,这时候就需要API网关了
API 网关就像服务的门面一样,是系统对外的唯一接口,所有的请求经过网关代理转发到对应的服务实例,这样就不需要用户关注微服务的信息了
而且网关层也可以集成一些非业务功能,比如说鉴权,限流,访问日志,监控等操作
对于服务数量众多、复杂度较高、规模比较大的系统来说,使用 API 网关具有以下好处:
客户端通过 API 网关与微服务交互时,客户端只需要知道 API 网关地址即可,而不需要维护大量的服务地址,简化了客户端的开发。
客户端直接与 API 网关通信,能够减少客户端与各个服务的交互次数。
客户端与后端的服务耦合度降低。
节省流量,提高性能,提升用户体验。
API 网关还提供了安全、流控、过滤、缓存、计费以及监控等 API 管理功能。
常见的 API 网关实现方案主要有以下 5 种:
- Spring Cloud Gateway
- Spring Cloud Netflix Zuul
- Kong
- Nginx+Lua
- Traefik
Spring Cloud Gateway
Spring Cloud Gateway 是 Spring Cloud 团队基于 Spring 5.0、Spring Boot 2.0 和 Project Reactor 等技术开发的高性能 API 网关组件。
Spring Cloud Gateway 旨在提供一种简单而有效的途径来发送 API,并为它们提供横切关注点,例如:安全性,监控/指标和弹性。
Spring Cloud Gateway 是基于 WebFlux 框架实现的,而 WebFlux 框架底层则使用了高性能的 Reactor 模式通信框架 Netty。
Spring Cloud Gateway 核心概念
Spring Cloud Gateway 最主要的功能就是路由转发,而在定义转发规则时主要涉及了以下三个核心概念,如下表。
核心概念 | 描述 |
---|---|
Route(路由) | 网关最基本的模块。它由一个 ID、一个目标 URI、一组断言(Predicate)和一组过滤器(Filter)组成。 |
Predicate(断言) | 路由转发的判断条件,我们可以通过 Predicate 对 HTTP 请求进行匹配,例如请求方式、请求路径、请求头、参数等,如果请求与断言匹配成功,则将请求转发到相应的服务。 |
Filter(过滤器) | 过滤器,我们可以使用它对请求进行拦截和修改,还可以使用它对上文的响应进行再处理。 |
Gateway 的工作流程
Spring Cloud Gateway 工作流程如下图。
Spring Cloud Gateway 工作流程说明如下:
1 | 客户端将请求发送到 Spring Cloud Gateway 上。 |
动手实操
操作步骤
1 | 准备部署nacos |
集成SpringCloudGateway网关
SpringCloud 在最新版的JAVA要求支持是>17 且Springboot 与nacos 之间存在版本要求
本文使用
1 | <java.version>1.8</java.version> |
- 推荐使用 https://start.aliyun.com/ 搭建项目
- 开启 spring.cloud.gateway.discovery.locator.enabled= true
1 | # Nacos帮助文档: https://nacos:io/zh-cn/docs/concepts:html |
- 启动一个微服务1并结合网关访问
- 启动一个微服务2并结合网关访问
Nacos + Spring Cloud Gateway动态路由配置
我们知道,nacos是可以实现 配置的动态刷新 和 服务发现的。那么我们将 Spring Cloud Gateway的配置放到 nacos上是否就可以实现动态的刷新路由呢?
通过测试发现是可以实现的。此处我们通过 Spring Cloud Alibaba技术来实现。
1、服务的注册和发现使用 Spring Cloud Alibaba Nacos来实现。
2、网关使用 Spring Cloud Gateway来实现。
结论: 其实只需要在 Spring Cloud Gateway中整合 Spring Cloud Alibaba Nacos Config,网关的路由配置就可以自动刷新了,不需要额外的编码。
如果想通过 lb://XXXX-service 访问微服务,则需要 spring-cloud-starter-loadbalancer
1 | <dependency> |