SpringCloud中GateWay的詳細使用

ElasticJob發表於2020-10-10

gateway的三大法寶

  1. 路由(router)
  2. 斷言(predicate)
  3. 過濾器(filter)
匯入依賴
 <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

1.router的詳細配置

1.1 yml檔案進行配置

spring:
  application:
    name: cloud-gateway
  cloud:
      gateway:
        discovery:
          locator:
            enabled: true    #是否開啟負載均衡策略
        routes:
          - id: payment-gateway1   #路由的id,保證唯一就行,常用服務名稱
            uri: http://localhost:8081   #想要代理的路由介面
            predicates:
              - Path=/payment/lb/**    #斷言:進行指定的路徑路由

這裡的意思是利用閘道器進行路由代理,對外暴露介面9527,隱藏原來的服務埠,這裡只需要訪問 http://localhost:9527/payment/lb 就能代替原來的服務,進行埠的訪問

1.2 配置類進行路由代理

@Configuration
public class GatewayConfig {

    /*
    * 第二種代理的方法
    * 只需要訪問 http://localhost:9527/guonei  就能訪問到uri中的網址
    * */
    @Bean
    public RouteLocator customerRouteLocator(RouteLocatorBuilder builder){
        RouteLocatorBuilder.Builder routes = builder.routes();
        routes.route("path var",
                r ->r.path("/guonei")
                        .uri("http://news.baidu.com/guonei")).build();

        return routes.build();
    }
}

2.斷言(官網有11種)

官網有詳細的配置
在這裡插入圖片描述

spring:
  application:
    name: cloud-gateway
  cloud:
      gateway:
        discovery:
          locator:
            enabled: true
        routes:
          - id: payment-gateway1   #路由的id,保證唯一就行,常用服務名稱
            #uri: http://localhost:8081   #想要代理的路由介面
            uri: lb://CLOUD-PAYMENT
            predicates:
              - Path=/payment/lb/**    #斷言:進行指定的路徑路由
              - After=2020-10-09T21:09:54.173887100+08:00[Asia/Shanghai] #指定時間後才能進行訪問
              #- Cookie=name,zk   #利用curl進行訪問測試  http://localhost:9527/payment/lb --cookie "name=zk"
              #- Header=X-Request-Id, \d+  #請求頭必須是正整數  http://localhost:9527/payment/lb -H "X-Request-Id:123"
              #- Host=**.somehost.org,**.anotherhost.org  # http://localhost:9527/payment/lb -H "Host: new.somehost.org"
              #- Method=GET               # get請求才允許訪問
              #- Query=username, \d+        #   http://localhost:9527/payment/lb?username=123

After中的時間格式的獲取可以自己寫個方法進行獲取(可以用來做定時開放介面)

 public static void main(String[] args) {
        ZonedDateTime now = ZonedDateTime.now();
        System.out.println(now);
    }

curl是利用cmd進行測試(以cookie進行舉例,後面都有訪問方式)

在這裡插入圖片描述

3.filter

註冊進spring容器,實現 GlobalFilter, Ordered 介面

@Component
@Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered {

//具體的驗證可以獲取相應的資料進行驗證

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String name = exchange.getRequest().getQueryParams().getFirst("name");//獲取請求的引數,進行驗證
        if (name==null){
            log.info("請求的引數為空,資料異常");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);  //放行給下一個過濾器
    }

    @Override
    public int getOrder() {
        return 0;  //執行的順序,數值越小是,優先順序越高
    }
}

相關文章