SpringCloud Gateway 基本使用

目录

⼀、⽹关介绍

1.1 微服务拆分之后遇到的问题?

1.2 什么是API⽹关?

1.3 ⽹关可以⼲什么?

1.4 常⽤的⽹关

⼆、使⽤Nginx实现⽹关服务

三、使⽤Gateway实现⽹关服务

3.1 搭建gateway服务器

3.2 配置路由规则

四、Gateway⼯作原理

4.1 名词解释

4.2 Gateway⼯作流程图

五、Predicate断⾔

5.1 Path

5.2 Query

5.3 Header

六、过滤器

6.1 Gateway内置⽹关过滤器

6.2 ⾃定义服务过滤器

6.2.1 创建⽹关过滤器 - 实现GatewayFilter

6.2.2 创建⽹关过滤器 - 继承AbstractNameValueGatewayFilterFactory

6.3 全局过滤器

七、Gateway动态路由配置

7.1 Gateway服务器添加eureka-server依赖

7.2 配置⽹关路由

⼋、⽹关限流

8.1 ⽹关限流介绍

8.2 ⽹关限流的常⻅算法

8.2.1 计数器算法

8.2.2 漏桶算法

8.2.3 令牌桶算法

8.3 Gateway⽹关限流

8.3.1 添加依赖

8.3.2 配置keyResolver

8.3.3 配置服务的限流规则


⼀、⽹关介绍

1.1 微服务拆分之后遇到的问题?

当我们对商城进⾏微服务拆分之后,不同的接⼝是由不同的服务提供的,不同的服
务部署在不同的服务器上,因此前端进⾏接⼝调⽤的时候访问不同的接⼝会请求不同的
ip port ,如果将接⼝服务的访问地址在前端代码中固定写死:
  • 前端需要记录很多服务器地址列表
  • 当服务被迁移到不同的服务器上的时候,就必须修改前端代码才能继续访问
  • 当对服务进⾏集群部署的时候,没有办法实现负载均衡

1.2 什么是API⽹关?

使⽤服务⽹关作为接⼝服务的统⼀代理,前端通过⽹关完成服务的统⼀调⽤

1.3 ⽹关可以⼲什么?

  • 路由:接⼝服务的统⼀代理,实现前端对接⼝服务的统⼀访问
  • 过滤:对⽤户请求进⾏拦截、过滤(⽤户鉴权)、监控
  • 限流:限制⽤户的访问流量

1.4 常⽤的⽹关

  • Nginx
  • Spring Cloud Netflix zuul
  • Spring Cloud Gateway

⼆、使⽤Nginx实现⽹关服务

Nginx 通常被⽤作应⽤服务器⽹关,服务⽹关通常使⽤ zuul 或者 gateway

三、使⽤Gateway实现⽹关服务

netflix zuul 使⽤⽂档
链接: http://note.youdao.com/noteshare?id=b53758f34f40cb67357ee8ec13d37afd

3.1 搭建gateway服务器

  • 创建SpringBoot应⽤,添加gateway依赖

3.2 配置路由规则

application.yml
server :
port : 9999
spring :
application :
name : gateway-server
cloud :
gateway :
routes :
# 配置 api-service1 路由规则
- id : api-service1
uri : http : //localhost : 8001
predicates :
- Path=/product/**
# 配置 api-service2 路由规则
- id : api-service2
uri : http : //localhost : 8002
predicates :
- Path=/order/**

四、Gateway⼯作原理

4.1 名词解释

Route : 路由是⽹关的基本组成部分,它是由 id 、⽬标 uri 、断⾔组成,如果断⾔为 true ,则
匹配该路由,转向到当前路由的 URI
Predicate :断⾔,⽤户请求的匹配规则
Filter :过滤器,⽤于对请求进⾏前置、后置处理(可以在⽹关实现对请求或相应的加⼯处
理)

4.2 Gateway⼯作流程图

五、Predicate断⾔

SpringCloud Gateway 提供了多种断⾔匹配的⽅式:
  • After
  • Before
  • Between
  • Cookie
  • Header
  • Host
  • Method
  • Path
  • Query
  • RemoteAddr
  • Weight

5.1 Path

根据请求路径的正则匹配
spring :
application :
name : gateway-server
cloud :
gateway :
routes :
- id : aaa
uri : http : //localhost : 8001
predicates :
- Path=/product/**
- id : bbb
uri : http : //localhost : 8002
predicates :
- Path=/order/**

5.2 Query

根据请求携带的参数匹配路由
spring :
application :
name : gateway-server
cloud :
gateway :
routes :
- id : aaa
uri : http : //localhost : 8001
predicates :
# 如果请求 url 中带有 name 参数 ---> http://localhost:8001
- Query=name
- id : bbb
uri : http : //localhost : 8002
predicates :
# 如果请求 url 中带有 pwd 参数 ---> http://localhost:8002
- Query=pwd

5.3 Header

根据 Header 中携带的参数匹配
spring :
application :
name : gateway-server
cloud :
gateway :
routes :
- id : aaa
uri : http : //localhost : 8001
predicates :
- Header=token
- id : bbb
uri : http : //localhost : 8002
predicates :
- Header=aa,haha

六、过滤器

6.1 Gateway内置⽹关过滤器

gateway ⽹关可以对⽤户的请求和响应进⾏处理, gateway 提供了多个内置的过滤器,
不同的过滤器可以完成不同的请求或者响应的处理
1. AddRequestHeader 在请求头中添加参数
2. AddRequestParameter 添加请求参数
3. AddResponseHeader
4. 6.4. The DedupeResponseHeader GatewayFilter Factory
5. 6.5. The Hystrix GatewayFilter Factory
6. 6.6. Spring Cloud CircuitBreaker GatewayFilter Factory
7. 6.7. The FallbackHeaders GatewayFilter Factory
8. 6.8. The MapRequestHeader GatewayFilter Factory
9. 6.9. The PrefixPath GatewayFilter Factory
10. 6.10. The PreserveHostHeader GatewayFilter Factory
11. 6.11. The RequestRateLimiter GatewayFilter Factory
12. 6.12. The RedirectTo GatewayFilter Factory
13. 6.13. The RemoveRequestHeader GatewayFilter Factory
14. 6.14. RemoveResponseHeader GatewayFilter Factory
15. 6.15. The RemoveRequestParameter GatewayFilter Factory
16. 6.16. The RewritePath GatewayFilter Factory
17. 6.17. RewriteLocationResponseHeader GatewayFilter Factory
18. 6.18. The RewriteResponseHeader GatewayFilter Factory
19. 6.19. The SaveSession GatewayFilter Factory
20. 6.20. The SecureHeaders GatewayFilter Factory
21. 6.21. The SetPath GatewayFilter Factory
22. 6.22. The SetRequestHeader GatewayFilter Factory
23. 6.23. The SetResponseHeader GatewayFilter Factory
24. 6.24. The SetStatus GatewayFilter Factory
25. 6.25. The StripPrefix GatewayFilter Factory
26. 6.26. The Retry GatewayFilter Factory
27. 6.27. The RequestSize GatewayFilter Factory
28. 6.28. The SetRequestHostHeader GatewayFilter Factory
29. 6.29. Modify a Request Body GatewayFilter Factory
30. 6.30. Modify a Response Body GatewayFilter Factory
31. 6.31. Default Filters
spring :
application :
name : gateway-server
cloud :
gateway :
routes :
- id : aaa
uri : http : //localhost : 8001
predicates :
- Path=/red/aaa/product/**
filters :
- AddRequestHeader=token,wahahaawahaha
- AddRequestParameter=username, ergou
- SetStatus=404
# - RewritePath=/red(?<segment>/?.*), $\{segment}
- StripPrefix=2

6.2 ⾃定义服务过滤器

6.2.1 创建⽹关过滤器 - 实现GatewayFilter

  • 实现GatewayFilter, Ordered
public class MyFilter01 implements GatewayFilter, Ordered {
 @Override
 public Mono<Void> filter(ServerWebExchange exchange,
GatewayFilterChain chain) {
 ServerHttpRequest request = exchange.getRequest();
 ServerHttpResponse response = exchange.getResponse();
 System.out.println("---------------⾃定义过滤器");
 return chain.filter(exchange);
 }
 @Override
 public int getOrder() {
 return 0;
 }
}
  • 配置过滤器
public class MyFilter01 implements GatewayFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange,
GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
System.out.println("---------------⾃定义过滤器");
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}

6.2.2 创建⽹关过滤器 - 继承AbstractNameValueGatewayFilterFactory

相当于扩展 Gateway 内置的⽹关过滤器
/**
* 创建⼀个类继承AbstractNameValueGatewayFilterFactory,类名必须以
GatewayFilterFactory结尾,类名前⾯的部分即为当前⾃定义⽹关过滤器的 名字
* 添加@Component注解,注册到Spring容器
*/
@Component
public class MyFilterGatewayFilterFactory extends
AbstractNameValueGatewayFilterFactory {
 @Override
 public GatewayFilter apply(NameValueConfig config) {
 System.out.println("name:"+config.getName());
 System.out.println("value:"+config.getValue());
 //创建⾃定义⽹关过滤器并返回
 GatewayFilter gatewayFilter = new GatewayFilter() {
 @Override
 public Mono<Void> filter(ServerWebExchange exchange,
GatewayFilterChain chain) {
 System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~⾃
定义⽹关过滤器");
 return chain.filter(exchange);
 }
 };
 return gatewayFilter;
 }
}

配置:

spring :
application :
name : gateway-server
cloud :
gateway :
routes :
- id : bbb
uri : http : //localhost : 8002
predicates :
- Path=/order/**
filters :
- MyFilter=aa,bb

6.3 全局过滤器

上述我们讲到的过滤器,都是配置在某个路由 / 服务中,我们称之为 ⽹关服务过滤器
Gateway 提供了内置的全局过滤器,会拦截过滤所有到达⽹关服务器的请求。
内置的全局过滤器默认⽣效,⽆需开发者⼲预。
根据业务的需求我们也可以⾃定义全局过滤器以实现对所有⽹关请求的拦截和处理。
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
 @Override
 public Mono<Void> filter(ServerWebExchange exchange,
GatewayFilterChain chain) {
 
 System.out.println("-------------------------------------------
---MyGlobalFilter");
 List<String> list =
exchange.getRequest().getHeaders().get("token");
 if (list != null && list.size()>0){
 String token = list.get(0);
 System.out.println("token:"+token);
 return chain.filter(exchange);
 }else{
 //如果没有token,或者token过期
 ServerHttpResponse response = exchange.getResponse();
 //设置响应头
 response.getHeaders().add("ContentType","application/json;charset=utf-8");
 //设置状态码
 response.setStatusCode(HttpStatus.UNAUTHORIZED);
 // 封装响应数据
 String str = "";
 DataBuffer dataBuffer =
response.bufferFactory().wrap(str.getBytes());
 return response.writeWith(Mono.just(dataBuffer));
 }
 }
 @Override
 public int getOrder() {
 return 0;
 }
}

七、Gateway动态路由配置

如果在 Gateway ⽹关的路由配置中,直接将服务的 ip port 配置进去,将导致:
1. 如果服务的地址变更,必须要重新配置 gateway 的路由规则
2. 如果服务采⽤集群部署,则不能实现负载均衡
Gateway 动态路由

7.1 Gateway服务器添加eureka-server依赖

<dependency>
<groupId> org.springframework.cloud </groupId>
<artifactId> spring-cloud-starter-netflix-eureka-server </artifactId>
</dependency>

7.2 配置⽹关路由

server :
port : 9999
spring :
application :
name : gateway-server
main :
web-application-type : reactive
cloud :
gateway :
routes :
- id : aaa
uri : lb : //api-service1
predicates :
- Path=/product/**
- id : bbb
uri : lb : //api-service2
predicates :
- Path=/order/**
eureka :
client :
service-url :
defaultZone : http : //localhost : 8761/eureka

⼋、⽹关限流

8.1 ⽹关限流介绍

服务的统⼀访问
使⽤过滤器实现鉴权
使⽤⽹关实现限流:通过限制⽤户的请求进⼊到服务中,有效控制应⽤系统的 QPS ,达
到保护系统的⽬的
在互联⽹应⽤的⽣产环境中,可以由于⽤户增⻓超过预期、竞争对⼿恶意请求等外界的
原因都有可能导致服务器⽆法处理超预期的⾼并发请求导致服务器宕机。

8.2 ⽹关限流的常⻅算法

8.2.1 计数器算法

就是通过记录在单位时间请求的数量,在这个时间周期内达到设置定值之后就拒绝后续请求
的进⼊。
缺点:如果⽤户请求频率不均匀,有导致短时间、⾼并发的⻛险

8.2.2 漏桶算法

就是通过控制 漏桶 流出的速率以限制到达服务的⽤户流量
缺点:⽹关会承载⽐较⼤的压⼒

8.2.3 令牌桶算法

就是所有进⼊⽹关的请求必须从令牌桶中得到令牌才可以进⾏服务调⽤,我们可以通过控制
令牌桶的容量、令牌的产⽣速率达到控制⽤户流量的⽬的。

8.3 Gateway⽹关限流

Gateway 是基于令牌桶算法,使⽤ redis 作为 结合顾虑器实现了⽹关限流

8.3.1 添加依赖

<dependency>
<groupId> org.springframework.boot </groupId>
<artifactId> spring-boot-starter-data-redis-reactive </artifactId>
</dependency>
<dependency>
<groupId> org.apache.commons </groupId>
<artifactId> commons-pool2 </artifactId>
<version> 2.9.0 </version>
</dependency>

8.3.2 配置keyResolver

@Configuration
public class AppConfig {
@Bean
public KeyResolver keyResolver () {
//http://localhost:9999/order/query?user=1
// 使⽤请求中的 user 参数的值作为令牌桶的 key
//return exchange -
>Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
return exchange ->
Mono . just ( exchange . getRequest (). getURI (). getPath ());
}
}

8.3.3 配置服务的限流规则

server :
port : 9999
spring :
application :
name : gateway-server
main :
web-application-type : reactive
cloud :
gateway :
routes :
- id : aaa
uri : lb : //api-service1
predicates :
- Path=/product/**
- id : bbb
uri : lb : //api-service2
predicates :
- Path=/order/**
filters :
- name : RequestRateLimiter
args :
redis-rate-limiter.replenishRate : 1 # 令牌桶每 s 的填充速度
redis-rate-limiter.burstCapacity : 2 # 令牌桶容量
redis-rate-limiter.requestedTokens : 1
key-resolver : "#{@keyResolver}"
redis :
host : 47.96.11.185
port : 7001
password : qfedu123
database : 0
lettuce :
pool :
max-active : 10
max-wait : 1000
max-idle : 5
min-idle : 3
eureka :
client :
service-url :
defaultZone : http : //localhost : 8761/eureka
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Gateway是一个基于Spring Cloud的全新项目,旨在为微服务架构提供一种简单有效的统一的API路由管理方式。它是基于Spring 5.0、Spring Boot 2.0和Project Reactor等技术开发的网关。\[1\]\[2\]Spring Cloud Gateway通过Spring WebFlux的HandlerMapping来匹配和转发路由,并内置了许多Predicates工厂,这些工厂可以通过不同的HTTP请求参数来进行匹配,也可以组合使用多个Predicates工厂。\[3\]Spring Cloud Gateway不仅提供了统一的路由方式,还提供了基于Filter链的网关基本功能,如安全、监控/埋点和限流等。它采用了响应式开发模式,并且旨在替代Netflix的Zuul。 #### 引用[.reference_title] - *1* [Spring Cloud Gateway网关](https://blog.csdn.net/m0_60413225/article/details/122958724)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Springcloud gateway (史上最全)](https://blog.csdn.net/crazymakercircle/article/details/125057567)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值