Spring Cloud Gateway技术实践

1.网关的由来

微服务提出后,单体应用被拆分成多个服务,为了对外提供统一入口,解耦客户端与内部服务。
Spring Cloud Gateway技术实践_第1张图片

2.网关的作用

网关能做统一的路由转发、熔断、限流、安全认证、日志监控等。
Spring Cloud Gateway技术实践_第2张图片

3.网关zuul与Spring Cloud Gateway对比

Spring Cloud Gateway技术实践_第3张图片

4.Spring Cloud Gateway核心概念

Spring Cloud Gateway技术实践_第4张图片
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技术实践_第5张图片
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依赖


    org.springframework.boot
    spring-boot-starter-parent
    2.0.8.RELEASE
    


    
        org.springframework.cloud
        spring-cloud-starter-gateway
    



    
        
            org.springframework.cloud
            spring-cloud-dependencies
            Finchley.SR2
            pom
            import
        
    

代码方式配置网关

@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

测试结果:

Spring Cloud Gateway技术实践_第6张图片

自定义GlobalFilter

@Component
public class LogGlobalFilter implements GlobalFilter {
    @Override
    public Mono 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 动态路由

你可能感兴趣的:(Spring,Cloud)