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 | - Path=/api/** | 匹配请求路径 |
| Host | - Host=example.com | 匹配请求的主机名 |
| Method | - Method=GET | 匹配请求的方法类型(GET、POST等) |
| Header | - Header=X-Token | 匹配请求头部的某个字段 |
| Query | - Query=param | 匹配请求的查询参数 |
| Cookie | - Cookie=JSESSIONID | 匹配请求的Cookie |
| RemoteAddr | - RemoteAddr=192.168.0.0/24 | 匹配客户端的远程地址(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
相关推荐
椰椰椰耶10 小时前
[SpringCloud][12]Nacos配置中心详解,快速上手,Nacos和Eureka的区别
spring·spring cloud·eureka
半旧夜夏1 天前
【保姆级】微服务组件环境搭建(Docker Compose版)
java·linux·spring cloud·微服务·云原生·容器
Devin~Y1 天前
从内容社区到AIGC客服:Spring Boot、Redis、Kafka、K8s、RAG的三轮大厂Java面试对话(附标准答案)
java·spring boot·redis·spring cloud·kafka·kubernetes·micrometer
西凉的悲伤1 天前
Spring Boot 、Spring Cloud 微服务架构认证授权方案
spring boot·spring cloud·微服务·架构·认证授权
西凉的悲伤2 天前
Spring Cloud Gateway介绍
java·spring cloud·gateway
JAVA社区3 天前
Java高级全套教程(十)—— SpringCloudAlibaba超详细实战详解
java·开发语言·spring cloud·面试·职场和发展
JAVA社区3 天前
Java高级全套教程(九)—— SpringCloud超详细实战详解
java·开发语言·后端·spring cloud·面试·职场和发展
Devin~Y3 天前
大厂Java面试实录:Spring Boot/Cloud、Kafka、Redis、K8s 可观测性 + RAG/Agent(小Y翻车版)
java·spring boot·redis·spring cloud·kafka·kubernetes·mybatis
菜萝卜子3 天前
【Docker】Harbor 代理缓存(Pull-Through Cache)配置与使用指南
spring cloud·云原生·eureka