GateWay之路由轉(zhuǎn)發(fā)和過(guò)濾
在一個(gè)Gateway項(xiàng)目(配置了eureka等組件)中進(jìn)行配置
server:
? port: 9006
spring:
? application:
? ? name: zhao-service-gateway
? cloud:
? ? gateway:
? ? ? routes:
? ? ? - id: service-autodeliver-router
? ? ? ? #uri: http://127.0.0.1:8091
? ? ? ? uri: lb://zhao-service-autodeliver
? ? ? ? predicates:
? ? ? ? ? - Path= /autodeliver/**
? ? ? - id: service-resume-router
? ? ? ? #uri: http://127.0.0.1:8081
? ? ? ? uri: lb://zhao-service-resume
? ? ? ? predicates:
? ? ? ? ? - Path=/resume/**
? ? ? ? filters:
? ? ? ? ? - StripPrefix=1
通過(guò)第一個(gè)服務(wù)hao-service-autodeliver的配置形式,使用固定ip和服務(wù)名均可正常通過(guò)網(wǎng)關(guān)項(xiàng)目訪問(wèn)到服務(wù)经宏,但是固定ip的方式不太靈活犀暑,而 lb://zhao-service-autodeliver可以實(shí)現(xiàn)隨機(jī)的負(fù)載均衡,且不用填寫固定ip也避免了不要的麻煩
第二個(gè)服務(wù)配置中 filters:- StripPrefix=1這個(gè)配置會(huì)過(guò)濾掉第一個(gè)路徑配置烁兰,所以我們?cè)谧詈笤L問(wèn)的時(shí)候耐亏,除了需要加上第一個(gè)過(guò)濾掉的配置,還需要加上原本的配置沪斟。訪問(wèn)形式如下
GateWay斷言
上述針對(duì)路徑的配置即是斷言predicates的配置广辰,而Gateway還內(nèi)置了以下幾種斷言
基本上上述斷言都是基于請(qǐng)求攜帶的信息進(jìn)行過(guò)濾的,在實(shí)際操作過(guò)程中可以綜合使用這些信息來(lái)達(dá)到我們想要的操作
GateWay自定義全局過(guò)濾器
//www.fhadmin.cn
@Component
@Slf4j
public class BlackListFilter implements GlobalFilter, Ordered{
? ? private? static final List<String> blackList=new ArrayList<>();
? ? static {
? ? ? ? blackList.add("0:0:0:0:0:0:0:1");//模擬本機(jī)ip地址
? ? }
? ? @Override
? ? public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
? ? ? ? ServerHttpRequest request = exchange.getRequest();
? ? ? ? ServerHttpResponse response =exchange.getResponse();
? ? ? ? String clientIp = request.getRemoteAddress().getHostString();
? ? ? ? if (blackList.contains(clientIp)){
? ? ? ? ? ? response.setStatusCode(HttpStatus.UNAUTHORIZED);
? ? ? ? ? ? log.error(clientIp+"在黑名單中,拒絕訪問(wèn)");
? ? ? ? ? ? String data = "request be denied";
? ? ? ? ? ? DataBuffer wrap = response.bufferFactory().wrap(data.getBytes());
? ? ? ? ? ? return response.writeWith(Mono.just(wrap));
? ? ? ? }
? ? ? ? return chain.filter(exchange);
? ? }
? ? @Override
? ? public int getOrder() {
? ? ? ? return 0;
? ? }
}
通過(guò)該過(guò)濾器攔截了黑名單中的請(qǐng)求(該操作在實(shí)際中可借助mysql或redis等數(shù)據(jù)存儲(chǔ)實(shí)現(xiàn)),實(shí)現(xiàn)效果
GateWay的高可用
?關(guān)作為?常核?的?個(gè)部件币喧,如果掛掉轨域,那么所有請(qǐng)求都可能?法路由處理袱耽,因此我們需要做GateWay的?可?杀餐。GateWay的?可?很簡(jiǎn)單:可以啟動(dòng)多個(gè)GateWay實(shí)例來(lái)實(shí)現(xiàn)?可?,在GateWay的上游使?Nginx等負(fù)載均衡設(shè)備進(jìn)?負(fù)載轉(zhuǎn)發(fā)以達(dá)到?可?的?的朱巨。啟動(dòng)多個(gè)GateWay實(shí)例(假如說(shuō)兩個(gè)史翘,?個(gè)端?9002,?個(gè)端?9003)冀续,剩下的就是使?Nginx等完成負(fù)載代理即可琼讽。