当前位置:首页 > 服务端 > 八、网关Gateway

八、网关Gateway

2022年11月05日 23:27:53服务端20

一、Gateway介绍

① Getway 简介

由于Netflixzullzull2的推出出现问题,SpringCloud推出了自己的网关GeteWay

GatewaySpring Cloud的一个全新项目,基于Spring 5.0+Spring Boot 2.0Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。

Gateway作为SpringCloud生态系统中的网关,目标是替代Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.xReactor模式的老版本。而为了提升网关的性能,Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty

Gateway的目标提供统一的路由方式且基于Filter链的方式提供了网关基本的功能,例如:安全、监控/指标、和限流。

② Gateway 作用

  1. 反向代理
  2. 鉴权
  3. 流量控制
  4. 熔断
  5. 日志监控
    八、网关Gateway _ JavaClub全栈架构师技术笔记

③ Gateway 三大核心概念

  1. Route(路由)
    路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。
  2. Predicate(断言)
    参考JAVA8java.util.function.Predicate开发人员可以匹配HTTP请求中的所有内容(例如请求头和请求参数),如果请求与断言相匹配则进行路由
  3. Filter(过滤)
    指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或之后对请求进行修改
    八、网关Gateway _ JavaClub全栈架构师技术笔记
    web请求通过一些匹配条件,定位到真正的服务节点,并在这个转发过程的前后,进行一些细化控制。
    pridicate就是我们的匹配条件;而filter,就可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标url,就可以实现一个具体的路由了。

④ Gateway 流程
八、网关Gateway _ JavaClub全栈架构师技术笔记
客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到GatewayWeb Handler

Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前( pre)或之后(post )执行业务逻辑。

Filterpre类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在post类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。

核心逻辑:路由转发+执行过滤器链

二、Gateway的使用

2.1. 入门

① 新建一个项目cloud-gateway9527,添加Gateway的依赖:

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

② 我们不想暴露8001项目的端口,因此在9527做路由映射,有两种路由映射方式:

yml 配置

spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称进行路由
      routes:
        - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
          #匹配后提供服务的路由地址
          uri: http://localhost:8001
          predicates:
            - Path=/payment/discovery/** # 断言,路径相匹配的进行路由

编码

@Configuration
public class GatewayConfig {
     
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
     
        RouteLocatorBuilder.Builder routes = builder.routes();
        routes.route("/payment_route2",
                route -> route.path("/payment/discovery/**")
                        .uri("http://localhost:8001")
        );
        return routes.build();
    }
}

③ 经测试,这两种方式均可行:
八、网关Gateway _ JavaClub全栈架构师技术笔记

2.2 通过微服务名实现动态路由

默认情况下Gateway会根据注册中心的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能。

需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能。修改uri即可:

spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称进行路由
      routes:
        - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
          #lb://微服务名
          uri: lb://CLOUD-PAYMENT-SERVICE
          predicates:
            - Path=/payment/discovery/** # 断言,路径相匹配的进行路由

2.3 Predicate的使用

Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分。Gateway包括许多内置的Route Predicate工厂,如下图。所有这些Predicate都与HTTP请求的不同属性匹配。多个Route Predicate工厂可以进行组合。

Gateway创建Route对象时,使用Route Predicate Factory创建Predicate对象,Predicate对象可以赋值给Route。所有的 Route Predicate都对应着HTTP请求的不同属性。可以通过and相互组合。

常用的Route Predicate Factory:
八、网关Gateway _ JavaClub全栈架构师技术笔记

① After/Before/Between

设置请求生效时间/失效时间,时间格式为java8新出的java.time.ZonedDateTime

...
predicates:
  - Path=/payment/discovery/** #路径相匹配的进行路由
  - After=2020-04-17T20:28:54.492+08:00[Asia/Shanghai]
  #- Before=2020-04-17T20:28:54.492+08:00[Asia/Shanghai]
  #- Between=2020-04-16T20:28:54.492+08:00[Asia/Shanghai], 2020-04-17T20:28:54.492+08:00[Asia/Shanghai]

② Cookie/Header/HOST

Cookie Route Predicate需要两个参数,一个是Cookie name ,一个是正则表达式。路由规则通过获取对应的Cookie name值和正则表达式去匹配。

路由规则通过Header去匹配。

路由规则通过Host去匹配。

...
predicates:
  - Path=/payment/discovery/**
  - Cookie=username,zzyy
  - Header=X-Request-Id, \d+ #请求头要有X-Request-Id属性,并且值为正数
  - Host=**.ctj.com

其他Route Predicate Factory参考官网

总结:Predicate就是为了实现一组匹配原则,让请求过来找到对应的Route进行处理

2.4 Filter 的使用

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。

Gateway内置了多种路由过滤器,他们都由GatewayFilter的工厂 类来产生。其生命周期有两种:pre(业务逻辑执行之前)和post(业务逻辑执行之后)。种类有两种:GatewayFilterGlobalFilter
八、网关Gateway _ JavaClub全栈架构师技术笔记
使用GatewayFilter

例:该AddRequestHeader GatewayFilter工厂需要namevalue参数。它将X-Request-red:blue标头添加到所有匹配请求的下游请求的标头中。

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        filters:
        - AddRequestHeader=X-Request-red, blue

具体参考: 官网

自定义 GlobalFilter

作用:

  1. 全局日志记录
  2. 统一网关鉴权,可以结合Spring Security完成对用户的认证授权

用户校验实现代码:

@Component
@Slf4j
public class MyLogGatewayFilter implements GlobalFilter, Ordered {
     

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
     
        log.info("******用户验证开始: " + new Date());
        String uname = exchange.getRequest().getQueryParams().getFirst("uname");
        if(uname == null) {
     
            log.info("******非法用户******");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        log.info("******用户验证成功******");
        return chain.filter(exchange);
    }

    /**
     * 加载过滤器的顺序,数据越小,优先级越高
     * @return int
     */
    @Override
    public int getOrder() {
     
        return 0;
    }
}

访问http://localhost:9527/payment/discovery日志打印,请求并且被拦截:
八、网关Gateway _ JavaClub全栈架构师技术笔记
访问http://localhost:9527/payment/discovery?uname=a日志打印,请求被放行:
八、网关Gateway _ JavaClub全栈架构师技术笔记

作者:HuCheng1997
来源链接:https://blog.csdn.net/qq_38697437/article/details/105579033

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/68046.html

标签: Gateway
分享给朋友:

“八、网关Gateway” 的相关文章

SpringBoot 整合 gateway

SpringBoot 整合 gateway

1.添加依赖 1.1 在springboot项目中注意 pom文件配置<parent>节点,否则nacos依赖会出问题 <parent> <groupId>org.springframework.boot</groupId&...

spring-cloud-kubernetes与SpringCloud Gateway

spring-cloud-kubernetes与SpringCloud Gateway

本文是《spring-cloud-kubernetes实战系列》的第五篇,主要内容是在kubernetes上部署一个SpringCloud Gateway应用,该应用使用了spring-cloud-kubernetes框架,可以将请求转发到kubernetes环境中的其他服务上;...

跟我学SpringCloud | 第十二篇:Spring Cloud Gateway初探

跟我学SpringCloud | 第十二篇:Spring Cloud Gateway初探

SpringCloud系列教程 | 第十二篇:Spring Cloud Gateway初探 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明,本系列教程...

最新版本SpringCloud Gateway网关入门(一)

最新版本SpringCloud Gateway网关入门(一)

文章目录 背景 SpringCloud Gateway 简介 Gateway入门搭建 1. 创建一个SpringBoot...

SpringCloud之网关Gateway

SpringCloud之网关Gateway

这期内容用的是Spring Cloud官方的服务路由Spring Cloud Gateway  一、gateway基本使用 1、含义 Spring Cloud Gateway是Spring官方基于Spring5.0、SpringBoot2.0...

Spring Cloud Gateway中文文档一到五章(3.1.0)

Spring Cloud Gateway中文文档一到五章(3.1.0)

Spring Cloud Gateway 3.1.0 本项目提供了一个基于Spring 5、Spring Boot 2 和 Project Reactor的 Spring 生态系统之上的 API 网关。Spring Cloud Gateway 旨在...

GateWay路由网关的概述与入门详解

GateWay路由网关的概述与入门详解

一、概述简介 官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/ 1.是什么? Cloud全家桶中...

Springcloud gateway (史上最全)

Springcloud gateway (史上最全)

文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》持续更新+ 史上最全 + 面试必备 2000页+ 面试必备...

apigateway-kong(四)负载均衡理论及实现

Kong为多个后端服务提供了多种负载平衡请求方式:一种基于DNS的简单方法,以及一种更加动态的环平衡器,该方法还允许在不需要DNS服务器的情况下进行服务注册。 基于DNS的负载均衡   当使用基于DNS的负载均衡时,后端服务的注册是在Kong以外完成的,而Kong仅接收来自DNS服务器...

springcloud:网关组件gateway详解(三)

springcloud:网关组件gateway详解(三)

0. 引言 前两期我们针对微服务的概念和基本情况做了介绍,那么本期我们就针对其中最重要的网关组件来进行详细讲解。如果还不清楚这些基础概念的,可以查看前两期文章: 什么是分布式微服务,如何学习微服务(一) 微服务涉及哪些技术、有哪些核心组件(二...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。