Back to Javatutorial

SpringCloudGateway

docs/Spring全家桶/SpringCloud/SpringCloudGateway.md

1.0.014.0 KB
Original Source

΢ܹУһϵͳɶ΢ɣЩܲڲͬͬͬ¡£ͻˣֻߵȣҪֱЩ񣬾Ҫ֪ǾĵַϢ IP ַ˿ںŵȡ

ֿͻֱķʽ⣺

  • ڶʱͻҪάķַڿͻ˵Ƿdzӵġ
  • ijЩ¿ܻڿ⡣
  • ֤Ѷȴÿ΢Ҫ֤

ǿͨ API Щ⣬ʲô API ء

API

API һڿͻ˺΢֮ķǿ API дһЩҵܵ߼Ȩ֤ء桢·ɵȡ

API ؾ΢ϵͳһϵͳΨһڡͻ˻Ƚ͵ API أȻ API ظıʶϢת΢ʵ

ͼ1ַʷʽԱ

ڷڶࡢӶȽϸߡģȽϴϵͳ˵ʹ API ؾºô

  • ͻͨ API ΢񽻻ʱͻֻҪ֪ API صַɣҪάķַ˿ͻ˵Ŀ
  • ͻֱ API ͨţܹٿͻĽ
  • ͻ˵ķ϶Ƚ͡
  • ʡܣû顣
  • API ػṩ˰ȫءˡ桢ƷԼص API ܡ

API ʵַҪ 5 ֣

  • Spring Cloud Gateway
  • Spring Cloud Netflix Zuul
  • Kong
  • Nginx+Lua
  • Traefik

ڣǾͶ Spring Cloud Gateway ϸܡ

Spring Cloud Gateway```

Spring Cloud Gateway Spring Cloud Ŷӻ Spring 5.0Spring Boot 2.0 Project Reactor ȼĸ API

Spring Cloud Gateway ּṩһּ򵥶Ч; APIΪṩйע㣬磺ȫԣ/ָ͵ԡ```

Spring Cloud Gateway ǻ WebFlux ʵֵģ WebFlux ܵײʹ˸ܵ Reactor ģʽͨſ Netty

Spring Cloud Gateway ĸ

Spring Cloud GateWay ҪĹܾ·תڶתʱҪ漰ĸ±

ĸ
Route·ɣģ顣һ IDһĿ URIһԣPredicateһFilterɡ
Predicateԣ·תжǿͨ Predicate ```HTTP ƥ䣬ʽ·ͷȣƥɹתӦķ
Filterǿʹغ޸ģʹĵӦٴ

ע⣺ Route Predicate ͬʱ

Spring Cloud Gateway

Spring Cloud Gateway ԣ

  • Spring Framework 5Project Reactor Spring Boot 2.0
  • ܹƥ·ɡ
  • predicatesԣ filtersض·ɵġ
  • Hystrix ۶
  • Spring Cloud DiscoveryClientֿͻˣ
  • ڱдԺ͹
  • ܹƵʡ
  • ܹд·

Gateway Ĺ

Spring Cloud Gateway ͼ

ͼ2Spring Cloud Gateway

Spring Cloud Gateway ˵£

  1. ͻ˽͵```Spring Cloud Gateway ϡ
  2. Spring Cloud Gateway ͨ```Gateway Handler Mapping ҵƥ·ɣ䷢͸ Gateway Web Handler
  3. Gateway Web Handler```ָͨĹFilter ChainתʵʵķڵУִҵ߼Ӧ
  4. ֮߷ֿΪܻת֮ǰpre֮postִҵ߼
  5. Filterתǰغ޸ģУ顢ȨУ顢ء־ԼЭתȡ
  6. Ӧؿͻ֮ǰӦغٴ޸ӦݻӦͷ־صȡ
  7. Ӧԭ·ظͻˡ

֮ܶͻ˷͵ Spring Cloud Gateway Ҫͨһƥܶλķڵ㡣ڽתдĹǰpre postǻԶӦһЩϸơ

Predicate ·ɵƥ Filter ǶӦоϸƵĹߡԪأټĿ URIͿʵһ·ˡ

Predicate

Spring Cloud Gateway ͨ```Predicate ʵ Route ·ɵƥ򡣼򵥵˵Predicate ·תжֻ Predicate ŻᱻתָķϽд

ʹ Predicate Ҫע 3 㣺

  • Route · Predicate ԵĶӦϵΪһԶࡱһ·ɿ԰ͬԡ
  • һҪתָ·ϣͱͬʱƥ·ϵжԡ
  • һͬʱ·ɵĶʱֻᱻ׸ɹƥ·ת

ͼ3Predicate ƥ

Predicate ±ת URI Ϊ http://localhost:8001

ʾ˵
Path- Path=/dept/list/**```· /dept/list/** ƥʱܱת```http://localhost:8001 ϡ
Before- Before=2021-10-20T11:47:34.255+08:00[Asia/Shanghai]2021 10 20 11 ʱ 47 34.255 ֮ǰ󣬲Żᱻתhttp://localhost:8001 ϡ
After- After=2021-10-20T11:47:34.255+08:00[Asia/Shanghai]2021 10 20 11 ʱ 47 34.255 ֮󣬲Żᱻת```http://localhost:8001 ϡ
Between- Between=2021-10-20T15:18:33.226+08:00[Asia/Shanghai],2021-10-20T15:23:33.226+08:00[Asia/Shanghai]2021 10 20 15 ʱ 18 33.226 2021 10 20 15 ʱ 23 33.226 ֮󣬲Żᱻת```http://localhost:8001 ϡ
Cookie- Cookie=name,c.biancheng.netЯCookie Cookie Ϊname=c.biancheng.net 󣬲Żᱻת http://localhost:8001 ϡ
Header- Header=X-Request-Id,\d+ͷЯ X-Request-Id ֵΪ󣬲Żᱻת http://localhost:8001 ϡ
Method- Method=GETֻ GET Żᱻת http://localhost:8001 ϡ

ʾ

Ǿͨһʵʾ Predicate ʹõġ

1. ڸspring-cloud-demo2 ´һΪmicro-service-cloud-gateway-9527 Spring Boot ģ飬 pom.xml ¡

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>spring-cloud-demo2</artifactId>
        <groupId>net.biancheng.c</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <groupId>net.biancheng.c</groupId>
    <artifactId>micro-service-cloud-gateway-9527</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>micro-service-cloud-gateway-9527</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--رע⣺ gateway طв spring-boot-starter-web ᱨ-->
        <!-- Spring cloud gateway -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--Eureka ͻ-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2. ```micro-service-cloud-gateway-9527 ·/resources Ŀ¼£½һļ application.yml¡

server:
  port: 9527  #˿ں
spring:
  application:
    name: microServiceCloudGateway
  cloud:
    gateway: #·
      routes:
        # micro-service-cloud-provider-dept-8001 ṩķ¶ͻˣֻͻ˱¶ API صĵַ 9527
        - id: provider_dept_list_routh   #· id,ûй̶򣬵ΨһӦ
          uri: http://localhost:8001          #ƥṩ·ɵַ
          predicates:
            #Ƕѡȫ
            - Path=/dept/list/**               #ԣ·ƥ ע⣺Path  P Ϊд
            - Method=GET #ֻʱ GET ʱܷ

eureka:
  instance:
    instance-id: micro-service-cloud-gateway-9527
    hostname: micro-service-cloud-gateway
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

У spring.cloud.gateway.routes ʹ predicates ԣ

- Path=/dept/list/**            
- Method=GET

ֻеⲿͻˣ͵ micro-service-cloud-gateway-9527 HTTP ͬʱеĶʱŻᱻתָķУ http://localhost:80013\. ```micro-service-cloud-gateway-9527 ϣʹ @EnableEurekaClient ע⿪ Eureka ͻ˹ܣ¡

package net.biancheng.c;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class MicroServiceCloudGateway9527Application {

    public static void main(String[] args) {
        SpringApplication.run(MicroServiceCloudGateway9527Application.class, args);
    }
}

4. Eureka עģȺmicro-service-cloud-provider-dept-8001 Լ```micro-service-cloud-gateway-9527ʹʡhttp://localhost:9527/dept/listͼ

ͼ4Spring Cloud Gateway ·ת

Spring Cloud Gateway ̬·

Ĭ£Spring Cloud Gateway ݷעģ Eureka ServerάķбԷspring.application.nameΪ·̬·ɽתӶʵֶ̬·ɹܡ

ǿļУ Route uri ַ޸Ϊʽ

lb://service-name

˵£

  • lburi Э飬ʾ Spring Cloud Gateway ĸؾ⹦ܡ
  • service-nameSpring Cloud Gateway ȡ΢ַ

ʾ

Ǿͨһʵչʾ Spring Cloud Gateway ʵֶ̬·ɵġ

1. ޸```micro-service-cloud-gateway-9527 application.yml ãʹעе΢̬·ɽת¡

server:
  port: 9527 #˿ں
 
spring:
  application:
    name: microServiceCloudGateway  #עעķ
   
  cloud:
    gateway: #·
      discovery:
        locator:
          enabled: true #ĬֵΪ trueĬϿעĶ̬·ɵĹܣ΢·

      routes:
        # micro-service-cloud-provider-dept-8001 ṩķ¶ͻˣֻͻ˱¶ API صĵַ 9527
        - id: provider_dept_list_routh   #· id,ûй̶򣬵ΨһӦ
          uri: lb://MICROSERVICECLOUDPROVIDERDEPT #̬·ɣʹ÷ľ˿   http://eureka7001.com:9527/dept/list

          predicates:
            #Ƕѡȫ
            - Path=/dept/list/**    #ԣ·ƥ ע⣺Path  P Ϊд
            - Method=GET #ֻʱ GET ʱܷ

eureka:
  instance:
    instance-id: micro-service-cloud-gateway-9527
    hostname: micro-service-cloud-gateway
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

2. Eureka עģȺṩ߼Ⱥmicro-service-cloud-provider-dept-8001/8002/8003Լ```micro-service-cloud-gateway-9527

3. зʡhttp://localhost:9527/dept/listͼ

ͼ5Spring Cloud ʵֶ̬·

Filter

ͨ£ڰȫĿǣṩķһУ߼û½״̬У顢ǩУȡ

΢ܹУϵͳɶ΢ɣЩҪЩУ߼ʱǾͿԽЩУ߼д Spring Cloud Gateway Filter С

Filter ķ

Spring Cloud Gateway ṩ͵ĹԶӦоϸơ

˵
Preֹת΢֮ǰԶغ޸ģУ顢ȨУ顢ء־ԼЭתȲ
Postֹ΢ӦԶӦغٴ޸ӦݻӦͷ־صȡ

÷Χ֣Spring Cloud gateway Filter ԷΪ 2 ࣺ

  • GatewayFilterӦڵ·ɻһ·ϵĹ
  • GlobalFilterӦе·ϵĹ

GatewayFilter ع

GatewayFilter Spring Cloud Gateway ṩһӦڵһ·ϵĹԶԵ·ɻһ·ϴʹӦأʵһЩҵ޹صĹܣ½״̬У顢ǩУ顢ȨУ顢־صȡ

GatewayFilter ļ application.ymlед Predicate ƣʽ¡


spring:
  cloud:
    gateway: 
      routes:
        - id: xxxx
          uri: xxxx
          predicates:
            - Path=xxxx
          filters:
            - AddRequestParameter=X-Request-Id,1024 #ƥͷһͷΪ X-Request-Id ֵΪ 1024
            - PrefixPath=/dept #·ǰ /dept
            

Spring Cloud Gateway ˶ 31 GatewayFilter±о˼ֳõعʹʾ

·ɹʹʾ
AddRequestHeader```ش󣬲һָͷnameҪӵͷ keyvalueҪӵͷ value- AddRequestHeader=my-request-header,1024
AddRequestParameterش󣬲һָnameҪӵ keyvalueҪӵ value- AddRequestParameter=my-request-param,c.biancheng.net
AddResponseHeaderӦӦһָӦͷnameҪӵӦͷ keyvalueҪӵӦͷ value- AddResponseHeader=my-response-header,c.biancheng.net
PrefixPathش󣬲·һָǰ׺```prefixҪӵ·ǰ׺- PrefixPath=/consumer
PreserveHostHeaderתʱֿͻ˵ Host Ϣ䣬Ȼݵṩ΢С- PreserveHostHeader
RemoveRequestHeaderƳͷָIJnameҪƳͷ key- RemoveRequestHeader=my-request-header
RemoveResponseHeaderƳӦͷָIJnameҪƳӦͷ- RemoveResponseHeader=my-response-header
RemoveRequestParameterƳָnameҪƳ- RemoveRequestParameter=my-request-param
RequestSizeĴСʱ᷵ 413 Payload Too LargemaxSizeĴС- name: RequestSize`````````args:```````````````maxSize: 5000000

ʾ

ͨһʵʾ GatewayFilter ã¡

1. ```micro-service-cloud-gateway-9527 application.yml һ̬·ɣ¡

spring:
  cloud:
    gateway: 
      routes:
        - id: xxxx
          uri: xxxx
          predicates:
            - Path=xxxx
          filters:
            - AddRequestParameter=X-Request-Id,1024 #ƥͷһͷΪ X-Request-Id ֵΪ 1024
            - PrefixPath=/dept #·ǰ /dept
            

2. ```micro-service-cloud-gateway-9527ʹʡhttp://eureka7001.com:9527/get/1ͼ

ͼ6·ɹʾ

GlobalFilter ȫֹ

GlobalFilter һе·ϵȫֹͨǿʵһЩͳһҵܣȨ֤IP Ƶȡij·ƥʱôе GlobalFilter ͸·õ GatewayFilter ϳһ

Spring Cloud Gateway Ϊṩ˶Ĭϵ GlobalFilterת·ɡؾصȫֹʵʵĿУͨǶԶһЩԼ GlobalFilter ȫֹҵ󣬶ֱʹ Spring Cloud``` Config ṩЩĬϵ GlobalFilter

Ĭϵȫֹϸݣο```Spring Cloud

Ǿͨһʵʾ£Զ GlobalFilter ȫֹ

1. net.biancheng.c.filter £½һΪMyGlobalFilter ȫֹ࣬¡

server:
  port: 9527 #˿ں
 
spring:
  application:
    name: microServiceCloudGateway  #עעķ
   
  cloud:
    gateway: #·
      discovery:
        locator:
          enabled: true #ĬֵΪ trueĬϿעĶ̬·ɵĹܣ΢·

      routes:
        # micro-service-cloud-provider-dept-8001 ṩķ¶ͻˣֻͻ˱¶ API صĵַ 9527
        - id: provider_dept_list_routh   #· id,ûй̶򣬵ΨһӦ
          uri: lb://MICROSERVICECLOUDPROVIDERDEPT #̬·ɣʹ÷ľ˿   http://eureka7001.com:9527/dept/list

          predicates:
            #Ƕѡȫ
            - Path=/dept/list/**    #ԣ·ƥ ע⣺Path  P Ϊд
            - Method=GET #ֻʱ GET ʱܷ

eureka:
  instance:
    instance-id: micro-service-cloud-gateway-9527
    hostname: micro-service-cloud-gateway
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

2. ```micro-service-cloud-gateway-9527ʹʡhttp://eureka7001.com:9527/dept/listǻַᷢʱ 406 󣬿̨¡

2021-10-21
2021-10-21 16:25:39.451  INFO 19116 --- [ctor-http-nio-4] net.biancheng.c.filter.MyGlobalFilter    :  uname Ϊ null

3. ʹʡhttp://eureka7001.com:9527/dept/list?uname=123,ͼ

ͼ7Զȫع

ο

https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA https://juejin.cn/post/6931922457741770760 https://github.com/D2C-Cai/herring http://c.biancheng.net/springcloud https://github.com/macrozheng/springcloud-learning