当前位置: 首页 > article >正文

Gateway的基本概念

1.Gateway概念介绍

1.1Gateway介绍

Gateway网络为微服务架构提供简单且统一的API路由管理,作为系统的统一入口。

Gateway可以为客户端提供统一的服务,例如认证、路由转发、防刷、流量控制、监控日志等。

Gateway是无状态的,不存放数据,所以可以搭建Gateway集群。通过它前面的nginx可负载均衡到指定的网关。

Spring Cloud Gateway是由WebFlux+Netty+Reactor实现的响应式的API网关。它不能在传统的servlet容器中工作,也不能构建成war包。

1.2核心概念

  • 路由(route):路由是网关中最基础的部分,路由信息包括一个ID、一个URI、一组断言工厂、一组Filter组成。
  • 断言(predicates):断言函数允许开发者去定义匹配Http request中的任何信息,比如请求头和参数等。如果断言为真,则说明请求的URL和配置的路由匹配
  • 过滤器(Filter):Spring Cloud Gateway中的filter分为Gateway Filter和Global Filter。Filter可以对请求和响应进行处理。Filter只有pre和post两种。

1.3工作原理 

客户端去访问下游的微服务,服务端不可能直接暴露下游的微服务,我们仅仅是提供一个统一的入口。Handler Mapping来做路由匹配,包含path和断言,进行判断,然后就走过滤器链Handler。

客户端向Spring Cloud Gateway发出请求,如果请求与网关定义的路由匹配,则该请求就会被发送到网关Web处理程序,此时处理程序运行特定的请求过滤链处理。过滤完,从nacos拉去服务列表,拿到服务节点,调用节点服务。(如果存在nacos注册中心)

2.详细介绍

2.1路由断言工厂Route Predicate Factories

predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地。

application.yml配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件。

网关内置的断言工厂有很多,例如:After(时间),Before(时间),Between(时间),Cookie,Header(请求头),Host,Method,Path(路径)等。

2.2过滤器工厂(Gateway Filter Factories)

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的相应做处理

2.2.1自定义过滤器工厂

需要继承AbstractNameValueGatewayFilterFactory且我们的自定义名称必须要以GatewayFilterFactory结尾并交给spring管理。

2.3全局过滤器(Global Filter)

全局过滤器的作用是处理一切进入网关的请求和微服务响应,与Gateway Filter的作用一样。

  • GatewayFilter:网关过滤器,需要通过spring.cloud.routes.filters配置在具体的路由下,只作用在当前特定路由上,也可以通过配置spring.cloud.default-filters让它作用于全局路由上。(配置文件
  • GlobalFilter:全局过滤器,不需要在配置文件中配置,作用在所有的路由上。最终通过GatewayFilterAdapter包装成GatewayFilterChain能够识别的过滤器。

2.3.1ReactiveLoadBalancerClientFilter

在配置文件中,比如配置了lb://myservice,它将会使用Spring Cloud的Load BalancerClient将myservice解析成实际的host和port。

该过滤器整合了负载均衡器loadbalancer。

2.3.2自定义全局过滤器

实现Global,Ordered接口,重写filter和getOrder方法即可。每一个过滤器都必须指定一个int类型的order值,order值越小,过滤器优先级越高,执行顺序越靠前。

2.4Gateway跨域问题

同源策略:它会组织一个域的js脚本和另外一个域的内容进行交互。如果缺少了同源策略,浏览器很容易受到XSS、CSRF等攻击。所谓同源(即在一个域)就是两个页面具有相同的协议(protocol)、主机(host)是和端口号(port)

解决方案:

2.4.1通过yml方式

配置cors-configurations属性即可

2.4.2通过java配置的方式

javaBean方式配置跨域处理

@Configuration
public class CorsConfig {
    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);

        return new CorsWebFilter(source);
    }
}

 2.5基于Redis+lua脚本限流

spring cloud官方提供了RequestRateLimiter过滤器工厂,基于redis+lua脚本方式采用令牌桶算法实现了限流。(令牌桶:限制数据的平均传输速率,还允许某种程度的突发传输,具体和令牌桶的容量有关。)

(nginx除令牌桶算法外,还有漏桶算法:出水的速率恒定,也就是限制了数据的平均传输速率,如果请求过多,则拒绝)

  1. 添加redis和commons-pool依赖
  2. 在application.yml添加redis和RequestRateLimiter过滤器工厂配置
  3. 配置keyResovler,可以指定限流策略,比如url限流、参数限流、ip限流等
@Bean
KeyResolver keyResolver() {
  //url限流
  return exchange -> Mono.just(exchange.getRequest().getURI().getPath());
  //参数限流
  //return exchange ->Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
}


http://www.kler.cn/news/289739.html

相关文章:

  • Django + websocket 连不上
  • 内部知识库:企业智慧资产的安全守护者
  • 低秩近似概念
  • Dev C++:简单步骤下载与安装指南
  • DHCPv6 浅析 配置示例
  • 基于vue框架的超市商品管理系统m9o29(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • Redis Desktop Manager 0.8.8.384 安装与使用详解
  • Spire.PDF for .NET【文档操作】演示:创建 PDF 文档
  • python-实战4拆分pdf文件
  • 小土堆pytorch
  • CSS实现水滴效果图
  • 【Linux】进程间的关系(第十三篇)
  • oracle日期加减方式
  • 【区块链 + 物联网】智慧路灯计费和融资区块链解决方案 | FISCO BCOS应用案例
  • H265视频转换H264视频对应m3u8格式地址播放完整案例
  • IP地址查询功能详解—构建风险画像与代理识别
  • 传统CV算法——特征匹配算法
  • 创建MySQL数据库和相应表
  • C#复习之封装_静态成员
  • 「数组」计数排序|桶排序|基数排序(C++)
  • Android的Launch
  • 花10秒进来学学吧!用AI画朵云,点赞也能10万+
  • 深度学习速通系列:鲁棒性和稳定性
  • 二手手机回收小程序搭建,小程序功能特点
  • 力扣9.2
  • iscntrl函数讲解 <ctype.h>头文件函数
  • 运动耳机怎么选购?解密最值得购买的五大品牌!
  • 【算法专场】模拟(上)
  • CAAC执照无人机实训室建设技术详解
  • Nuxt3入门:样式的注入、定义和使用(第3节)