网关是一种充当转换重任的计算机系统或设备,使用在不同的通信协议、数据格式或语言,甚至网关是一种充当转换重任的计算机系统或设备,使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间进行数据传输.
网关具备转发, 路由和数据过滤的功能, 它能够识别不同网络中的数据包, 并根据器目的地址和源地址决定如何转发数据. 同时, 网关还可以实施网络安全策略, 对进出的数据包进行检查和过滤, 保护网络安全.
网关在互联网中起到重要作用, 它连接了内部局域网好外部互联网, 使得数据能够在不同网络之间传递和交换.
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
dependency>
注意: Spring Cloud GateWay 底层是基于响应式 Reactor Web 实现的已经包含了 Web 所以这两个依赖同时引入就会报错
server:
port: 10086
spring:
cloud:
gateway:
routes:
- id: user-service
uri: http://localhost:9090
predicates:
- Path=/user/**, /userlog/**
# 匹配多个路径时可以用英文逗号隔开
- id: order-service
uri: http://localhost:9091
predicates:
- Path=/order/**
Spring Cloud GateWay 目前支持 12 种断言类型
过滤器主要有以下几个功能:
内置过滤器分为局部过滤器和全局过滤器
局部过滤器和全局过滤器用法相同只是一个只适用于当前匹配的服务一个适用于全局
gateway:
routes:
- id: user-service
uri: lb://user-service-demo
predicates:
- Path=/user/**
filters: # 局部过滤器
- AddResponseHeader=My-Resp-Header,javacn
- id : order-service
uri: lb://order-service-demo
predicates:
- Path=/order/**
default-filters: # 全局过滤器
- AddResponseHeader=My-Resp-Header2,javacn2
- AddRequestHeader=My-Req, javacn
GateWay中也可以和OpenFeign一样配置重试机制
spring:
application:
name: gateway-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
username: nacos
password: nacos
register-enabled: false
gateway:
routes:
- id: user-service
uri: lb://user-service-demo
predicates:
- Path=/user/**
filters:
- AddResponseHeader=My-Resp-Header,javacn
- name: Retry
args:
retries: 3 # 重试次数
statuses: GATEWAY_TIMEOUT # 重试的 HTTP 状态代码=504
methods: GET # 重试的 HTTP 方法
series: SERVER_ERROR # 重试状态码段 5xx 状态
backoff: # 重试指数配置策略
firstBackoff: 10ms # 第一次重试间隔
maxBackoff: 50ms # 最大重试间隔
factor: 2 # firstBackoff * (factor ^ n)
basedOnPreviousValue: false # 基于上次值
注意: name必须是Retry, 否则识别不了
Spring Cloud GateWay 中也提供了自定义全局过滤器, 我们可以通过它来实现统一认证授权等功能
package com.example.gatewayservice.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 获取request对象
ServerHttpRequest request = exchange.getRequest();
// 获取response对象
ServerHttpResponse response = exchange.getResponse();
// 获取参数
String username = request.getQueryParams().getFirst("username");
String password = request.getQueryParams().getFirst("password");
if (username != null && username.equals("admin") && password != null && password.equals("admin")) {
return chain.filter(exchange);
}else {
// 设置无权限 401
response.setStatusCode(HttpStatus.UNAUTHORIZED);
// 执行完成不在往下执行
return response.setComplete();
}
}
@Override
public int getOrder() {
// 值越小越早执行
return 1;
}
}