一、为什么要使用网关
思考一下程序可以直接这样架构吗?
这样架构带来的问题:
- 认证复杂,假设所有接口都需要认证才能访问
- 导致客户端难以重构:请求地址可能随时改变
- 无法使用浏览器不友好的协议:后台协议浏览器不知道,前端没有转化的过程
问题解决: - 认证复杂:统一认证
- 导致客户端难以重构:统一端口
- 无法使用浏览器不友好的协议:服务里面使用什么协议用网关转化成http协议,隔离开了
二、什么使Spring Cloud Gateway
- SpringCloud的网关(第二代):未来将取代Zuul(第一代)
- 基于Netty、Reactor以及WebFlux构建
三、SpringCloud Gateway的优点
- 性能强劲,性能使第一代网关Zuul1.x的1.6倍
- 功能强大,内置流量很多的实用功能,比如转发、监控、限流等
- 设计优雅易拓展
四、SpringCloud Gateway缺点
- 依赖Netty和WebFlux,不是Servlet编程模型,有一定的适应成本
- 不能再Servlet容器下工作们也不能构成war包
- 不支持SpringBoot1.x
五、编写SpringCloud Gateway代码
1. 创建一个SpringBoot项目
2. 加入如下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
</dependencies>
3. 创建SpringBoot项目的启动类和配置文件
server:
port: 9000
spring:
application:
name: gateway
cloud:
nacos:
server-addr: localhost:8848
gateway:
discovery:
locator:
# 让网关服务去注册中心寻找其他服务
enabled: true
4. 配置文件中加入如下配置:
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
5.情动Gateway项目通过网关的方式访问
例如:get请求:http://localhost:网关端口号/访问服务名/访问方法/参数
6.Gateway的核心概念
- Route(路由):SpringCloud Gateway的基础元素,可以简单理解成一条转发的规则
包含:ID、目标URL、Predicate集合以及Filter集合。 - Predicate(谓词):即java.util.function.Predicate,SpringCloud Gateway使用Predicate实现路由的匹配条件。
- Filter(过滤器):类似于Javaweb的过滤器(拦截器),用来修改请求和响应。