Spring Cloud Gateway

一、网关使用场景

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调用配置等参数来优化异常场景下的特殊情况。

  • 24
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值