Spring Cloud Gateway技术实践

1.网关的由来

微服务提出后,单体应用被拆分成多个服务,为了对外提供统一入口,解耦客户端与内部服务。
在这里插入图片描述

2.网关的作用

网关能做统一的路由转发、熔断、限流、安全认证、日志监控等。
在这里插入图片描述

3.网关zuul与Spring Cloud Gateway对比

在这里插入图片描述

4.Spring Cloud Gateway核心概念

在这里插入图片描述
1.路由(route) 路由是网关最基础的部分,路由信息由一个ID、一个目的URL、一组断言工厂和一组Filter组成。如果断言为真,则说明请求URL和配置的路由匹配。

2.断言(predicates) Java8中的断言函数,Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自Http Request中的任何信息,比如请求头和参数等。

3.过滤器(filter) 一个标准的Spring webFilter,Spring Cloud Gateway中的Filter分为两种类型,分别是Gateway Filter和Global Filter。过滤器Filter可以对请求和相应进行处理。

5.Spring Cloud Gateway工作原理

在这里插入图片描述
Spring Cloud Gateway核心处理流程如上图所示,Gateway的客户端向Spring Cloud Gateway发送请求,请求首先被HttpWebHandlerAdapter进行提取组装成网关上下文,然后网关的上下文会传递到DispatcherHandler。DispatcherHandler是所有请求的分发处理器,DispatcherHandler主要负责分发请求对应的处理器。比如请求分发到对应的RoutePredicateHandlerMapping(路由断言处理映射器)。路由断言处理映射器主要作用用于路由查找,以及找到路由后返回对应的FilterWebHandler。FilterWebHandler主要负责组装Filter链并调用Filter执行一系列的Filter处理,然后再把请求转到后端对应的代理服务处理,处理完毕之后将Response返回到Gateway客户端。

6.Spring Cloud Gateway代码实践

pom.xml增加Spring Cloud依赖和Gateway依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.8.RELEASE</version>
    <relativePath/>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.SR2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

代码方式配置网关

@SpringBootApplication
@RestController
public class DemoGatewayApplication {

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

   @Bean
   public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            .route(r -> r
                .path("/refund/**")
                .filters(f -> f.addRequestHeader("Hello", "World"))
                .uri("http://manage-test.payplatform.speiyou.cn/")
            ).build();
    }

}

yml方式配置网关

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      routes:
      - id: pay-merchant
        uri: http://merchant-beta.payplatform.speiyou.cn/
        predicates:
        - Path=/pay-merchant/**

      - id: peiyou-finance
        uri: http://peiyou-finance.test.speiyou.cn/
        predicates:
        - Path=/peiyou-finance/**
        #filters:
 	    # 进行token过滤
        #- TokenAuthenticationFilter
        #- StripPrefix=1

测试结果:

在这里插入图片描述

自定义GlobalFilter

@Component
public class LogGlobalFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest serverHttpRequest= exchange.getRequest();
        String url = serverHttpRequest.getURI().toString();
        System.out.println("url ------>: " + url);//打印每次请求的url
        return chain.filter(exchange);
    }
}

7.Spring Cloud Gateway参考资料

Spring Cloud Gateway官方文档
Spring Cloud Gateway断言匹配
Spring Cloud Gateway之Filter使用
Spring Cloud Gateway 动态路由

发布了14 篇原创文章 · 获赞 11 · 访问量 7229

猜你喜欢

转载自blog.csdn.net/qq_30035133/article/details/90081067