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
相关推荐
拾忆,想起9 小时前
如何选择Spring AOP的动态代理?JDK与CGLIB的适用场景
spring boot·后端·spring·spring cloud·微服务
程序猿零零漆1 天前
SpringCloud系列教程:微服务的未来(十九)请求限流、线程隔离、Fallback、服务熔断
java·spring cloud·微服务
2的n次方_2 天前
Eureka 服务注册和服务发现的使用
spring boot·spring cloud·云原生·eureka·服务发现
奔跑吧邓邓子2 天前
SpringCloud之服务间通信超时:突破微服务的“时间枷锁”
spring cloud·微服务·通信超时
荆州克莱3 天前
mysql重学(一)mysql语句执行流程
spring boot·spring·spring cloud·css3·技术
忆~遂愿3 天前
3大关键点教你用Java和Spring Boot快速构建微服务架构:从零开发到高效服务注册与发现的逆袭之路
java·人工智能·spring boot·深度学习·机器学习·spring cloud·eureka
程序猿零零漆3 天前
SpringCloud系列教程:微服务的未来(十八)雪崩问题、服务保护方案、Sentinel快速入门
spring cloud·微服务·sentinel
程序猿零零漆5 天前
SpringCloud系列教程:微服务的未来(十七)监听Nacos配置变更、更新路由、实现动态路由
java·spring cloud·微服务
customer086 天前
【开源免费】基于SpringBoot+Vue.JS贸易行业crm系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源
等一场春雨7 天前
Alibaba Spring Cloud 十三 Nacos,Gateway,Nginx 部署架构与负载均衡方案
nginx·spring cloud·gateway