1. 程式人生 > 其它 >SpringCloud——GateWay入門

SpringCloud——GateWay入門

技術標籤:gatewayspring cloudgateway

客戶由傳送請求由Nginx伺服器已經將請求轉發到一個伺服器上,但是服務之前我們還需要一個閘道器將這些請求進一步加工處理到服務上,這一步就是GateWay.

GateWay

1.GateWay服務是不需要進入以下jar包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>

2.GateWay是基於非同步非阻塞模型上開發的;zuul1基於servlet2.5使用阻塞模型開發。
3.Spring Cloud Gateway具有如下特性::
①:動態路由:能夠匹配任何請求屬性;
②:可以對路由指定Predicate (斷言)和Filter (過濾器);

③:整合Hystrix的斷路器功能;
④:整合Spring Cloud服務發現功能;
⑤:易於編寫的Predicate(斷言)和Filter (過濾器);
⑥:請求限流功能;
⑦:支援路徑重寫。
3…GatWay的三大核心概念:
①:Route(路由):路由是構建閘道器的基本模組,它由ID,目標URI,一系列的斷言和過濾器組成,如斷言為true則匹配該路由
②:Predicate(斷言):可以匹配HTTP請求中的所有內容(例如請求頭或請求引數),如果請求與斷言相匹配則進行路由
③:Filter(過濾):可以在請求被路由前或者之後對請求進行修改.
4.GatWay工作流程:客戶端向Spring Cloud Gateway發出請求。然後在Gateway Handler Mapping
中找到與請求相匹配的路由,將其傳送到GatewayWeb Handler;Handler再通過指定的過濾器鏈來將請求傳送到我們實際的服務執行業務邏輯,然後返回。
5.predicate就是我們的匹配條件;而filter就可以理解為一個無所不能的攔截器。有了這兩個元素,再加上目標uri,就可以實現一個具體的路由。
6.GatwWay的兩種配置方法
application.yml配置檔案

server:
  port: 9527
  
eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://eureka7001.com:7001/eureka
      
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true  #開啟從註冊中心動態建立路由的功能,利用微服務名進行路由
      routes:
        - id: payment_routh #payment_route    #路由的ID,沒有固定規則但要求唯一,建議配合服務名
          #uri: http://localhost:8081          #匹配後提供服務的路由地址
          uri: lb://cloud-payment-service #匹配後提供服務的路由地址
          predicates:
            - Path=/payment/get/**         # 斷言,路徑相匹配的進行路由

        - id: payment_routh2 #payment_route    #路由的ID,沒有固定規則但要求唯一,建議配合服務名
          #uri: http://localhost:8081          #匹配後提供服務的路由地址
          uri: lb://cloud-payment-service #匹配後提供服務的路由地址
          predicates:
            - Path=/payment/lb/**         # 斷言,路徑相匹配的進行路由
            #- After=2020-12-11T22:01:00.869+08:00[GMT+08:00]
            #- Cookie=username,charon
            #- Header=X-Request-Id, \d+  # 請求頭要有X-Request-Id屬性並且值為整數的正則表示式
            #- Method=GET
            #- Query=username, \d+ #要有引數名username,值必須為整數才能路由 (可以只寫一個引數名不帶值)
          #filters:
            #- AddRequestHeader=X-Request-Id, 1024 #過濾器工廠會在匹配的請求頭上加一對請求,名稱為X-Request-Id值為1024

JavaBean注入

@Configuration
public class GateWayConfig {


    /**
     * 配置一個id為path_route_charon路由規則,
     * 當訪問http://localhost:9527/guonei是自動跳轉到http://news.baidu.com/guonei
     * @param routeLocatorBuilder
     * @return
     */
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
        RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
        routes.route("path_route_charon",r ->
            r.path("/guonei").uri("http://news.baidu.com/guonei")
        ).build();
        routes.route("path_route_charon2",r ->
                r.path("/guoji").uri("http://news.baidu.com/guoji")
        ).build();
        return routes.build();
    }
}

7.預設情況下Gatway會根據註冊中心註冊的服務列表, 以註冊中心上微服務名為路徑建立動態路由進行轉發,從而實現動態路由的功能
8.常用的Route Predicate:
一:After Route Predicate :
二:Before Route Predicate :
三:Between Route Predicate :
四:Cookie Route Predicate (帶上cookie):
五:Header Route Predicate :
六:Host Route Predicate:
七:Method Route Predicate:
八:Path Route Predicate:
九:Query Route Predicate:
十:RemoteAddr Route Predicate:
十一:Weight Route Predicate:
補充:使用方式可以檢視上面配置檔案和下例圖片:
在這裡插入圖片描述
在這裡插入圖片描述

9.Filter生命週期:prepost
過濾器可能會在傳送代理請求之前(“pre”)或之後(“post”)執行業務邏輯。Filter在“pre”型別的過濾器可以做引數校驗、許可權校驗、流量監控、日誌輸出、協議轉換等。在“post”型別的過濾器中可以做響應內容、響應頭的修改,日誌的輸出,流量監控等有著非常重要的作用。
10.種類:GateWayFilterGlobalerFiter
GlobalerFiter是對於請求進行過濾篩選

@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("***********come in MyLogGateWayFilter:  "+new Date());
        String username = exchange.getRequest().getQueryParams().getFirst("username");
        if(StringUtils.isBlank(username)){
            log.info("*******使用者名稱為null,非法使用者,禁止進入");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    /**
     * 載入過濾器的順序 一般數字越小優先順序越高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}