您的位置 首页 > 德语词汇

gateway是什么意思?Gateway

很多朋友对于gateway是什么意思和Gateway不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

gateway是什么意思?Gateway

在微服务架构中,通常一个系统会被拆分为多个微服务,微服务之间的调用可以用OpenFeign,但面对这么多微服务客户端调用会遇到哪些问题呢?

为了解决上面的问题,微服务引入了网关的概念,网关为微服务架构的系统提供简单、有效且统一的API路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。

SpringCloudGateway是SpringCloud新推出的网关框架,之前是NetflixZuul。

简单来说:Gateway相当于医院大厅的挂号台,对病人进行引流。

Route(路由):是构建网关的基本模型,由ID,URI一系列的断言和过滤器组成。

Predicate(断言):可以匹配Http请求中所有的内容(请求头参数等等)请求与断言,相匹配则通过当前断言。

Filter(过滤器):包括全局和局部过滤器,可以在请求被路由钱后对请求进行更改。

前面我们学习过Nacos,可以帮助我们管理我们的服务,学习SpringCloudGateway时,我们可以直接将Nacos整合进来。

复制之前的Sentinel项目,在此基础上添加api-gateway子模块

<!--gateway网关-->\n<dependency>\n<groupId>org.springframework.cloud</groupId>\n<artifactId>spring-cloud-starter-gateway</artifactId>\n</dependency>\n\n<!--由于springcloud2020弃用了Ribbon,因此Alibaba在2021版本nacos中删除了Ribbon的jar包,因此无法通过lb路由到指定微服务,会出现503情况。需要引入springcloudloadbalancer包-->\n<dependency>\n<groupId>org.springframework.cloud</groupId>\n<artifactId>spring-cloud-starter-loadbalancer</artifactId>\n</dependency>\n\n\n\n<!--其它包-->\n<!--服务注册与发现jar包-->\n<dependency>\n<groupId>com.alibaba.cloud</groupId>\n<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>\n</dependency>\n\n<dependency>\n<groupId>org.projectlombok</groupId>\n<artifactId>lombok</artifactId>\n</dependency>\n\n<!--nacos配置中心-->\n<dependency>\n<groupId>com.alibaba.cloud</groupId>\n<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>\n</dependency>\n\n<!--识别bootstrap.yml文件-->\n<dependency>\n<groupId>org.springframework.cloud</groupId>\n<artifactId>spring-cloud-starter-bootstrap</artifactId>\n<version>3.0.2</version>\n</dependency>\n\n3.添加配置文件

GATEWAY-dev.yml

server:\nport:9000\nspring:\napplication:\nname:GATEWAY\ncloud:\nloadbalander:#注意这里要排除ribbon\nribbon:\nenable:false\ngateway:\nroutes:\n-id:search_route\nuri:lb://SEARCH\npredicates:\n-Path=/search-service/**\nfilters:\n-StripPrefix=1\n

注解:http://localhost:9000/search-service/goodshttp://localhost:8083/goods

routes:路由/路由数组当请求满足指定的条件后转发到哪个微服务上\n\nid:当前路由唯一的标识符,有默认值,也可以自定义\n\nuri:请求最终要被转到的地址,lb为loadbalance,表示负载均衡,比如lb://SEARCH表示请求最终会转发到SEARCH服务,注意lb://后面的<clientName>一定不要使用下划线,即不要使用比如:my_service这种形式,否则LoadBanancer不会起作用。\n\npredicates:断言,也就是条件判断,-Path=/search-service/表示当客户端访问http://localhost:9000/search-service/goods时会路由到http://localhost:8083/search-service/goods(我这里的SEARCH路径地址为http://localhost:8083),这个无法访问,需要filters过滤下\n\nfilters:过滤器,在请求传递过程中,对请求做一下处理,比如添加请求头,去掉部分路径等。-StripPrefix=1表示转发之前去掉第一层路由,也就是转发到http://localhost:8083/goods\n4.添加bootstrap.yml文件

spring:\ncloud:\nnacos:\ndiscovery:\nserver-addr:http://localhost:8848\nconfig:\nserver-addr:http://localhost:8848\nnamespace:dev\ngroup:DEFAULT_GROUP\nusername:nacos\npassword:nacos\nprefix:GATEWAY\nfile-extension:yml\nshared-configs:\n-common.yml\nconfig:\nactivate:\non-profile:dev\n5.启动6.测试:7.也可以直接拿nacos服务名为断言

修改GATEWAY-dev.yml配置信息为:

server:\nport:9000\nspring:\napplication:\nname:GATEWAY\ncloud:\nnacos:\ndiscovery:\nserver-addr:localhost:8848\nloadbalander:\nribbon:\nenable:false\ngateway:\ndiscovery:\nlocator:\nenabled:true\n

spring.cloud.gateway.discovery.locator.enabled=true,表示会拿nacos服务名为断言,也会将服务名进行过滤,从而路由到该服务的请求。所以访问:http://localhost:9000/SEARCH/goods会路由到http://localhost:8083/goods

断言就是在进入网关请求之前所做的操作,也就是先执行的程序,和生活中坐车一样,首先必须进行安检,然后查票,验证票最终才可以坐车。

在这里的理解就是:当满足某种条件后才会被转发,如果是多个,那就是都满足的情况下被转发。

SpringCloudGateway可以匹配各种路由,而其内部就包括许多内置的路由断言工厂。所有这些断言都匹配HTTP请求的不同属性。您可以将多个路由断言工厂与逻辑和语句组合在一起使用。

Path是最常见的断言请求,匹配指定路径下的请求,可以是具体的请求,也可使用/**表示匹配所有子级请求,配置如下。

spring:\ncloud:\ngateway:\nroutes:\n-id:after_route\nuri:lb://SEARCH\npredicates:\n-Path=/search-service/**\n

配置中匹配了以/search-service开头的请求,如果是其他URL的请求进入系统,会出现错误。

AfterRoutePredicate(匹配时间后的请求)AfterRoutePredicate可以匹配ZonedDateTime类型的时间,表示:匹配在指定日期时间之后发生的请求,配置如下:

spring:\ncloud:\ngateway:\nroutes:\n-id:after_route\nuri:lb://SEARCH\npredicates:\n-Path=/search-service/**\n-After=2022-07-8T14:00:00+08:00[Asia/Shanghai]\n

配置中匹配了2022-07-814:00:00后的请求,如果是在指定时间之前进入系统的请求,会出现错误。

BeforeRoutePredicate(匹配时间前的请求)BeforeRoutePredicate可以匹配ZonedDateTime类型的时间,表示:匹配在指定日期时间之前发生的请求,配置如下:

spring:\ncloud:\ngateway:\nroutes:\n-id:after_route\nuri:lb://SEARCH\npredicates:\n-Path=/search-service/**\n-Before=2022-07-8T14:00:00+08:00[Asia/Shanghai]\n

配置中匹配了2022-07-814:00:00之前的请求,如果是在指定时间之后进入系统的请求,会出现错误。

BetweenRoutePredicate(匹配时间之间的请求)BetweenRoutePredicate可以匹配ZonedDateTime类型的时间,由两个ZonedDateTime参数组成,第一个参数为开始时间,第二参数为结束时间,表示:匹配在指定的开始时间与结束时间之内发生的请求,配置如下:

spring:\ncloud:\ngateway:\nroutes:\n-id:after_route\nuri:lb://SEARCH\npredicates:\n-Path=/search-service/**\n-Between=2022-07-8T14:00:00+08:00[Asia/Shanghai],2022-07-28T14:00:00+08:00[Asia/Shanghai]\n

配置中匹配2022-07-814:00:00到2022-07-2814:00:00之内时间段的请求,如果是在指定时间段外的进入系统的请求,会出现错误。

CookieRoutePredicate由两个参数组成,第一个参数为cookie的Key,第二参数为cookie的Value,表示:匹配指定名称且其值与正则表达式匹配的cookie的请求,配置如下:

spring:\ncloud:\ngateway:\nroutes:\n-id:after_route\nuri:lb://SEARCH\npredicates:\n-Path=/search-service/**\n-Cookie=cookieName,\\d+\n

配置中匹配了cookie的Key为cookieName,值为满足\\d+的正则表达式请求,如果满足cookieName不满足\\d+的请求,会出现错误。

HeaderRoutePredicate由两个参数组成,第一个参数为Header名称,第二参数为Header的Value值,表示:匹配指定名称且其值与正则表达式匹配的Header的请求,配置如下:

spring:\ncloud:\ngateway:\nroutes:\n-id:after_route\nuri:lb://SEARCH\npredicates:\n-Path=/search-service/**\n-Header=X-Request-Id,\\d+\n

配置中匹配了Header的名称为X-Request-Id,值为满足\\d+的正则表达式请求,如果满足headerName不满足\\d+的请求,会出现错误。

HostRoutePredicate参数为请求的Host地址,多个参数使用逗号分割,设置的Host地址可以使用**表示通配符,配置如下:

spring:\ncloud:\ngateway:\nroutes:\n-id:after_route\nuri:lb://SEARCH\npredicates:\n-Host=**.test1.com,**.test2.com\n

配置中匹配的Host,可以匹配以test1.com或者test2.com结尾的Host地址,其他Host地址访问会出现错误。

MethodRoutePredicate由一个或多个HTTPMethod组成,比如:POST、PUT、GET、DELETE,配置如下:

spring:\ncloud:\ngateway:\nroutes:\n-id:after_route\nuri:lb://SEARCH\npredicates:\n-Path=/search-service/**\n-Method=GET,POST\n

配置中匹配了HTTPMethod的类型为GET和POST,如果是其他类型的HTTPMethod,会出现错误。

QueryRoutePredicate由两个参数组成,第一个参数为参数名称,第二参数为参数的值(满足正则即可),表示:匹配指定名称且其值与正则表达式匹配的带参的请求,配置如下:

spring:\ncloud:\ngateway:\nroutes:\n-id:after_route\nuri:lb://SEARCH\npredicates:\n-Path=/search-service/**\n-Query=name,\\d+\n

配置中匹配了参数名称叫做name,值满足\\d+的请求,如果不满足\\d+,会出现错误。

RemoteAddrRoutePredicate的参数由CIDR表示法(IPv4或IPv6)字符串组成,配置如下:

spring:\ncloud:\ngateway:\nroutes:\n-id:after_route\nuri:lb://SEARCH\npredicates:\n-Path=/search-service/**\n-RemoteAddr=192.168.1.1/24\n

配置中可以匹配IP为192.168.1.1–192.168.1.254的值,如果不满足192.168.1.1/24的IP规则,会出现错误。

WeightAddrRoutePredicate由group和weight(权重数值)组成,表示将相同的请求根据权重跳转到不同的uri地址,要求group的名称必须一致,配置如下:

spring:\ncloud:\ngateway:\nlocator:\nenabled:true\nroutes:\n-id:weight_route1\nuri:lb://SEARCH\npredicates:\n-Path=/weight/**\n-Weight=group3,1\n-id:weight_route2\nuri:lb://USERS\npredicates:\n-Path=/weight/**\n-Weight=group3,9\n\n

如上配置了两个对于/weight/**路径转发的路由定义,这两个路由是同一个权重分组,且weight_route1权重为1,weight_route2权重为9。对于10个访问/weight/**路径的请求来说,将会有9个路由到weight_route2,1个路由到weight_route1。

假设我们需要对访问的用户年龄做限制,只允许18-60岁之间的人来访问。我们可以自己定义断言来实现

packagecom.test.apigateway.Predicate;\n\nimportcom.alibaba.cloud.commons.lang.StringUtils;\nimportorg.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;\nimportorg.springframework.stereotype.Component;\nimportorg.springframework.util.MultiValueMap;\nimportorg.springframework.validation.annotation.Validated;\nimportorg.springframework.web.server.ServerWebExchange;\n\nimportjava.util.Arrays;\nimportjava.util.List;\nimportjava.util.function.Consumer;\nimportjava.util.function.Predicate;\n\n\n@Component\n\n//自定义路由断言工厂\n\npublicclassMyAgeRoutePredicateFactoryextendsAbstractRoutePredicateFactory<MyAgeRoutePredicateFactory.Config>{\n\n\npublicMyAgeRoutePredicateFactory(){\nsuper(MyAgeRoutePredicateFactory.Config.class);\n}\n\n//将配置文件中的值按返回集合的顺序,赋值给配置类\n@Override\npublicList<String>shortcutFieldOrder(){\nreturnArrays.asList(newString[]{"minAge","maxAge"});\n}\n\n@Override\npublicPredicate<ServerWebExchange>apply(Consumer<Config>consumer){\nreturnsuper.apply(consumer);\n}\n\n@Override\npublicPredicate<ServerWebExchange>apply(Configconfig){\n//创建网关断言对象\nreturnnewPredicate<ServerWebExchange>(){\n//检查\n@Override\npublicbooleantest(ServerWebExchangeserverWebExchange){\n//获取请求参数age,判断是否满足[18,60)\nMultiValueMap<String,String>queryParams=serverWebExchange.getRequest().getQueryParams();\nStringage=queryParams.getFirst("age");\nif(!StringUtils.isEmpty(age)&&age.matches("[0-9]+")){\nintiAge=Integer.parseInt(age);\nif(iAge>=config.minAge&&iAge<config.maxAge){\nreturntrue;\n}\n}\nreturnfalse;\n}\n};\n}\n\n//配置类,属性用于接收配置文件中的值\n@Validated\npublicstaticclassConfig{\nprivateintminAge;\nprivateintmaxAge;\n\npublicintgetMinAge(){\nreturnminAge;\n}\n\npublicvoidsetMinAge(intminAge){\nthis.minAge=minAge;\n}\n\npublicintgetMaxAge(){\nreturnmaxAge;\n}\n\npublicvoidsetMaxAge(intmaxAge){\nthis.maxAge=maxAge;\n}\n}\n}\n

要求:

类必须要加上RoutePredicateFactory作为结尾

类必须继承AbstractRoutePredicateFactory

gateway:\nroutes:\n-id:myage\nuri:lb://SEARCH\npredicates:\n-Path=/search-service/**\n-MyAge=18,60\nfilters:\n-StripPrefix=1\n

MyAge即是我们新建断言工厂的前缀名,自动识别的。

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

PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。

POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTPHeader、收集统计信息和指标、将响应从微服务发送给客户端等。

是指作用在某一个路由上,SpringCloudGateway内置了很多路由过滤器,他们都是由GatewayFilter的工厂类产生。

比如AddRequestParameterGatewayFilter

比如我在SEARCH服务有一个带有page参数的接口,我想请求网关路由转发的时候给加上一个page=1的参数。

再比如前面用过的-StripPrefix=1,表示把请求网关的路径前缀的第一级去掉。

内置过滤器很多,我们这里举一个例子看一下使用方式,其它的可以看帮助手册

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/

全局过滤器在系统初始化时就作用于所有的路由,不需要单独去配置。全局过滤器的接口定义类是GlobalFilter,Gateway本身也有很多内置的过滤器。

该过滤器会解析到以lb://开头的uri,比如这样的配置:

gateway:\nroutes:\n-id:abc\nuri:lb://SEARCH\npredicates:\n-Path=/search-service/**\nfilters:\n-StripPrefix=1\n-AddRequestParameter=page,1\n

它会使用SpringCloud的LoadBalancerClient来将SEARCH服务解析成实际的host和port,重新组装请求的url。

它是作用于全局,而且并不需要配置。

启用ReactorNetty访问日志:-Dreactor.netty.http.server.accessLogEnabled=true

<!--导入sentinel-->\n<dependency>\n<groupId>com.alibaba.cloud</groupId>\n<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>\n</dependency>\n\n<!--导入sentinel整合Gateway-->\n<dependency>\n<groupId>com.alibaba.cloud</groupId>\n<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>\n</dependency>\n1.2.添加配置信息

sentinel:\ntransport:\nport:8888\ndashboard:http://localhost:8080\n1.3.测试

启动Sentinel,重启网关微服务,运行一次服务中的接口,再次刷新Sentinel,会出现以下内容,表示整合成功

从1.6.0版本开始,Sentinel提供了SpringCloudGateway的适配模块,可以提供两种资源维度的限流:

route维度:即在配置文件中配置的路由条目,资源名为对应的routeId,这种属于粗粒度的限流,一般是对某个微服务进行限流。

自定义API维度:用户可以利用Sentinel提供的API来自定义一些API分组,这种属于细粒度的限流,针对某一类的uri进行匹配限流,可以跨多个微服务。

这里的Burstsize是指:应对突发请求时额外允许的请求数目。

还可以设置针对断言的请求属性:

文章到此结束,如果本次分享的gateway是什么意思和Gateway的问题解决了您的问题,那么我们由衷的感到高兴!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023