目錄:Spring Cloud Alibaba 教程
上一篇:9.Spring Cloud Alibaba 路由網(wǎng)關(guān)(Gateway)
下一篇:11. Spring Cloud Alibaba 服務(wù)配置
概述
全局過濾器作用于所有的路由闪朱,不需要單獨(dú)配置粘优,我們可以用它來實(shí)現(xiàn)很多統(tǒng)一化處理的業(yè)務(wù)需求,比如權(quán)限認(rèn)證钞瀑,IP 訪問限制等等毕箍。
注意:截止2019年06月,Spring Cloud Gateway 正式版為 2.0.2 其文檔并不完善,并且有些地方還要重新設(shè)計(jì)判耕,這里僅提供一個(gè)基本的案例
詳見:Spring Cloud Gateway Documentation
聲明周期
Spring Cloud Gateway 基于 Project Reactor 和 WebFlux,采用響應(yīng)式編程風(fēng)格翘骂,打開它的 Filter 的接口 GlobalFilter 你會(huì)發(fā)現(xiàn)它只有一個(gè)方法 filter壁熄。
創(chuàng)建全局過濾器
實(shí)現(xiàn) GlobalFilter
, Ordered
接口并在類上增加 @Component
注解就可以使用過濾功能了帚豪,非常簡(jiǎn)單方便
package com.wsl.hello.gateway.filters;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Maps;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Map;
/**
* 鑒權(quán)過濾器
*/
@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getQueryParams().getFirst("token");
if (token == null || token.isEmpty()) {
ServerHttpResponse response = exchange.getResponse();
// 封裝錯(cuò)誤信息
Map<String, Object> responseData = Maps.newHashMap();
responseData.put("code", 401);
responseData.put("message", "非法請(qǐng)求");
responseData.put("cause", "Token is empty");
try {
// 將信息轉(zhuǎn)換為 JSON
ObjectMapper objectMapper = new ObjectMapper();
byte[] data = objectMapper.writeValueAsBytes(responseData);
// 輸出錯(cuò)誤信息到頁面
DataBuffer buffer = response.bufferFactory().wrap(data);
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
return response.writeWith(Mono.just(buffer));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
return chain.filter(exchange);
}
/**
* 設(shè)置過濾器的執(zhí)行順序
*
* @return
*/
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
}
測(cè)試過濾器
瀏覽器訪問:http://localhost:9000/nacos-consumer/test/app/name
網(wǎng)頁顯示
瀏覽器訪問:http://localhost:9000/nacos-consumer/test/app/name?token=123456 網(wǎng)頁顯示
Hello Nacos Discovery nacos-consumer i am from port 8082
附:Spring Cloud Gateway Benchmark
Spring 官方人員提供的網(wǎng)關(guān)基準(zhǔn)測(cè)試報(bào)告 GitHub
Proxy | Avg Latency | Avg Req/Sec/Thread |
---|---|---|
gateway | 6.61ms | 3.24k |
linkered | 7.62ms | 2.82k |
zuul | 12.56ms | 2.09k |
none | 2.09ms | 11.77k |
說明
- 這里的 Zuul 為 1.x 版本,是一個(gè)基于阻塞 IO 的 API Gateway
- Zuul 已經(jīng)發(fā)布了 Zuul 2.x草丧,基于 Netty狸臣,非阻塞的,支持長(zhǎng)連接昌执,但 Spring Cloud 暫時(shí)還沒有整合計(jì)劃
- Linkerd 基于 Scala 實(shí)現(xiàn)的烛亦、目前市面上僅有的生產(chǎn)級(jí)別的 Service Mesh(其他諸如 Istio、Conduit 暫時(shí)還不能用于生產(chǎn))懂拾。
目錄:Spring Cloud Alibaba 教程
上一篇:9.Spring Cloud Alibaba 路由網(wǎng)關(guān)(Gateway)
下一篇:11. Spring Cloud Alibaba 服務(wù)配置