• SpringCloud 之初识 GateWay


     

     前言

    什么是 GateWay 网关,在微服务中为了方便统一管理且对外暴露服务端地址,起到了内部和外部的隔离保证了后台服务的安全性。可以根据不同的规则讲不通的请求进行路由到指定的服务器。作用很强大,且统一。例如:网关鉴权丶跨域处理丶流量现流丶流量统计等等

    今天我们的主角是 GateWay

    Spring Cloud GateWay是Spring Cloud的⼀个全新项⽬,⽬标是取代Netflix Zuul,基于Spring5.0+SpringBoot2.0+WebFlux(基于⾼性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型)等技术开发,性能⾼于Zuul,官⽅测试,GateWay是Zuul的1.6倍。

    那么我们可以GateWay 做什么呢

    1. 路由转发 Route

    2. 处理前后端跨域问题

    3. 防止sql注入

    4. 防止web共计(xxl)

    5. 统一日志记录

    6. 网关鉴权(没用到,我的项目中鉴权抽离了一个单独的公共模块)

    7. 流量现流

    GateWay是工作原理

     

    客户端向 Spring Cloud Gateway 发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关 Web 处理程序。此处理程序通过特定于请求的过滤器链运行请求。过滤器用虚线划分的原因是过滤器可以在发送代理请求之前和之后运行逻辑。执行所有“预”过滤器逻辑。然后发出代理请求。

    使用 GateWay

    当然 网关最主要的功能还是路由的转发(今天我们就先看看路由是如何进行转发的)
    这是我自己的微服务项目 一共是4个服务

     

    首先引入依赖(这里就不引入其他的依赖了nacos的依赖等)

    1. <dependency>
    2. <groupId>org.springframework.cloudgroupId>
    3. <artifactId>spring-cloud-starter-gatewayartifactId>
    4. dependency>复制代码

    这个网关暂时很简单就是路由的转发和配置了一下跨域

    跨域:

    1. /**
    2. * @author Mr_xk
    3. * @version 1.0
    4. * @date 2021/6/20 15:01
    5. */@Configurationpublic class BugvipConfig { @Bean
    6. public CorsWebFilter corsWebFilter(){ UrlBasedCorsConfigurationSource sourse = new UrlBasedCorsConfigurationSource(); CorsConfiguration corsConfiguration = new CorsConfiguration(); //设置跨域请求头
    7. corsConfiguration.addAllowedHeader("*"); //设置方法
    8. corsConfiguration.addAllowedMethod("*"); //那个来源
    9. corsConfiguration.addAllowedOrigin("*"); //是否允许cookie
    10. corsConfiguration.setAllowCredentials(true);
    11. sourse.registerCorsConfiguration("/**",corsConfiguration); return new CorsWebFilter(sourse);
    12. }
    13. }复制代码

    下面我们看看路由的转发规则

    1. spring:
    2. application:
    3. name: bugvip-gatway
    4. cloud:
    5. nacos:
    6. discovery:
    7. server-addr: 192.168.1.12:8848
    8. gateway:
    9. discovery:
    10. locator:
    11. enabled: true #设置为true 请求路径前可以添加微服务名称
    12. lower-case-service-id: true # 允许为小写
    13. routes:
    14. - id: bugvip-boss
    15. uri: lb://bugvip-boss
    16. predicates:
    17. - Path=/api/boss/** ## 断言规则
    18. filters: - RewritePath=/api/(?.*),/${segment} ## 将api过滤掉
    19. - id: bugvip-admin
    20. uri: lb://bugvip-admin
    21. predicates:
    22. - Path=/api/admin/**
    23. filters: - RewritePath=/api/(?.*),/${segment}
    24. - id: bugvip-oss-image
    25. uri: lb://bugvip-oss-image
    26. predicates:
    27. - Path=/api/third/**
    28. filters: - RewritePath=/api/(?.*),/${segment}复制代码

    其实我这路由断言很简单 api/后面紧跟的就是区分服务的,再到filter将api过滤掉。也就是 Path 路由断言 Factory

    route

    路由(Route)是GateWay中最基本的组件之一,表示一个具体的路由信息载体,主要由下面几个部分组成:

    1. id:路由唯一标识,区别于其他的route

    2. url:路由指向的目的地URL,客户端请求最终被转发到的微服务

    3. order:用于多个Route之间的排序,数值越小越靠前,匹配优先级越高

    4. predicate:断言的作用是进行条件判断,只有断言为true,才执行路由

    5. filter: 过滤器用于修改请求和响应信息


    并且官方文档中提供了很多断言规则的
    例如:

    After 路由断言

    指定是时间之后的请求都会被断言到(当然 也有before 和  Between)

    1. spring:
    2. cloud:
    3. gateway:
    4. routes:
    5. - id: after_route
    6. uri: https://example.org
    7. predicates:
    8. - After=2017-01-20T17:42:47.789-07:00[America/Denver]复制代码

    Cookie 路由断言 Factory

    Cookie 路由断言 Factory有两个参数,cookie名称和正则表达式。请求包含次cookie名称且正则表达式为真的将会被匹配。

    1. spring:
    2. cloud:
    3. gateway:
    4. routes:
    5. - id: cookie_route
    6. uri: https://example.org
    7. predicates:
    8. - Cookie=chocolate, ch.p复制代码

    Query 路由断言 Factory

    参数 路由断言 Factory 有2个参数: 必选项 param(key) 和可选项 regexp(value).

    1. spring:
    2. cloud:
    3. gateway:
    4. routes:
    5. - id: query_route
    6. uri: https://example.org
    7. predicates:
    8. - Query=green复制代码

    这个断言为有参数green是进行路由

    1. spring:
    2. cloud:
    3. gateway:
    4. routes:
    5. - id: query_route
    6. uri: https://example.org
    7. predicates:
    8. - Query=red, gree.复制代码

    这个是参数有red 而且 gree.与他正则为true时就可以进行 路由
    Ok 官方为我提供了不少的断言规则

     

    大家感兴趣的 话可以去研究研究 官网地址:docs.spring.io/spring-clou…

    实践是检验真理的唯一准则,感兴趣的可以去试试呀!

  • 相关阅读:
    python 时间加法 输出t分钟后的时间
    pytest实现日志按用例输出到指定文件中
    世微 降压恒流驱动IC 景观亮化洗墙灯舞台灯汽车灯LED照明 AP5199S
    Java学习多态之向下转型
    CentOS7 rabbitmq3.8 与 erlang22. 安装、干净卸载
    MySQL 基本操作1
    漫谈信息模型(1)
    Redis Functions 介绍(二)
    怒刷LeetCode的第17天(Java版)
    如何通过Express和React处理SSE
  • 原文地址:https://blog.csdn.net/YYniannian/article/details/126278558