1.spring cloud gateway 搭建
需要特别注意的两点:
spring cloud gateway是 基于SpringBoot2.x、SpringWebFlux和ProjectReactor构建。
Spring Cloud Gateway需要Spring Boot和Spring Webflux提供的Netty运行时。它在传统的Servlet容器中或作为WAR构建时不起作用。

1.1 gateway前置知识
a. gateway网关的工作流程如下图:

客户端向SpringCloudGateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。此处理程序通过特定于请求的筛选器链运行请求。过滤器被虚线分隔的原因是,过滤器可以在发送代理请求之前和之后运行逻辑。执行所有“预”过滤器逻辑。然后发出代理请求。发出代理请求后,运行“后”过滤器逻辑。
1.2 pom依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
</dependencies>
1.3 yaml 配置
server:
port: 17001
spring:
cloud:
gateway:
routes:
- id: after_route
uri: http://localhost:9001/gateway
predicates:
- Path=/gateway/**
- Method=POST
- id: proxy_route
uri: http://localhost:7001
predicates:
- Path=/test/**
1.4 测试

2. 集成nacos实现动态配置
2.1 下载nacos,启动部署,参考官网


关于配置文件的必要知识点

2.2 pom依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-config</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
2.3 新建bootstrap 文件(格式可以是properties、yaml)
spring:
application:
# 应用的名称建议设置,因为涉及到nacos配置文件的命名
name: api-gateway
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
profiles:
active: dev

2.4 在服务启动类上增加 配置自动刷新注解

3. 集成sentinel 实现限流熔断
3.1 sentinel介绍;主要实现服务的限流、熔断功能
工作流程详解,自行打开官网了解
3.2 pom依赖
<!-- 引入sentinel进行服务降级熔断 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<!-- gateway网关整合sentinel进行限流降级 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
3.3 yaml配置
spring:
cloud:
sentinel:
eager: true
transport:
port: 8719
dashboard: localhost:8700
scg:
fallback:
mode: response
response-status: 426
response-body: '{"code":1001,"msg":"请求过于频繁,请稍后重试","data":""}'
3.4 注入异常处理类ExceptionHandler和过滤器Filter
import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter;
import com.alibaba.csp.sentinel.adapter.gateway.sc.exception.SentinelGatewayBlockExceptionHandler;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.reactive.result.view.ViewResolver;
import java.util.Collections;
import java.util.List;
@Configuration
public class GatewayConfiguration {
private final List<ViewResolver> viewResolvers;
private final ServerCodecConfigurer serverCodecConfigurer;
public GatewayConfiguration(ObjectProvider<List<ViewResolver>> viewResolversProvider,
ServerCodecConfigurer serverCodecConfigurer) {
this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
this.serverCodecConfigurer = serverCodecConfigurer;
}
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
// Register the block exception handler for Spring Cloud Gateway.
return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
}
@Bean(name = {"customer-sentinelGatewayFilter"})
@Order(-1)
public GlobalFilter sentinelGatewayFilter() {
return new SentinelGatewayFilter();
}
}
若低版本未成功,可尝试在启动时增加参数: -Dcsp.sentinel.app.type=1
3.5 下载启动sentinel控制台dashboard
此例子,仅适合学习测试阶段,因为在dashboard设置的所有规则皆存在内存中,并未进行持久化。
用于生产环境,必须实现规则的持久化,持久化请看官网资料


3.6 限流测试





3.7 熔断测试





通过jmeter触发一定并发数量的慢请求后,再发起请求即可触发

以上笔记,仅适合入门学习,不可直接在生产环境使用。
需进行sentinel的规则持久化以及相关权限限制、鉴权等,方可应用至生产环境。