一、网关使用场景
Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关(1.0不再维护了,2.0不再集成);连接不同网络或协议,充当信息传递和协议转换的中介;
大白话讲就是,用于请求转发、流量控制、访问控制、服务适配、验签等功能;一般在微服务架构中充当内部服务的最后一层 “防火墙”;
二、网关基础使用
一般都多种路由工厂,例如:Before、After、Between、Cookie、Header、Host、Path等谓词工厂;他们相对比较简单,主要介绍一下常用的方式Path方式:
spring:
main:
application:
name: gateWayA
cloud:
gateway:
routes:
- id: test
uri: http://serviceA:8089
order: 1
filters:
- StripPrefix=2
predicates:
- name: Path
args:
_genkey_0: /v1/test/getOne
以上是最简单的一种gateway配置,可以满足基础网关转发功能,如果想要做一些验签、解密功能,可以直接增加filter,通过拦截器处理,如下
@Slf4j
@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String path = request.getURI().getPath();
//无需登录
boolean exist = FilterUtils.isContains(filtersConfig.getNoLoginPath(), path);
if (exist) {
return chain.filter(exchange);
}
// 添加请求头
String[] userIdStr = {String.valueOf(userCache.getUserId())};
String[] userStr = {JsonUtils.objToJson(userCache)};
ServerHttpRequest build = request.mutate().header(HEADER_NAME_USER_ID, userIdStr).header("user", userStr).build();
return chain.filter(exchange.mutate().request(build).build());
}
@Override
public int getOrder() {
return -101;
}
三、网关高级配置
下面介绍一些高级功能,不知道大家项目中有没有遇到服务假死,服务超时等问题 ;我先简单分析一下服务假死问题,首先gateway底层其实就是通过Netty的方式实现的,它是一个同步非阻塞服务,如果在网关发送请求到业务站点时,业务站点重启,或者出现异常,就会导致网关无响应,当有其他请求进来时,线程池中的线程都被占用,无可用线程,所以就会出现,服务假死问题;通过以下配置可以解决这些问题:
spring:
cloud:
gateway:
httpclient:
connect-timeout: 2000
response-timeout: PT30S
pool:
type: fixed
max-connections: 500
max-idle-time: 10000
acquire-timeout: 10000
eviction-interval: PT30S
predicate:
weight:
enabled: false
HTTP 客户端配置 (
httpclient
)
connect-timeout: 设置与目标服务器建立连接的超时时间(毫秒)。此处设置为2000毫秒(2秒)。
response-timeout: 设置从目标服务器接收响应的超时时间。格式为ISO-8601时间跨度(PT30S表示30秒)。
连接池配置 (
pool
)
type: 指定连接池的类型,此处为
fixed
,表示使用固定大小的连接池。max-connections: 设置连接池中最大连接数,此处为500个连接。
max-idle-time: 设置连接在连接池中保持空闲状态的最大时间(毫秒)。此处为10000毫秒(10秒)。
acquire-timeout: 设置获取连接的超时时间(毫秒)。此处为10000毫秒(10秒)。
eviction-interval: 设置清除空闲连接的时间间隔。格式为ISO-8601时间跨度(PT30S表示30秒)。
谓词配置 (
predicate
)
weight:
enabled: 启用或禁用基于权重的路由选择。此处设置为
false
,表示禁用。
以上配置可以根据自己项目量级来配置;除此之外如果gateway中包含feign远程调用,还需要配置熔断、feign调用配置等参数来优化异常场景下的特殊情况。