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 小时前
Node.js的Web服务在Nacos中的实践
前端·spring cloud·微服务·eureka·nacos·node.js·express
Doker 多克18 小时前
IntelliJ IDEA Docker集成
spring cloud·docker·intellij-idea
Hello Dam18 小时前
面向微服务的Spring Cloud Gateway的集成解决方案:用户登录认证与访问控制
spring cloud·微服务·云原生·架构·gateway·登录验证·单点登录
小马爱打代码1 天前
SpringCloud(注册中心+OpenFeign+网关+配置中心+服务保护+分布式事务)
分布式·spring·spring cloud
小笨猪-1 天前
统⼀服务⼊⼝-Gateway
java·spring cloud·微服务·gateway
岁月变迁呀1 天前
Spring Cloud Gateway 源码
java·spring·spring cloud·gateway
岁月变迁呀1 天前
Eureka服务注册源码
spring cloud·eureka
橘子在努力2 天前
【橘子微服务】spring cloud function的编程模型
spring cloud·微服务·架构
杨荧2 天前
【开源免费】基于Vue和SpringBoot的靓车汽车销售网站(附论文)
java·前端·javascript·vue.js·spring boot·spring cloud·开源