Spring Cloud 学习条记四:服务网关(Gateway)

打印 上一主题 下一主题

主题 511|帖子 511|积分 1533

在微服务架构中,随着服务数目的增长,客户端直接与服务举行通信的方式会变得越来越复杂。为了简化客户端与服务之间的交互,同时实现一些跨服务的通用功能(如认证、限流、监控等),Spring Cloud 引入了服务网关(Gateway)的概念。本篇文章将详细介绍Spring Cloud Gateway的基本概念、使用场景、核心组件以及如何设置和使用它。
一、Spring Cloud Gateway 概述

Spring Cloud Gateway 是基于 Spring Framework 5, Project Reactor 和 Spring WebFlux 的 API 网关,它为微服务架构提供了一种简朴而有用的方式来路由和过滤请求。Spring Cloud Gateway 不仅具备传统网关的功能,如路由转发、负载均衡等,还通过提供丰富的路由匹配和过滤功能,使得开发者可以轻松地实现复杂的路由逻辑和请求处置惩罚流程。
二、核心组件

1. Route(路由)

路由是 Gateway 的基本构建块,它定义了请求应该如何被转发到哪个服务。路由包含了一系列属性,如 ID、目标 URI、断言(Predicate)和过滤器(Filter)。
断言(Predicate):用于匹配来自客户端的请求。如果请求与断言相匹配,则路由到目标 URI。
过滤器(Filter):对请求和响应举行处置惩罚的逻辑,可以在请求被转发到目标服务之前或之后执行。
2. Predicate(断言)

Spring Cloud Gateway 提供了多种内置断言,用于匹配 HTTP 请求的不同属性,如路径、头信息、请求方法等。开发者也可以根据必要自定义断言。
3. Filter(过滤器)

过滤器可以在请求被路由前后对请求和响应举行加工处置惩罚。Spring Cloud Gateway 的过滤器分为 GatewayFilter 和 GlobalFilter 两种。GatewayFilter 是应用于单个路由的过滤器,而 GlobalFilter 则是应用于所有路由的过滤器。
三、使用场景

路由转发:将外部请求转发到内部微服务。
负载均衡:共同负载均衡器(如 Ribbon)实现请求的负载均衡。
认证授权:在请求到达目标服务之前举行身份验证和授权。
限流熔断:对请求举行限流,防止服务过载;在目标服务不可用时,提供熔断逻辑。
日记记录:记录请求和响应的详细信息,便于监控和故障排查。
四、设置示例
1. 添加依赖

在 Maven 的 pom.xml 文件中添加 Spring Cloud Gateway 的依赖:
  1. <dependency>  
  2.     <groupId>org.springframework.cloud</groupId>  
  3.     <artifactId>spring-cloud-starter-gateway</artifactId>  
  4. </dependency>
复制代码
2. 设置路由

在 application.yml 或 application.properties 中设置路由规则:
  1. spring:  
  2.   cloud:  
  3.     gateway:  
  4.       routes:  
  5.       - id: myroute  
  6.         uri: http://example.com  
  7.         predicates:  
  8.         - Path=/mypath/**  
  9.         filters:  
  10.         - StripPrefix=1
复制代码
上述设置定义了一个名为 myroute 的路由,它将所有以 /mypath/ 开头的请求转发到 http://example.com,并移除请求路径中的第一个路径段。
3. 自定义过滤器

可以通过实现 GlobalFilter 或 GatewayFilter 接口来创建自定义过滤器。
实现GlobalFilter

如果你想要创建一个全局过滤器,可以如许做:
  1. java
  2. import org.springframework.cloud.gateway.filter.GatewayFilterChain;  
  3. import org.springframework.cloud.gateway.filter.GlobalFilter;  
  4. import org.springframework.core.Ordered;  
  5. import org.springframework.stereotype.Component;  
  6. import org.springframework.web.server.ServerWebExchange;  
  7. import reactor.core.publisher.Mono;  
  8.   
  9. @Component  
  10. public class MyGlobalFilter implements GlobalFilter, Ordered {  
  11.   
  12.     @Override  
  13.     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {  
  14.         // 在请求被处理之前执行  
  15.         System.out.println("Before request is sent through the filter chain");  
  16.   
  17.         // 继续执行其他过滤器直到服务  
  18.         return chain.filter(exchange).then(Mono.fromRunnable(() -> {  
  19.             // 在响应返回给客户端之后执行  
  20.             System.out.println("After response is returned from the filter chain");  
  21.         }));  
  22.     }  
  23.   
  24.     @Override  
  25.     public int getOrder() {  
  26.         // 设置过滤器的执行顺序,数字越小,优先级越高  
  27.         return -1;  
  28.     }  
  29. }
复制代码
实现GatewayFilter

如果你想要为特定的路由创建过滤器,可以如许做:
  1. java
  2. import org.springframework.cloud.gateway.filter.GatewayFilter;  
  3. import org.springframework.cloud.gateway.filter.GatewayFilterChain;  
  4. import org.springframework.core.Ordered;  
  5. import org.springframework.web.server.ServerWebExchange;  
  6. import reactor.core.publisher.Mono;  
  7.   
  8. public class MyGatewayFilter implements GatewayFilter, Ordered {  
  9.   
  10.     @Override  
  11.     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {  
  12.         // 在请求被处理之前执行  
  13.         System.out.println("Before request is processed by MyGatewayFilter");  
  14.   
  15.         // 继续执行其他过滤器或服务  
  16.         return chain.filter(exchange).then(Mono.fromRunnable(() -> {  
  17.             // 在响应返回给客户端之后执行  
  18.             System.out.println("After response is processed by MyGatewayFilter");  
  19.         }));  
  20.     }  
  21.   
  22.     @Override  
  23.     public int getOrder() {  
  24.         // 设置过滤器的执行顺序  
  25.         return 0;  
  26.     }  
  27. }
复制代码
但是,对于GatewayFilter,你通常必要在路由设置中显式地引用它,而Spring Cloud Gateway并不直接支持将自定义的GatewayFilter实现作为Bean注入到路由设置中(至少在不使用额外代码或设置的情况下)。相反,你可以通过实现GatewayFilterFactory来创建可设置的过滤器工厂,然后在YAML或properties文件中设置这些过滤器。
实现GatewayFilterFactory

  1. java
  2. import org.springframework.cloud.gateway.filter.GatewayFilter;  
  3. import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;  
  4. import org.springframework.stereotype.Component;  
  5.   
  6. import java.util.function.Predicate;  
  7.   
  8. @Component  
  9. public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config> {  
  10.   
  11.     public MyGatewayFilterFactory() {  
  12.         super(Config.class);  
  13.     }  
  14.   
  15.     public static class Config {  
  16.         // 可以添加配置属性  
  17.     }  
  18.   
  19.     @Override  
  20.     public GatewayFilter apply(Config config) {  
  21.         return (exchange, chain) -> {  
  22.             // 过滤器逻辑  
  23.             System.out.println("Applying MyGatewayFilterFactory with config: " + config);  
  24.             return chain.filter(exchange);  
  25.         };  
  26.     }  
  27. }
复制代码
五、总结
Spring Cloud Gateway 提供了强大的路由和过滤功能,是微服务架构中不可或缺的一部门。通过合理使用 Spring Cloud Gateway,可以极大地简化客户端与微服务之间的交互,提高体系的可扩展性和可维护性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表