Spring Gateway 使用小记

微服务网关用Spring Gateway实现优点还是挺多的。使用Spring Reactor响应式编程,并发能力强。隶属Spring全家桶,能较好的集成各种其他组件,再结合Nacos等实现动态配置刷新,真香。

Predicate 和 Filter

简单的说:predicate用于对请求进行判断(断言),Filter用于对请求进行处理。

对于一般的转发请求操作,用Spring Gateway自带的 Predicate 和 Filter配合使用基本上就足够了。可以参考Spring gateway 官方文档
比如,假如我需要通过path和header做转发
当请求 http://${gateway-url}/some-api,我们希望将它转发到服务some-api上。可以直接这么配置:

      # 满足Path以some-api开头进行转发,stripPrefix的作用是转发后,将some-api这层路径去掉
      - id: some-api
        uri: http://some-api.com
        predicates:
        - Path=/some-api/**
        filters:
        - StripPrefix=1

在此基础上假如some-api有多个环境:生产、试运行、测试,我们希望通过header里传个值进行区分:

      # 同时满足Path以some-api开头,且 header中Env的值为trun才进行转发
      - id: some-api-withheader
        uri: http://some-api.com
        predicates:
        - Path=/some-api/**
        - Header=Env, trun
        filters:
        - StripPrefix=1

      # 满足Path以some-api开头进行转发
      - id: some-api
        uri: http://some-api.com
        predicates:
        - Path=/some-api/**
        filters:
        - StripPrefix=1

这里配置了两个转发规则。gateway会先判断some-api-withheader,不满足的情况下,才会走第二个。

自定义Filter

如果官方提供的规则不满足,可以自定义Filter。(这里提一下,Filter不仅是对url进行处理,也可以进行转发控制。)
比如:
1.需要解析Body,比如根据Body的某字段进行转发(或是需要修改body)
2.含有一定业务规则,比如需要判断用户白名单
3.转发策略比较复杂,比如有好几层的转发策略,先判断header的值,再根据权重分发
自定义Filter分为全局和非全局,具体的用法参考

Body读取

spring gateway 使用wubflux流式处理,Body数据流只能获取一次,如果直接读取流,会导致请求的body变为空。目前看方案是将读取结果缓存起来,并重写ServerHttpRequest的getBody方法,如下

/**
 * 这个过滤器解决body不能重复读的问题
 */
@Component
@Slf4j
public class CacheBodyGatewayFilterFactory extends AbstractGatewayFilterFactory implements Ordered{
   

    @Override
    public GatewayFilter apply(Object config) {
   
        return (exchange, chain) -> {
   
            

你可能感兴趣的:(java后端,Spring,spring,java,gateway)