SpringCloud(六)Gateway网关

目录

 

一.Gateway网关说明

1.Gateway配置

2.Gateway拦截器


一.Gateway网关说明

spring-cloud-Gateway是spring-cloud的一个子项目。而zuul则是netflix公司的项目,只是spring将zuul集成在spring-cloud中使用而已。
还有一种说法是因为zuul2连续跳票和zuul1的性能表现不是很理想,所以催生了spring孵化Gateway项目。
总的来说,gateway性能大大强于zuul。

1.Gateway配置

首先在pom.xml文件中导入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
server:
  port: 8999
spring:
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: feign-customer
        #lb://feign-customer
          uri: lb://feign-customer
          order: 0
          predicates:
            - Path=/foo/**
          filters:
            - StripPrefix=1
logging:
  level:
    org.springframework.cloud.gateway: debug

表示注册中心生效,我们可以通过注册中心的服务名进行路由转发
discovery.locator.enabled=true;
表示路由ID
- id: feign-customer
指向注册中心的服务。lb://服务ID或者http://localhost:8080完整的url
uri: lb://feign-customer
表示要进行的断言
predicates:
表示path地址,根据url,以foo开头的会被转发到feign-customer服务,可以使用通配符地址
- Path= /foo/**
过滤器
filters:
从前面截取一个,忽略第一个/foo,其他路径进行转发
- StripPrefix= 1

2.Gateway拦截器

/**
 * @Author wangyu
 * @Description: Copyright  2019 yiYuan Networks 上海义援网络科技有限公司. All rights reserved.
 * @Date 2019/5/16
 */
@Component
public class WrapperResponseFilter implements GlobalFilter, Ordered {
    @Override
    public int getOrder() {
        // -1 is response write filter, must be called before that
        return -2;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //前置拦截器
        ServerHttpResponse originalResponse = exchange.getResponse();
        DataBufferFactory bufferFactory = originalResponse.bufferFactory();
        ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
            @Override
            public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
                //后置拦截器
                if (body instanceof Flux) {
                    Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body;
                    return super.writeWith(fluxBody.map(dataBuffer -> {
                        // probably should reuse buffers
                        byte[] content = new byte[dataBuffer.readableByteCount()];
                        dataBuffer.read(content);
                        // 释放掉内存
                        DataBufferUtils.release(dataBuffer);
                        String rs = new String(content, Charset.forName("UTF-8"));
                        Map<String,Object> response = new HashMap<>();
                        response.put("code","1");
                        response.put("message","请求成功");
                        response.put("data",rs);
//                        byte[] newRs = JSON.toJSONString(response).getBytes(Charset.forName("UTF-8"));
//                        originalResponse.getHeaders().setContentLength(newRs.length);//如果不重新设置长度则收不到消息。
                        //请求的返回结果
                        return bufferFactory.wrap(rs.getBytes());
                    }));
                }
                return super.writeWith(body);
            }
        };
        return chain.filter(exchange.mutate().response(decoratedResponse).build());
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值