Spring Cloud Gateway初體驗


前段時間項目上打算使用gateway替換掉zuul1.0於是我簡單的體驗了一下。

gateway是什么:Spring Cloud Gateway是Spring官方基於Spring 5.0,Spring Boot 2.0和Project Reactor等技術開發的網關,Spring Cloud Gateway旨在為微服務架構提供一種簡單而有效的統一的API路由管理方式。這里需要注意一下gateway使用的netty+webflux實現,不要加入web依賴,需要加入webflux依賴。

gateway與zuul的區別的簡單比較:gateway使用的是異步請求,zuul是同步請求,gateway的數據封裝在ServerWebExchange里,zuul封裝在RequestContext里。

過濾器:gateway有兩種filter,一種是GlobalFilter一種是GatewayFilter,全局過濾器默認對所有路由有效,gatewayFilter需要進行指定。

spring:
  cloud:
    gateway:
    # 配置所有路由的默認過濾器 這里配置的是gatewayFilter
      default-filters:
      routes:
      - id: server-test  # 服務的id
        uri: lb://server-test #服務的application名稱
        order: 0 #路由級別
        predicates:
        - Path=/bus/**  #前綴
        filters:
        - StripPrefix=1 #去前綴 去幾層  

關於重寫數據:由於gateway是異步的最好不要對響應的body進行操作,如果需要操作的話需要重寫writeWith方法,簡單示例例如下(不能保證各個版本的准確性  亦可以采取訂閱body 緩存的方式獲取 此方法會導致重復執行):

ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(response) {
            @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 -> {
                            //在這邊需要對dataBuffer拿到字節數組進行操作

// 更新 這樣可能導致數據截斷 可以使用 DefaultDataBufferFactory的join方法聚合全部數據 return response.bufferFactory().wrap(nodeObject.getBytes()); })); } return super.writeWith(body); } }; return chain.filter(exchange.mutate().response(decoratedResponse).build();
}

 只是簡單的分享,后續有時間會盡量分享更多的細節...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM