springcloud alibaba(七)Gateway--服务网关

文章目录

Gateway网关服务
核心概念:为什么需要网关?

在没有网关的微服务架构中,客户端需要直接调用多个微服务(比如订单服务、用户服务、商品服务),会带来这些问题:

  1. 客户端要记住多个服务地址,维护成本高;
  2. 每个微服务都要重复实现鉴权、限流、跨域等功能,代码冗余;
  3. 微服务地址变更时,客户端需要同步修改,灵活性差;
  4. 无法统一监控、统计所有请求的流量。
    而网关就像 "前台接待",把这些通用功能集中处理,让微服务只专注于业务逻辑。
网关的核心功能(以 Spring Cloud Gateway 为例)
核心功能 作用说明
路由转发 接收客户端请求,根据配置的规则(如路径、参数)转发到对应的微服务
统一鉴权 集中验证 token、权限,无需每个微服务单独写鉴权逻辑
限流熔断 对请求做流量控制(比如 QPS 限制),防止服务被打垮;服务异常时熔断保护
日志监控 统一记录所有请求的日志(请求路径、耗时、状态码),方便排查问题
跨域处理 集中配置跨域规则,解决前端跨域问题
路径重写 修改请求路径(比如把 /api/v1/order 重写为 /order)
负载均衡 结合注册中心(Nacos/Eureka),自动转发请求到可用的微服务实例

工作流程:

创建网关模块
  1. 引入依赖
xml 复制代码
<!-- Gateway 核心依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 整合 Nacos 注册中心(用于服务发现) -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 配置文件(application.yml)
yaml 复制代码
server:
  port: 7000
spring:
  application:
    name: api-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # 如果nacos没有安装在本地机,这里需要安装所在的机器ip,端口是默认的8848

    gateway:
      discovery:
        locator:
          enabled: true # 让gateway可以发现nacos中的微服务
      routes:
        - id: product_route  # 注意:routes是数组,这里的"-"要和routes缩进对齐
          uri: lb://service-product  # uri和id同级缩进
          predicates:  # predicates和id/uri同级缩进
            - Path=/product-serv/**  # predicates是数组,"-"要和predicates缩进对齐
          filters:  # filters和id/uri同级缩进
            - StripPrefix=1  # filters是数组,"-"要和filters缩进对齐
  1. 验证请求路径 http://localhost:7000/product-serv/product/1
断言 自定义路由断言工厂
  1. 创建 自定义路由断言工厂类
java 复制代码
package com.goblin.config;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

//创建自定义的路由断言工厂类,要求有两个
//1 名字必须是 配置+RoutePredicateFactory
//2 必须继承AbstractRoutePredicateFactory<配置类>
//提示: 可以在spring-cloud-gateway-core包中的org.springframework.cloud.gateway.handler.predicate子包中查看已有的内置路由断言工厂类,进行仿写即可
@Component
public class AgeRoutePredicateFactory extends AbstractRoutePredicateFactory<AgeRoutePredicateFactory.Config> {

    //构造函数
    public AgeRoutePredicateFactory() {
        super(AgeRoutePredicateFactory.Config.class);
    }

    //读取配置文件的中参数值 给他赋值到配置类中的属性上
    public List<String> shortcutFieldOrder() {
        //这个位置的顺序必须跟配置文件中的值的顺序对应
        return Arrays.asList("minAge", "maxAge");
    }

    //断言逻辑
    public Predicate<ServerWebExchange> apply(AgeRoutePredicateFactory.Config config) {
        return new Predicate<ServerWebExchange>() {
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                //1 接收前台传入的age参数
                String ageStr = serverWebExchange.getRequest().getQueryParams().getFirst("age");

                //2 先判断是否为空
                if (StringUtils.isNotEmpty(ageStr)) {
                    //3 如果不为空,再进行路由逻辑判断
                    int age = Integer.parseInt(ageStr);
                    if (age < config.getMaxAge() && age > config.getMinAge()) {
                        return true;
                    } else {
                        return false;
                    }
                }
                return false;
            }
        };
    }

    //配置类,用于接收配置文件中的对应参数
    @Data
    @NoArgsConstructor
    public static class Config {
        private int minAge;//18
        private int maxAge;//60
    }
}
  1. 在配置文件中添加关于自定义路由断言工厂类的配置
yaml 复制代码
      routes:
        - id: product_route  # 注意:routes是数组,这里的"-"要和routes缩进对齐
          uri: lb://service-product  # uri和id同级缩进
          predicates:  # predicates和id/uri同级缩进
            - Path=/product-serv/**  # predicates是数组,"-"要和predicates缩进对齐
            - Age=18,20 # 只有符合要求的才允许访问
  1. 测试
    3.1 http://localhost:7000/product-serv/product/1?age=19

    3.2 http://localhost:7000/product-serv/product/1?age=21

    当配置的范围是18, 20, 路由断言工厂类中的业务逻辑是 大于18, 小于20, 也可以(18, 20)这样表示, 所以只有19是符合要求的,所以除了19外都没有权限访问。
自定义过滤器

可以按照内置的过滤器照猫画虎来实现。

相关推荐
卓怡学长3 小时前
w269基于spring boot + vue 候鸟监测数据管理系统
java·数据库·spring boot·spring·intellij-idea
Listen·Rain9 小时前
向量化详解
java·人工智能·spring·机器学习·ai
添砖java_85710 小时前
网页聊天室测试报告
java·spring boot·spring·maven
xixingzhe211 小时前
Spring 依赖注入
java·后端·spring
闲猫20 小时前
Spring AI 对接Deepseek ChatModel 聊天对话
java·前端·spring
醇氧1 天前
Spring 容器 Map 注入机制详解
java·后端·spring
ylscode1 天前
Cloudflare Workers Cache 深度解析:边缘缓存如何重塑无服务器性能边界
java·spring·mybatis
沉静的小伙1 天前
Spring事务
java·数据库·spring
微三云 - 廖会灵 (私域系统开发)1 天前
电商系统微服务拆分实战:从单体到Spring Cloud的分布式事务踩坑与补偿方案
分布式·spring cloud·微服务
Wang's Blog1 天前
Java框架快速入门: Spring Bean核心配置与实例化详解
java·开发语言·spring