spring gateway 學習


為什么需要使用網關

 

1.實現統一認證

2.統一一個域名,解決調用困難。

3.協議轉換 將不友好的協議轉成友好的協議。

 spring cloud gateway 是什么

是spring cloud 的第二代網關,會替代zuul 第一代網關。

基於 netty,reactor,webflux 構建。

優點:

1.性能強勁 是 zuul 的1.6倍

2.功能強大

 內置 監控,限流,轉發等

3.設計優雅,容易擴展。

 

編寫spring cloud gateway

增加依賴

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

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

網關配置

server:
  port: 8040
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          # 讓gateway通過服務發現組件找到其他的微服務
          enabled: true
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always

這樣網關就編寫好了

通過網關訪問為微服務

http://網關地址/user-center/user/1

這個將會將請求轉發到 http://用戶微服務/user/1 的地址。

- id: sytem
  uri: lb://jpaas-system
  predicates:
    - Path=/api-system/**
  filters:
    - StripPrefix=1

這個作用是,當路徑為

/api-system/ 開頭的路徑,轉發到 jpaas-system 的微服務,並將URL 去掉前綴。
 
        

 

spring gateway 的核心概念

1.路由

spring clound gateway  的基礎元素,可以理解成為一條轉發規則:

包含ID ,目標URL ,Predicate 集合和 Filter 集合。

2.Predicate (謂詞)

 即 java.util.function.Predicate ,spring cloud gateway 使用謂詞實現路由匹配條件

3.Filter 過濾器

 修改請求 以及響應

 典型的路由配置:

spring:
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          # 讓gateway通過服務發現組件找到其他的微服務
          enabled: true
      routes:
        - id: user_route
          uri: lb://user-center
          predicates:
            - Path=/users/**
        - id: content_route
          uri: lb://content-center
          predicates:
            - Path=/shares/**,/admin/**
filters:
- AddRequestHeader=token,0001

包括:

id,uri,predicates,filtres 等

 

spring gateway 架構圖

 

1. gateway client 是瀏覽器

2. proxied service 表示 被代理的微服務

3. handler maping 判斷路徑是否和路由配置匹配。

4.webhandler 會讀取這個路由的過濾器,交給過濾器處理。

 

內置路由謂詞工廠

 參考文檔

http://www.imooc.com/article/290804

 

自定義謂詞工廠

比如限制在 9-17 點才允許訪問某個路徑

import lombok.Data;

import java.time.LocalTime;

@Data
public class TimeBeweenConfig {
    private LocalTime start;
    private LocalTime end;
}

 

配置代碼

自定義謂詞工廠代碼

@Component
public class TimeBetweenRoutePredicateFactory
    extends AbstractRoutePredicateFactory<TimeBeweenConfig> {
    public TimeBetweenRoutePredicateFactory() {
        super(TimeBeweenConfig.class);
    }

    @Override
    public Predicate<ServerWebExchange> apply(TimeBeweenConfig config) {
        LocalTime start = config.getStart();
        LocalTime end = config.getEnd();

        return new Predicate<ServerWebExchange>() {
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                LocalTime now = LocalTime.now();
                return now.isAfter(start) && now.isBefore(end);
            }
        };
    }
    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("start", "end");
    }
}

 類使用 RoutePredicateFactory 結束,這個是約定。

在配置文件中進行配置。

predicated:

  -TimeBetween=上午8:00,下午17:00

網關過濾器配置

http://www.imooc.com/article/290816

內置過濾器介紹。

編寫自定義過濾器代碼。

@Component
public class PreLogGatewayFilterFactory
    extends AbstractNameValueGatewayFilterFactory {
    @Override
    public GatewayFilter apply(NameValueConfig config) {
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                log.info("請求進來了...{},{}", config.getName(), config.getValue());
                ServerHttpRequest modifiedRequest = exchange.getRequest()
                        .mutate()
                        .build();
                ServerWebExchange modifiedExchange = exchange.mutate()
                        .request(modifiedRequest)
                        .build();

                return  chain.filter(modifiedExchange);

            }
        };
    }
}

配置編寫為

filters:

   -PreLog:a,b

 

filters:
- StripPrefix=1
StripPrefix 過濾器的作用
當我們訪問
/api-user/user/org/osUser/current
配置這個過濾器后,訪問路徑會被修改為
/user/org/osUser/current
會將前綴進行截取。 

全局過濾器介紹

https://www.cnblogs.com/yinjihuan/p/10474768.html

 

GATEWAY 監控

使用 springboot actuator 進行監控

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

增加配置到pom.xml 

修改 配置文件:

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always

 配置好后,訪問路徑都在 /actoator/gateway 下面

在這里我們可以通過 actuator 增加或更新路由。

調試方法

http://www.imooc.com/article/290824

限流

http://www.imooc.com/article/290828


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM