SpringCloud GateWay 使用 閘道器路由

FH-Admin發表於2021-07-19

GateWay之路由轉發和過濾

在一個Gateway專案(配置了eureka等元件)中進行配置

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

透過第一個服務hao-service-autodeliver的配置形式,使用固定ip和服務名均可正常透過閘道器專案訪問到服務,但是固定ip的方式不太靈活,而 lb://zhao-service-autodeliver可以實現隨機的負載均衡,且不用填寫固定ip也避免了不要的麻煩
file
第二個服務配置中 filters:- StripPrefix=1這個配置會過濾掉第一個路徑配置,所以我們在最後訪問的時候,除了需要加上第一個過濾掉的配置,還需要加上原本的配置。訪問形式如下
file

GateWay斷言

上述針對路徑的配置即是斷言predicates的配置,而Gateway還內建了以下幾種斷言
file
基本上上述斷言都是基於請求攜帶的資訊進行過濾的,在實際操作過程中可以綜合使用這些資訊來達到我們想要的操作

GateWay自定義全域性過濾器

//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");//模擬本機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+"在黑名單中,拒絕訪問");
            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;
    }
}

透過該過濾器攔截了黑名單中的請求(該操作在實際中可藉助mysql或redis等資料儲存實現),實現效果
file

GateWay的高可用

⽹關作為⾮常核⼼的⼀個部件,如果掛掉,那麼所有請求都可能⽆法路由處理,因此我們需要做GateWay的⾼可⽤。GateWay的⾼可⽤很簡單:可以啟動多個GateWay例項來實現⾼可⽤,在GateWay的上游使⽤Nginx等負載均衡裝置進⾏負載轉發以達到⾼可⽤的⽬的。啟動多個GateWay例項(假如說兩個,⼀個端⼝9002,⼀個端⼝9003),剩下的就是使⽤Nginx等完成負載代理即可。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章