这篇SpringCloud GateWay 详解,你用的到

网站建设4年前发布
71 00

在微服务架构中,通常一个系统会被拆分为多个微服务,面对这么多微服务客户端应该如何去调用呢?如果没有其他更优方法,我们只能记录每个微服务对应的地址,分别去调用,但是这样会有很多的问题和潜在因素。,为了解决上面的问题,微服务引入了 网关 的概念,网关为微服务架构的系统提供简单、有效且统一的API路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。,网关在微服务中的位置:,自己手绘的,官网上的,官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-starter。,Spring Cloud Gateway 是Spring Cloud的一个全新的API网关项目,目的是为了替换掉Zuul1,它基于Spring5.0 + SpringBoot2.0 + WebFlux(基于⾼性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型)等技术开发,性能⾼于Zuul,官⽅测试,Spring Cloud GateWay是Zuul的1.6倍 ,旨在为微服务架构提供⼀种简单有效的统⼀的API路由管理⽅式。,路由(Route)是GateWay中最基本的组件之一,表示一个具体的路由信息载体,主要由下面几个部分组成:,当用户发出请求达到 GateWay 之后,会通过一些匹配条件,定位到真正的服务节点,并且在这个转发过程前后,进行一些细粒度的控制,其中 Predicate(断言) 是我们的匹配条件,Filter 是一个拦截器,有了这两点,再加上URL,就可以实现一个具体的路由,核心思想:路由转发+执行过滤器链。,这个过程就好比考试,我们考试首先要找到对应的考场,我们需要知道考场的地址和名称(id和url),然后我们进入考场之前会有考官查看我们的准考证是否匹配(断言),如果匹配才会进入考场,我们进入考场之后,(路由之前)会进行身份的登记和考试的科目,填写考试信息,当我们考试完成之后(路由之后)会进行签字交卷,走出考场,这个就类似我们的过滤器。,Route(路由) :构建网关的基础模块,由ID、目标URL、过滤器等组成。,Predicate(断言)  :开发人员可以匹配HTTP请求中的内容(请求头和请求参数),如果请求断言匹配则进行路由。,Filter(过滤)  :GateWayFilter的实例,使用过滤器,可以在请求被路由之前或者之后对请求进行修改。,通过上述讲解已经了解了基础概念,我们来动手搭建一个GateWay项目,来看看它到底是如何运行的 新建项目:cloud-alibaba-gateway-9006。,GateWay属于SprinigCloud且有web依赖,在我们导入对应依赖时,要注意版本关系,我们这里使用的版本是 2.2.x的版本,所以配合使用的Hoxton.SR5版本。,父类pom引用:,子类POM引用:,yml配置:,我们在之前的cloud-alibaba-nacos-9001项目中添加下面测试代码:,启动Nacos、cloud-alibaba-nacos-9001、cloud-alibaba-gateway-9006通过gateway网关去访问9001的mxn/order看看。,首先我们在Nacos中看到我们服务是注册到Nacos中了。,然后我们访问http://localhost:9001/mxn/hello​,确保是成功的,再通过http://localhost:9006/mxn/hello去访问,也是OK,说明我们GateWay搭建成功,我们进入下一步。,在上述方法中我们是通过YML去完成的配置,GateWay还提供了另外一种配置方式,就是通过代码的方式进行配置,@Bean 注入一个 RouteLocator。,我们可以将路由注释掉之后看一下,重启9006服务,访问地址http://localhost:9006/mxn/hello 就可以转发到9001中具体的接口中。,这里并不推荐,使用代码的方式来进行配置gateWay,大家有个了解就可以,因为代码的配置维护的成本比较高,而且对于一些需要修改的项,需要改代码才可以完成,这样不利于维护和拓展,所以还是推荐大家使用yml进行配置。,在上述的讲解中,我们已经掌握了 GateWay 的一些基本配置和两种使用方式,下面我们就来讲解一下 GateWay 如何实现负载均衡,我们只需要在9006中添加lb://nacos-provider就可以显示负载均衡。,当我们去访问http://localhost:9006/mxn/hello的时候,就可以看到9001和9002不停的切换。,在这一篇中我们来研究一下 断言 ,我们可以理解为:当满足条件后才会进行转发路由,如果是多个,那么多个条件需要同时满足。,在官方提供的断言种类有11种(最新的有12种类型):,具体地址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories。,After :表示配置时间之后才进行转发。,时间戳获取代码,用于时间代码的获取:,如果在时间段之前访问则404。,匹配ZonedDateTime类型的时间,表示匹配在指定日期时间之前的请求,之后的请求则拒绝404错误。,Between 可以匹配ZonedDateTime类型的时间,由两个ZonedDateTime参数组成,第一个参数为开始时间,第二参数为结束时间,逗号进行分隔,匹配在指定的开始时间与结束时间之内的请求,配置如下:,由两个参数组成,分别为name(Key)和regexp(正则表达式)(Value),匹配具有给定名称且其值与正则表达式匹配的Cookie。,路由规则会通过获取Cookie name值和正则表达式去匹配,如果匹配上就会执行路由,如果匹配不上则不执行。,小写字母匹配成功:,数字匹配不成功:,由两个参数组成,第一个参数为Header名称​,第二参数为Header的Value值,指定名称的其值和正则表达式相匹配的Header的请求。,请求头携带数字断言请求成功。,断言字母匹配失败:,匹配当前请求是否来自于设置的主机。,满足Host断言,请求成功。,不满足Host断言失败,可以设置一个或多个参数,匹配HTTP请求,比如POST,PUT,GET,DELETE。,GET断言成功:,PUT断言请求失败:,由两个参数组成,第一个为参数名称(必须),第二个为参数值(可选-正则表达式),匹配请求中是否包含第一个参数,如果有两个参数,则匹配请求中第一个参数的值是否符合第二个正则表达式。,断言匹配 请求成功。,参数由CIDR 表示法(IPv4 或 IPv6)字符串组成,也就是匹配的ID地址,配置如下:,需要两个参数group和weight(int)权重数值,实现了路由权重功能,表示将相同的请求根据权重跳转到不同的uri地址,要求group的名称必须一致。,直接访问http://localhost:9006/可以看到我们请求的地址成8/2比例交替显示, 80% 的流量转发到https://blog.csdn.net/qq_14996421,将约 20% 的流量转发到https://juejin.cn/user/2700056290405815。,Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理。如果有多个断言则全部命中后进行处理。,路由过滤器允许修改传入的HTTP请求或者返回的HTTP响应,路由过滤器的范围是特定的路由。,Spring Cloud GateWay 内置的Filter生命周期有两种:pre(业务逻辑之前)、post(业务逻辑之后)。,GateWay本身自带的Filter分为两种:GateWayFilter(单一)、GlobalFilter(全局)。,GateWay Filter提供了丰富的过滤器的使用,单一的有32种,全局的有9种,有兴趣的小伙伴可以了解一下。,官方参考网址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#global-filters。,StripPrefix 在我们当前请求中,通过规则值去掉某一部分地址,比如我们有一台服务中加入了一个前端nacos-provider想要通过这个去访问,我们在项目cloud-alibaba-nacos-9001中加入 context-path。,现在9001的访问路径变为http://localhost:9001/nacos-provider/mxn/hello,但是如果我们通过网关去访问路径就会变成http://localhost:9006/mxn/nacos-provider/mxn/hello 这个时候我们通过这个路径去访问是访问不成功的,想要解决这个方法,这个就用到了我们FIlter 中的 StripPrefix。,我们重新启动9006项目,再去访问。,虽然Gateway给我们提供了丰富的内置Filter,但是实际项目中,自定义Filter的场景非常常见,因此单独介绍下自定义FIlter的使用。,想要实现GateWay自定义过滤器,那么我们需要实现GatewayFilter接口和Ordered接口。,当我们访问http://localhost:9006/mxn/nacos-provider/mxn/hello请求,没有携带ID参数,请求失败。,当我们访问http://localhost:9006/mxn/nacos-provider/mxn/hello?id=1请求,请求成功。,到这里我们的GateWay就讲解完了,对于GateWay的核心点主要有三个Route\Predicate\Filter,我们搞懂了这三点,基本上对于GateWay的知识就掌握的差不多了,GateWay核心的流程就是:路由转发+执行过滤器链。

© 版权声明

相关文章