前段時間項目上打算使用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();
}
只是簡單的分享,后續有時間會盡量分享更多的細節...