1、什么是Gateway?网关作用

Gateway网关(API网关)是现代分布式系统和微服务架构中的关键组件,它作为系统的统一入口,处理所有客户端请求并将其路由到适当的后端服务。

主要功能

路由转发

:将请求路由到不同的微服务

负载均衡

:在多个服务实例间分配请求

协议转换

:处理不同协议间的转换(如HTTP到gRPC)

认证授权

:集中处理身份验证和权限控制

限流熔断

:保护系统免受过载影响

缓存

:缓存常用响应减少后端压力

日志监控

:集中收集请求日志和指标

常见Gateway实现

Spring Cloud Gateway

:基于Spring生态的API网关

Kong

:开源API网关和微服务管理层

Nginx

:高性能的HTTP和反向代理服务器

Envoy

:为云原生应用设计的代理

Traefik

:现代HTTP反向代理和负载均衡器

image.png

网关的区别

Reactive Server:是响应式网关

Server MVC:是传统式的网关

image.png

浏览器将请求统一传给网关然后通过网关去给每一个服务去发送请求order的请求就发给service-order

,product的请求就发给service-product

image.png

2、创建网关

1、先创建一个新的网关模块

image.png

2、创建启动类

@EnableDiscoveryClient

@SpringBootApplication

public class GatewayApplication {

public static void main(String[] args) {

SpringApplication.run(GatewayApplication.class, args);

}

}

3、在pom文件中引入注册中心和网关的依赖:

<!--注册中心-->

<dependency>

<groupId>com.alibaba.cloud</groupId>

<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>

</dependency>

<!--网关-->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-gateway</artifactId>

</dependency>

<!--负载均衡-->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-loadbalancer</artifactId>

</dependency>

4、在yaml/propacties中配置:

spring:

application:

name: getway

cloud:

nacos:

discovery:

server-addr: 127.0.0.1:8848

3、路由规则配置

1、在配置文件里面配置路由规则

image.png

在每一个要添加网关的服务上面加上和网关一样的公共前缀@RequestMapping("/api/order")

@RequestMapping("/api/order")

注意:在远程调openfeign用上面也要加上和网关一样的公共前缀

2、以编码的方式配置路由规则

4、Predicates断言

断言的全写法和短写法

image.png

断言工厂

断言的一些写法

image.png

自定义断言工厂

1、在网关模块创建一个存放断言工厂的类目录predicate

实列:

package com.atguigu.gateway.predicate;

// 包声明:自定义断言所在包,通常按功能模块划分

import jakarta.validation.constraints.NotEmpty;

// 用于字段校验的注解,确保配置参数不为空

import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;

// Spring Cloud Gateway提供的抽象基类,用于创建自定义路由断言

import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;

// 网关断言接口,定义核心的test方法

import org.springframework.cloud.gateway.handler.predicate.QueryRoutePredicateFactory;

// 系统内置的查询参数断言工厂(虽然导入但未实际使用)

import org.springframework.http.server.reactive.ServerHttpRequest;

// 响应式编程中的HTTP请求封装对象

import org.springframework.stereotype.Component;

// 将该类声明为Spring管理的组件

import org.springframework.util.StringUtils;

// Spring提供的字符串工具类

import org.springframework.validation.annotation.Validated;

// 启用参数校验支持

import org.springframework.web.server.ServerWebExchange;

// 网关核心交换对象,封装请求/响应和上下文信息

import java.util.Arrays;

import java.util.List;

import java.util.function.Predicate;

// Java集合工具和函数式接口

/**

* VIP路由断言工厂

* 功能:检查请求参数中是否包含指定参数且值匹配

* 命名规范:类名必须以RoutePredicateFactory结尾

*/

@Component // 标识为Spring组件,会被自动扫描注册

public class vipRoutePredicateFactory extends AbstractRoutePredicateFactory<vipRoutePredicateFactory.Config> {

/**

* 定义配置参数的快捷绑定顺序

* 当使用短配置格式时,参数将按此顺序赋值

*/

@Override

public List<String> shortcutFieldOrder() {

return Arrays.asList("param", "value");

// 第一个值赋给param,第二个值赋给value

}

/**

* 构造函数

* 必须调用父类构造器并传入配置类类型

*/

public vipRoutePredicateFactory() {

super(Config.class); // 重要:必须传递配置类的Class对象

}

/**

* 核心方法:创建断言逻辑

* @param config 包含配置参数的Config对象

* @return 返回GatewayPredicate实例

*/

@Override

public Predicate<ServerWebExchange> apply(Config config) {

// 返回一个匿名GatewayPredicate实现

return new GatewayPredicate() {

/**

* 实际断言判断逻辑

* @param exchange 包含请求/响应信息的上下文对象

* @return 返回是否匹配的布尔值

*/

@Override

public boolean test(ServerWebExchange exchange) {

// 1. 从交换对象获取请求信息

ServerHttpRequest request = exchange.getRequest();

// 2. 从查询参数中获取指定参数值

// getFirst()方法获取同名参数的第一个值

String paramValue = request.getQueryParams().getFirst(config.getParam());

// 3. 验证逻辑:

// - 参数值存在且非空

// - 参数值等于配置的期望值

return StringUtils.hasText(paramValue) &&

paramValue.equals(config.getValue());

}

};

}

/**

* 静态配置类

* 作用:接收配置文件中的参数值

*/

@Validated // 启用参数校验

public static class Config {

@NotEmpty(message = "参数名不能为空")

private String param; // 要检查的查询参数名

@NotEmpty(message = "匹配值不能为空")

private String value; // 期望的参数值

// Getter和Setter方法(必须提供,供框架调用)

public String getParam() {

return param;

}

public void setParam(String param) {

this.param = param;

}

public String getValue() {

return value;

}

public void setValue(String value) {

this.value = value;

}

}

}

spring:

cloud:

gateway:

routes:

#给这个路由起名字

- id: service-order

#要吧请求转给这个服务

uri: lb://service-order

# 断言短写法:

#遵守的路径如果路径以/api/order开头的就会转发到service-order服务

predicates:

- Path=/api/order/**

#自定义断言

- vip=user,leon

#设置优先级数字越小优先级越高

order: 0

#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

- id: service-product

uri: lb://service-product

#断言全写法:

#解释:请求必须满足请求头为/api/product/并且传的参数必须包含param的值为user和value的值为leon

predicates:

- name:

args:

patterns: /api/product/**

#匹配斜杠

matchTransform: true

- Path=/api/product/**

#自定义断言

- name: Vip

args:

param: user

value: leon

order: 0

5、Filter过滤器

什么是过滤器(Filter)?

在 Spring Cloud Gateway 中,过滤器(Filter) 是一种可以拦截并处理 HTTP 请求和响应的组件。它类似于 Servlet 中的 Filter,但基于 响应式编程(Reactive) 实现,主要用于:

修改请求(Request)

:如添加请求头、修改请求参数、重写路径等。

修改响应(Response)

:如添加响应头、修改响应体、返回自定义错误等。

执行额外逻辑

:如鉴权、日志记录、限流、熔断等。

moren

参数(个数/类型)

作用

AddRequestHeader

2/string

添加请求头

AddRequestHeadersIfNotPresent

1/List<string>

如果没有则添加请求头,key:value方式

AddRequestParameter

2/string、string

添加请求参数

AddResponseHeader

2/string、string

添加响应头

CircuitBreaker

1/string

仅支持forward:/inCaseOfFailureUseThis方式进行熔断

CacheRequestBody

1/string

缓存请求体

DedupeResponseHeader

1/string

移除重复响应头,多个用空格分割

FallbackHeaders

1/string

设置Fallback头

JsonToGrpc

请求体Json转为gRPC

LocalResponseCache

2/string

响应数据本地缓存

MapRequestHeader

2/string

把某个请求头名字变为另一个名字

ModifyRequestBody

仅 Java 代码方式

修改请求体

ModifyResponseBody

仅 Java 代码方式

修改响应体

PrefixPath

1/string

自动添加请求前缀路径

PreserveHostHeader

0

保护Host头

RedirectTo

3/string

重定向到指定位置

RemoveJsonAttributesResponseBody

1/string

移除响应体中的某些Json字段,多个用,分割

RemoveRequestHeader

1/string

移除请求头

RemoveRequestParameter

1/string

移除请求参数

RemoveResponseHeader

1/string

移除响应头

RequestHeaderSize

2/string

设置请求大小,超出则响应431状态码

RequestRateLimiter

1/string

请求限流

RewriteLocationResponseHeader

4/string

重写Location响应头

RewritePath

2/string

路径重写

RewriteRequestParameter

2/string

请求参数重写

RewriteResponseHeader

3/string

响应头重写

SaveSession

0

session保存,配合spring-session框架

SecureHeaders

0

安全头设置

SetPath

1/string

路径修改

SetRequestHeader

2/string

请求头修改

SetResponseHeader

2/string

响应头修改

SetStatus

1/int

设置响应状态码

StripPrefix

1/int

路径层级拆除

Retry

7/string

请求重试设置

RequestSize

1/string

请求大小限定

SetRequestHostHeader

1/string

设置Host请求头

TokenRelay

1/string

OAuth2的token转发

默认filter:

默认filter相当于就是给全部的网关都加上同上的过滤器

#默认fliter

default-filters:

- AddResponseHeader=X-Response-Default-Foo, Default-Bar

6、全局跨域

网关配置全局跨域:

spring:

cloud:

gateway:

globalcors:

cors-configurations:

'[/**]':

allowed-origin-patterns: '*'

allowed-methods: '*'

allowed-headers: '*'

posted on 2025-04-06 17:30  爱开发的小橙  阅读(9)  评论(0)    收藏  举报