Spring Cloud Alibaba-(6)Spring Cloud Gateway【网关】
Spring Cloud Alibaba-(1)搭建项目环境
Spring Cloud Alibaba-(2)Nacos【服务注册与发现、配置管理】
Spring Cloud Alibaba-(3)OpenFeign【服务调用】
Spring Cloud Alibaba-(4)Sentinel【流控和降级】
Spring Cloud Alibaba-(5)Seata【分布式事务】
Spring Cloud Alibaba-(6)Spring Cloud Gateway【网关】
Spring Cloud Alibaba-(7)RocketMQ【分布式消息队列】
1.什么是网关,微服务为什么要使用网关?
Gateway(网关)是一种用于管理和协调外部请求与内部服务交互的技术组件。它充当了一个中心化的代理,负责接收来自客户端的所有请求,并将其转发到适当的后端服务。以下是关于为什么要在微服务架构中使用Gateway的原因:
(1)统一接口:对外部客户端提供一个统一的访问入口。
(2)智能路由:根据请求的内容(如路径、头信息等)决定将请求转发给哪个后端服务。
(3)负载均衡:在多个相同类型的后端服务实例之间分配请求。
(4)认证和鉴权:在请求到达后端服务之前验证用户的凭证。
(5)限流:控制每个客户端的请求频率,防止滥用或DDoS攻击。
(6)缓存:存储响应数据,减少对后端服务的重复请求。
(7)协议转换:在不同的通信协议之间转换请求和响应。
(8)监控和日志:记录请求和响应的详细信息,帮助诊断问题和优化性能。
(9)错误处理:统一处理错误响应,向客户端提供一致性的错误信息。
2.项目创建 gateway 微服务
3. Gateway 整合 Nacos
3.1 引入Maven依赖
<!-- gateway 网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- nacos-discovery 服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.2 配置 bootstrap.yml
server:
port: 8200
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: http://localhost:8848
gateway:
routes:
- id: order_route # 路由id,路由唯一标识
uri: lb://order-service # uri:需要转发的地址 lb:使用 nacos 本地负载均衡策略 order-service:服务名
predicates:
- Path=/order/** # 访问网关,如果路径是以 /order 开头的所有请求,转发到 order-service
- id: product_route
uri: lb://product-service
predicates:
- Path=/product/**
3.3 启动 gateway 服务,http://localhost:8200/product/getById/1 经过 Gateway 请求产品服务
4.断言工厂(Predicate Factories)
断言工厂用于定义路由规则,决定请求是否应该被路由到某个服务。常用的断言工厂包括:
断言工厂 | 配置 | 用途 |
Path |
| 匹配请求路径 |
Host |
| 匹配请求的主机名 |
Method |
| 匹配请求的方法类型(GET、POST等) |
Header |
| 匹配请求头部的某个字段 |
Query | - Query | 匹配请求的查询参数 |
Cookie |
| 匹配请求的Cookie |
RemoteAddr | - R | 匹配客户端的远程地址(IP地址) |
Port | - Port=8080 | 匹配客户端连接的端口号 |
Weight | - Weight=group1,2 | 基于权重进行负载均衡 |
5.过滤器工厂(Filter Factories)-局部过滤器
过滤器工厂用于在请求进入或离开网关时执行某些操作。常用的过滤器工厂包括:
过滤器工厂 | 配置 | 用途 |
AddRequestHeader | - AddRequestHeader=X-Request-Header, value | 添加请求头 |
AddResponseHeader | - AddResponseHeader=X-Response-Header, value | 添加响应头 |
SetPath | - SetPath=/new/path | 重写请求路径 |
SetQueryString | - SetQueryString=query=value | 重写请求查询参数 |
StripPrefix | - StripPrefix=/order-serv | 移除请求路径的前缀 |
Retry | - Retry=404,3 | 实现请求重试机制 |
6. bootstrap.yml 使用断言工厂、过滤器工厂
spring:
cloud:
gateway:
routes:
- id: example-route
uri: lb://example-service
predicates:
- Path=/api/**
filters:
- AddRequestHeader=X-Request-Header, value
- SetPath=/new/path
7.Gateway 整合 Sentinel 实现网关流控降级
7.1 引入Maven依赖
<!-- gateway 网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- sentinel 限流降级-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- sentinel 整合 gateway-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
7.2 bootstrap.yml 配置 Sentinel 控制台地址-http://localhost:8858
server:
port: 8200
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: http://localhost:8848
gateway:
routes:
- id: order_route # 路由id,路由唯一标识
uri: lb://order-service # uri:路由转发的地址 lb:使用 nacos 本地负载均衡策略 order-service:服务名
predicates: # 断言:对请求进行匹配,匹配成功就路由转发,匹配不成功返回404
- Path=/order/** # 访问网关,如果路径是以 /order 开头的所有请求,转发到 order-service
- id: product_route
uri: lb://product-service
predicates:
- Path=/product/**
sentinel:
transport:
dashboard: http://localhost:8858