网关是一种网络设备,用于连接两个或多个不同网络,将数据从一个网络转发到另一个网络。它充当了两个网络之间的桥梁,负责转发数据并处理来自不同网络的通信协议转换。
网关具备转发、路由和过滤数据的功能。它能够识别不同网络中的数据包,并根据其目的地址和源地址决定如何转发数据。同时,网关还可以实施网络安全策略,对进出的数据包进行检查和过滤,保护网络安全。
网关在互联网中起到重要作用,它连接了内部局域网和外部互联网,使得数据能够在不同网络之间传递和交换。
网关的主要作用有以下几个:
Spring Cloud Gateway 使用步骤如下
具体实现如下
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
dependency>
spring:
cloud:
gateway:
routes:
- id: userservice
uri: http://localhost:9090 # 路由
predicates: # 断言
- Path=/user/**
- Header=X-Header-Flag, \d+
- id: orderservice
uri: http://localhost:9091
predicates:
- Path=/order/**
server:
port: 10086
Spring Cloud Gateway(网关路由规则)中是允许设置多个 Path 的,只需要在 Path 中使用英文逗号"“隔开即可
如下所示:
gateway :
routes:
- id: userservice
uri: http://192.168.1.7:51627
predicates:
-Path=/user/**,/u/**
Spring Cloud Gateway 支持的断言类型目前有 12 种,包含以下这些:
spring:
cloud:
gateway:
routes:
-id: userservice
uri: http://192.168.1.7:51627
predicates:
-Before=2023-11-02T19:05:08.020+08:00[Asia/shanghai]
<!--注册中心--3
>
<groupId>com.alibaba.cloudgroupId><artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>dependency><dependency>
<groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-gatewayartifactId>dependency>
<dependency>
<groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-loadbalancerartifactId>dependency>
过滤器通常用于拦截、处理或修改数据流或事件流,在数据流中执行特定的操作或转换。
Spring Cloud Gateway 是一个基于 Spring WebFlux 的 API 网关,提供了路由和过滤器功能。过滤器在请求和响应的生命周期中起到重要作用。Spring Cloud Gateway 提供了三种类型的过滤器:内置过滤器、全局过滤器和自定义过滤器。
内置过滤器是 Spring Cloud Gateway 提供的预定义过滤器,常用于常见的网关功能,如鉴权、限流、重试等。
常见的内置过滤器有:
示例代码:
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: http://httpbin.org:80
filters:
- AddRequestHeader=X-Request-Example, ExampleValue
predicates:
- Path=/get
在这个示例中,AddRequestHeader
过滤器会在请求头中添加 X-Request-Example
头,值为 ExampleValue
。
全局过滤器是应用于所有路由的过滤器。它们通常用于跨所有路由的通用功能,如日志记录、监控等。
示例代码:
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.factory.rewrite.ModifyRequestBodyGatewayFilterFactory;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("Global Pre Filter executed");
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
System.out.println("Global Post Filter executed");
}));
}
@Override
public int getOrder() {
return -1; // Order of the filter
}
}
在这个示例中,CustomGlobalFilter
是一个全局过滤器,它会在每个请求前后打印日志。
自定义过滤器是用户根据具体需求编写的过滤器,可以应用于特定路由或全局。
示例代码:
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {
public CustomFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
System.out.println("Custom Pre Filter executed");
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
System.out.println("Custom Post Filter executed");
}));
};
}
public static class Config {
// Configuration properties for the filter
}
}
在这个示例中,CustomFilter
是一个自定义过滤器,它会在特定路由的请求前后打印日志。
spring:
cloud:
gateway:
routes:
- id: custom_filter_route
uri: http://httpbin.org:80
filters:
- name: CustomFilter
predicates:
- Path=/get
在这个配置中,CustomFilter
会应用于 /get
路径的请求。
通过这些过滤器,Spring Cloud Gateway 提供了灵活的请求和响应处理能力,满足各种网关需求。
SpringCloudGateway的工作原理可以概括为以下几个关键点:
核心组件:
路由机制:
过滤器机制:
动态路由:
性能与特性:
与Zuul的性能对比:
综上所述,SpringCloudGateway通过其核心组件(Filter、Route、Predicates和GatewayFilter)和路由、过滤器机制,以及动态路由等特性,为微服务架构提供了一种简单而有效的API路由管理方式,并具备高性能和丰富的功能。
1.典型回答
在微服务架构中,网关(Gateway)是一个提供统一访问地址的组件,它充当了客户端和内部微服务之间的中介,。
网关主要负责流量路由和转发,将外部请求引导到相应的微服务实例上,同时提供一些功能,如身份认证、授权、限流、监控、日志记录等。
网关有什么用?
网关的主要作用有以下几个:
执行流程如下
Spring Cloud Gateway的过滤器可以分为两类:全局过滤器和局部过滤器。
全局过滤器:全局过滤器对所有路由生效,可以用来实现一些全局的功能,比如鉴权、日志记录等。
局部过滤器:局部过滤器只对特定的路由生效,可以根据需要为不同的路由配置不同的过滤逻辑。
Spring Cloud Gateway的过滤器底层是基于Netty实现的。在Spring Cloud Gateway中,过滤器是通过实现GatewayFilter接口或者GlobalFilter接口来实现的。当请求经过Gateway时,会依次经过配置的过滤器链,每个过滤器可以对请求进行修改、校验、记录日志等操作,然后将请求传递给下一个过滤器或者目标服务。过滤器可以在请求前、请求后或者异常时执行相应的逻辑,从而实现对请求的处理和控制。