1.起步
在项目的 pom.xml 文件中添加 Spring Cloud Gateway ,sentinel,nacos的依赖:
建议直接使用一些开源项目的环境配置 既有不冲突的环境,又有现成的一些配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- SpringCloud Alibaba Sentinel Gateway -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<!-- Sentinel Datasource Nacos -->
<!-- 持久化-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.网关配置
2.1 配置文件--转发url
在 application.yml 或 application.properties 文件中,您可以定义路由规则。例如,以下是一个简单的路由配置:
spring:
cloud:
gateway:
routes:
- id: api_route # 自定义 保证唯一
uri: http://localhost:8123 # 指定端口
predicates:
- Path=/api/** # 匹配规则
例如localhost:8080/api/home会转发到 localhost:8123/api/home
在springboot配置文件中,设置 前缀
server:
port: 8123
servlet:
context-path: /api
2.2使用内置拦截器--配置文件
在配置文件中设置请求头,添加响应头
default-filters:
- AddResponseHeader=requ, name
filters:
- AddRequestHeader=xxx, yyy
- AddRequestParameter=xxx, yyy
配置熔断器 #指定名称
- name: CircuitBreaker
args:
name: myCircuitBreaker
# forward标识一个内部转发 访问一个内部的服务
fallbackUri: forward:/fallback
forward是服务器内部转发
- 避免额外的HTTP请求: 当使用
forward:时,请求不会离开应用程序的上下文,因此不会产生额外的HTTP请求。这与重定向不同,重定向会使得客户端(通常是浏览器)向服务器发送一个新的HTTP请求。 - 保留请求状态: 由于请求是在服务器内部转发,因此原始请求的HTTP状态(如请求参数、请求头、会话属性等)都会被保留。这允许目标控制器或视图访问原始请求的所有信息。
2.3 自定义全局拦截器
所有路由都会经过全局拦截器
@Component//继承父类
public class AuthFilter implements GlobalFilter, Ordered
@Override//实现方法
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
//继续执行过滤链->此过滤链的终止
return chain.filter(mutableExchange);
2.4自定义拦截器基础
实现缓存/黑白名单/验证码校验 这些基本功能
继承这个对象AbstractGatewayFilterFactory
这个泛型是配置属性 举例:
public class CacheRequestFilter extends AbstractGatewayFilterFactory<CacheRequestFilter.Config> {
public CacheRequestFilter() {
super(CacheRequestFilter.Config.class);
}
public static class Config {
// 定义配置属性,如:
private boolean enabled;
private int timeout;
// 构造函数、getter和setter
}
@Override
//会传入config的值(在配置文件中配置)
public GatewayFilter apply(Config config) {
// 使用config对象中的参数来配置过滤器
return (exchange, chain) -> {
// 过滤器逻辑
};
}
}
在配置文件中,通过name和args添加过滤器,其中args指定参数
spring:
cloud:
gateway:
routes:
- id: api_route # 客户端访问
uri: http://localhost:8123
predicates:
- Path=/api/**
filters:
- name: CacheRequestFilter
args:
enabled: true
timeout: 3000
# 其他数据类型数组
list: ["a","b"] # 可白名单的配置
2.5 通用控制器的拦截:
案例:验证码的生成->放在网关中生成
当网文网关 端口/code,返回数据
@Component
public class ValidateCodeHandler implements HandlerFunction<ServerResponse>
@Configuration
public class RouterFunctionConfiguration
{
@Autowired
private ValidateCodeHandler validateCodeHandler;
@SuppressWarnings("rawtypes")
@Bean
public RouterFunction routerFunction()
{
return RouterFunctions.route(
RequestPredicates.GET("/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
validateCodeHandler);
// RequestPredicate predicate, HandlerFunction<T> handlerFunction 两个参数
}
}
3.sentinel整合gateway
3.1 sentinel的的基本介绍
3.2.1 限流
sentinel有两种基本的限流:url限流和资源限流(注解@sentinelResource) 可以重写降级策略 配置类 初始化 WebCallbackManager上添加自定义bean url限流:实现urlBlockhanlder
资源限流: 注解中指定blockHanderClass,和blockHander(静态方法)
3.2.2黑白名单
配置类 WebCallbackManager.setRequestOriginParser()
3.2.3 热点限流,系统规则自适应限流
根据参数限流(不支持url限流方式)
gateway整合sentinel
添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
自定义降级处理
@Configuration
public class GatewayConfig
{
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public SentinelFallbackHandler sentinelGatewayExceptionHandler()
{
return new SentinelFallbackHandler();(实现WebExceptionHandler
)
}
}
4.webflux的基本api
[Spring WebFlux 原理与适用场景 (chinalhr.github.io)](https://chinalhr.github.io/post/spring-webflux-principle/)