当前位置: 首页 >服务端 > SpringCloud 之 Gateway网关 详解

SpringCloud 之 Gateway网关 详解

Gateway 新一代网关


  • 概述简介
  • 三大核心概念
  • Gateway工作流程
  • 入门配置
  • 通过微服务名实现动态路由
  • Predicate的使用
  • Filter的使用


概述简介


是什么


SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

能干吗


  • 反向代理
  • 鉴权
  • 流量监控
  • 熔断
  • 日志监控
  • 。。。。。

微服务架构中网关在哪里


SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

为什么选择Gateway


SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

Gateway 使用 Spring WebFlux 和 Netty:

SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

三大核心概念


  • Route(路由)

    路由是构建网关的基本模块,它又ID、目标url、一系列的断言和过滤器组成,如果断言为true则匹配该路由

  • Predicate(断言)

    参考的是Java8的 java.util.function.Predicate

    开发人员可以匹配Http请求中的所有内容(例如请求头和请求参数),如果请求和断言相匹配则进行路由

  • Filter(过滤)

    指的是spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改

  • 总体

    SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

Gateway工作流程


官网总结


SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

核心逻辑


  • 路由转发 + 执行过滤器链

入门配置


  • 新建module cloud-gateway-gateway9527

  • 改pom

    新加入gateway依赖:

    <!--gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>  </dependency>
  • 写配置

  • 业务类 无

  • 主启动类

    加上 @EnableEurekaClient

  • 9527网关如何做到路由映射

    目前不想暴露8001端口,希望在8001外面套一层9527

  • yml新增网关配置:

    #gateway网关配置spring:  cloud:gateway:  routes:- id: payment_routh #payment_routh#路由的ID,没有固定规则但要求唯一,建议配合服务名  uri: http://localhost:8001 #匹配后提供服务的路由地址  predicates:- Path=/payment/get/**  #断言,路径相匹配的进行路由- id: payment_routh2 #payment_routh#路由的ID,没有固定规则但要求唯一,建议配合服务名  uri: http://localhost:8001  #匹配后提供服务的路由地址  predicates:- Path=/payment/lb/** #断言,路径相匹配的进行路由
  • 测试:

    • 启动7001
    • 启动8001
    • 启动9527网关
  • 访问说明

    • 添加网关之前:

      SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

    • 添加网关之后:

      SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

    SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

yml配置说明


gateway网关路由有两种配置方式:

  • 在配置文件ynl中配置

  • 代码中注入 RouteLocator 的 Bean

    官网案例:

    SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

    业务需求:通过9527网关访问到外网的百度新闻网址

    SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

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


SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

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

  1. 启动:一个eureka7001 + 两个服务提供者8001、8002

  2. 配置yml:

    SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

  3. 测试

    启动9527,访问 http://localhost:9527/pay/lb

    多次访问,可以看到:8001、8002两个端口互相切换

Predicate(断言)的使用


是什么


Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route(路由)进行处理

启动 微服务9527:

SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

常用的Route Predicate


SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

After Route Predicate Factory:


表示需要在After后面的时间之后的请求才会正确响应

SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

使用下面的类生成的 当前时间串 来填充上面的 After 后的位置,然后在时间串上进行修改

SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

Cokiee Route Predicate:


表示需要携带cookie访问微服务

SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

测试方法:

  • jmeter
  • postman
  • curl

curl检测:

不带Cookie访问:

SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

携带Cookie访问:

SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

Header Route Predicate:


表示需要携带http请求头进行访问

SpringCloud 之 Gateway网关 详解 _ JavaClub全栈架构师技术笔记

Filter的使用


Spring Cloud GateWay的Filter


生命周期:

  • pre(业务逻辑之前)
  • post(业务逻辑之后)

种类:

  • GatewayFilter(单一的)(31种)
  • GlobalFilter(全局的)(10种)

自定义过滤器


自定义全局过滤器

两个主要接口介绍:implements GlobalFilter,Ordered

作用:

  • 全局日志记录
  • 统一网关鉴权
  • 。。。

案例代码:

@Slf4j@Componentpublic class MyLogGatewayFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("进入全局日志记录 "+new Date());String name = exchange.getRequest().getQueryParams().getFirst("name");if (name == null){log.info("非法用户");//返回请求不被接受的状态码exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);}retu chain.filter(exchange);}@Overridepublic int getOrder() {retu 0;}}

测试:

  • 启动 注册中心7001、服务提供者8001,8002、网关9527
  • 访问:使用正确地址(携带用户名):http://localhost:9527/pay/lb?name=zl
  • 访问通过

作者:qie ting feng yin
来源链接:https://blog.csdn.net/qq_52567278/article/details/124936250

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

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





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

标签:Gateway
分享给朋友:

“SpringCloud 之 Gateway网关 详解” 的相关文章