SprigCloud(六)Gatewayゲートウェイ


目次
 
一.Gatewayゲートウェイの説明
1.Gateway配置
2.Gatewayブロック
一.Gatewayゲートウェイの説明
スプリング-cloud-Gatewayはスプリング-cloudのサブプロジェクトです.zulはnetflix社のプロジェクトで、springがspring-cloudに集めて使うだけです.もう一つの説はzul 2の連続ジャンプ券とzull 1の性能表現があまり理想的ではないので、spring孵化Gatewayプロジェクトが生まれたということです.総じて言えば、gatewayはzulよりも性能が優れています.
1.Gateway配置
まず、pom.xmlファイルに依存をインポートします.

    org.springframework.cloud
    spring-cloud-starter-gateway
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を無視して、他の経路でStrip=Prefix転送します.
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 filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //     
        ServerHttpResponse originalResponse = exchange.getResponse();
        DataBufferFactory bufferFactory = originalResponse.bufferFactory();
        ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
            @Override
            public Mono 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 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());
    }
}