天天新资讯:gateway基本配置教程
【资料图】
目录
1、gateway简介2、gateway核心概念3、路由4、断言5、过滤器5.1、过滤器介绍5.2、内置局部过滤器与使用5.3、内置全局过滤器5.4、自定义全局过滤器5.4.1、黑名单校验5.4.2、模拟登录校验6、一个简单的gateway配置实例1、gateway简介
路由转发 + 执行过滤器链。
网关,旨在为微服务架构提供一种简单有效的统一的API路由管理方式。同时,基于Filter链的方式提供了网关的基本功能,比如:鉴权、流量控制、熔断、路径重写、黑白名单、日志监控等。
基本功能如下:
2、gateway核心概念
路由(Route):由一个ID,一个目标URI(最终路由到的url地址),一组断言(匹配条件判断)和一组过滤器定义。如果断言为真,则路由匹配。断言(Predicate):通过断言匹配http请求中的任何内容(请求头、请求参数等),如果匹配成功,则匹配断言所在路由。过滤器(Filter):在请求前后执行业务逻辑,比如鉴权、日志监控、流量控制、修改请求头、修改响应等。3、路由
spring: cloud: gateway: routes: - id: manager # 路由唯一标识 uri: lb://manager_server # 路由指向目的地URL或服务名,客户端请求最终被转发到的微服务 predicates: - Path=/manager/** # 断言:以manager开头的请求都负载到manager_server服务 filters: - RewritePath=/manager/(?.*), /$\{segment} # 过滤器:过滤掉url里的manager,例如http://ip:port/manager/test -> http://ip:port/test order: 5 # 用于多个Route之间的排序,数值越小越靠前,匹配优先级越高
4、断言
spring:
cloud:
gateway:
routes:
- id: manager
uri: https://manager_server
predicates:
- After=2017-01-20T17:42:47.789-07:00[America/Denver] # 时间点后匹配
- Before=2017-01-20T17:42:47.789-07:00[America/Denver] # 时间点前匹配
- Between=2017-01-20T17:42:47.789-07:00[America/Denver],2017-01-21T17:42:47.789-07:00[America/Denver] # 时间区间匹配
- Cookie=chocolate, ch.p # 指定cookie正则匹配
- Header=X-Request-Id, \d+ # 指定Header正则匹配
- Host=**.somehost.org,**.anotherhost.org # 请求Host匹配
- Method=GET,POST # 请求Method匹配指定请求方式
- Path=/red/{segment},/blue/{segment} # 请求路径正则匹配
- Query=green # 请求包含某参数
- Query=red, gree. # 请求包含某参数并且参数值匹配正则表达式(匹配red;green,greet,gree...)
- RemoteAddr=192.168.1.1/24 # 远程地址匹配
# 设置分组和权重,按照路由权重选择同一个分组中的路由
- id: preManager1
uri: https://preManager1
predicates:
- Weight=group1, 2
- id: preManager2
uri: https://preManager2
predicates:
- Weight=group1, 85、过滤器
5.1、过滤器介绍
按生命周期分类
前置(pre)过滤器: 在请求被路由之前调用:在chain.filter(exchange)前编写过滤器逻辑后置(post)过滤器: 在路由到微服务之后调用:通过chain.filter(exchange).then(Mono.fromRunnable(() -> {过滤器逻辑})实现按类型分类
局部(GatewayFilter)过滤器:作用在某一个路由上,使用时需要关联指定的路由全局(GlobalFilter)过滤器:作用在所有路由上,不需要在配置文件中配置5.2、内置局部过滤器与使用
spring:
cloud:
gateway:
routes:
- id: gateway_filter
uri: https://example.org
predicates:
- Path=/red/{segment}
filters:
# 1、为原始请求添加Header。headerName:X-Request-red,headerValue:blue。
- AddRequestHeader=X-Request-red, blue
- AddRequestHeadersIfNotPresent=X-Request-Color-1:blue,X-Request-Color-2:green
# 2、为原始请求添加参数。参数名,参数值
- AddRequestParameter=red, blue
# 3、为原始响应添加Header
- AddResponseHeader=X-Response-Red, Blue
# 4、剔除响应头中重复的值
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
# 5、为原始请求路径添加前缀
- PrefixPath=/mypath
# 6、配置该过滤器后,会原始请求的host头信息,并原封不动的转发出去,而不是被gateway的http客户端重置。
- PreserveHostHeader
# 7、将原始请求重定向到指定的URL,参数为http状态码及重定向的url
- RedirectTo=302, https://acme.org
# 8、移除响应Body中的指定key
- RemoveJsonAttributesResponseBody=id,color
# 9、移除原始请求中的指定Header
- RemoveRequestHeader=X-Request-Foo
# 10、移除原始请求中的指定参数
- RemoveRequestParameter=red
# 11、移除响应中的指定Header
- RemoveResponseHeader=X-Response-Foospring:
cloud:
gateway:
routes:
- id: gateway_filter
uri: https://example.org
predicates:
- Path=/red/{segment}
filters:
# 12、请求限流,限流算法为令牌桶,以下示例为根据用户id做限流
# @Configuration
# public class RateLimiterConfig {
# @Bean
# public KeyResolver userKeyResolver() {
# return exchange -> Mono.just(Objects.requireNonNull(exchange.getRequest().getQueryParams().getFirst("userId")));
# }
# }
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10 # 允许用户每秒处理的请求数
redis-rate-limiter.burstCapacity: 20 # 令牌桶的容量,即允许在 1 秒内完成的最大请求数。设置为 0 则表示拒绝所有请求。
key-resolver: "#{@userKeyResolver}" # 一个引用名为 userKeyResolver 的 bean 的 SpEL 表达式
# 13、重写原始的请求路径
- RewritePath=/red/?(?.*), /$\{segment}
# 14、重写响应中的某个Header
- RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***
# 15、在转发请求之前,强制执行websession::save操作,保存会话状态
- SaveSession
# 16、修改原始的请求路径
- SetPath=/{segment}
# 17、修改原始请求中的指定Header值
- SetRequestHeader=X-Request-Red, Blue
# 18、修改原始响应中的指定Header值
- SetResponseHeader=X-Response-Red, Blue
# 19、修改原始响应的响应码
- SetStatus=401
# 20、剥离原始请求路径
- StripPrefix=2
# 21、请求重试
- name: Retry
args:
retries: 3 # 重试次数
statuses: BAD_GATEWAY # 应被重试的 HTTP Status Codes
methods: GET,POST # 应被重试的 HTTP Methods
backoff: # 为重试配置指数级的 backoff。重试时间间隔的计算公式为 firstBackoff * (factor ^ n),n 是重试的次数;如果设置了 maxBackoff,最大的 backoff 限制为 maxBackoff. 如果 basedOnPreviousValue 设置为 true, backoff 计算公式为 prevBackoff * factor.
firstBackoff: 10ms
maxBackoff: 50ms
factor: 2
basedOnPreviousValue: false
# 22、设置允许接收最大请求包的大小。如果请求包大小超过设置的值,则返413Payload Too Large
- name: RequestSize
args:
maxSize: 5000000 5.3、内置全局过滤器
GatewayMetricsFilter(0):统计一些网关的性能指标RouteToRequestUrlFilter(10000):把浏览器的URL请求的Path路径添加到路由的URI之中。NettyRoutingFilter(2147483647):通过HttpClient客户端转发真实的URL,并存储返回的结果。NettyWriteResponseFilter(-1):在所有的其它的过滤器执行完成之后运行,将响应的数据发送给网关的客户端。ForwardRoutingFilter(2147483647):转发路由过滤器,若URI是forward模式,过滤器会将请求转发到DispatcherHandler来处理请求。ForwardPathFilter(0):解析路径,并将路径转发。LoadBalancerClientFilter(10100):负载均衡,解析服务名,获取真实服务地址。RemoveCachedBodyFilter(-2147483648):清除网关上下文中的缓存的请求Body。WebsocketRoutingFilter(2147483646):如果请求中的ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR 属性对应的URL前缀为 ws 或 wss,会使用Spring Web Socket 模块转发WebSocket请求。WebSockets可以使用路由进行负载均衡。AdaptCachedBodyGlobalFilter(-2147482648):从请求中获取body缓存到网关上下文。5.4、自定义全局过滤器
创建自定义全局过滤器类 ,实现GlobalFilter和Ordered两个接口。
GlobalFilter:全局过滤拦截器Ordered:拦截器的顺序,数字越低,优先级越高5.4.1、黑名单校验
/**
* 定义全局过滤器,会对所有路由生效
*/
@Slf4j
@Component // 让容器扫描到,等同于注册了
public class BlackListFilter implements GlobalFilter, Ordered {
// 模拟黑名单(实际可以去数据库或者redis中查询)
private static List blackList = new ArrayList<>();
static {
blackList.add("0:0:0:0:0:0:0:1"); // 模拟本机地址
}
/**
* 过滤器核心方法
* @param exchange 封装了request和response对象的上下文
* @param chain 网关过滤器链(包含全局过滤器和单路由过滤器)
* @return
*/
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 思路:获取客户端ip,判断是否在黑名单中,在的话就拒绝访问,不在的话就放行
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
// 从request对象中获取客户端ip
String clientIp = request.getRemoteAddress().getHostString();
// 拿着clientIp去黑名单中查询,存在的话就决绝访问
if(blackList.contains(clientIp)) {
// 拒绝访问,返回
response.setStatusCode(HttpStatus.UNAUTHORIZED); // 状态码
log.debug("=====>IP:" + clientIp + " 在⿊名单中,将被拒绝访问!");
String data = "Request be denied!";
DataBuffer wrap = response.bufferFactory().wrap(data.getBytes());
return response.writeWith(Mono.just(wrap));
}
// 合法请求,放行,执行后续的过滤器
return chain.filter(exchange);
}
/**
* @return 过滤器的顺序(优先级),数值越小,优先级越高
*/
@Override
public int getOrder() {
return 0;
}
} 5.4.2、模拟登录校验
在过滤器中检查请求中是否携带token请求头。如果token请求头存在则放行;如果token为空或者不存在则返回认证失败状态码。
@Component
public class MyGlobalFilter implements GlobalFilter,Ordered {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
boolean token = exchange.getRequest().getHeaders().containsKey("token");
System.out.println("----全局过滤器token----"+token);
if (!token){
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
ServerHttpResponse response = exchange.getResponse();
return response.setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 1;
}
} 6、一个简单的gateway配置实例
spring:
cloud:
gateway:
discovery:
locator:
# 表明Gateway开启服务注册和发现的功能,并且Spring Cloud Gateway自动根据服务发现为每一个服务创建了一个router,这个router将以服务名开头的请求路径转发到对应的服务
enabled: true
# 将请求路径上的服务名配置为小写(因为服务注册的时候,向注册中心注册时将服务名转成大写的了)
lower-case-service-id: true
routes:
# 系统管理
- id: sys-mgt
uri: lb://sysmgt
predicates:
- Path=/sys-mgt/** #以sys-mgt开头的请求都负载到sysmgt服务
- Method=GET #只匹配GET请求
filters:
- RewritePath=/sys-mgt/(?.*), /$\{segment} #过滤掉url里的sys-mgt,例如http://ip:port/sys-mgt/test -> http://ip:port/test
- PrefixPath=/mgt #为请求添加/mgt前缀,再结合RewritePath过滤器,http://ip:port/sys-mgt/test -> http://ip:port/mgt/test 到此这篇关于gateway基本配置的文章就介绍到这了,更多相关gateway基本配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
-
天天新资讯:gateway基本配置教程路由(Route)由一个ID,一个目标URI(最终路由到的url地址),一组断言(匹配条件判断)和一组过滤器定义,这篇 -
快看点丨上海:优化金融环境,服务实体经济(高质量发展调研行)陆家嘴,上海国际金融中心的核心功能区。在这块活跃着4 5万多家企业、拥有12家国家级要素市场和金融基础设 -
速看:北京一商场有人拐卖小孩?警方辟谣事件简单介绍1、近日,有网民反映在朝阳区合生汇商场疑似有人“拐卖小孩”,引发部分家长关注。2、12日,朝阳警方发布消 -
天天热推荐:与本人关系怎么填写最标准_与本人关系怎么填写1、填表“与本人关系”怎么填只需要填写以下资料:如果是已婚人填写,需填写自己的爱人和子女的姓名;2、如 -
【世界新视野】沙棘原浆之谜:中国产量霸主,日本却是消费王者,长寿秘密揭开!悄然之间,一种名叫沙棘原浆的健康饮品在国内开始走俏。但是,你曾经想过为什么日本人能够成为沙棘原浆市场 -
每日速看!江苏亭粮“藏粮于技”何骏江苏亭粮集团有限公司粮食是人类生存和发展的基础。随着科技的发展,储粮技术也在不断地更新。近年来, -
热点评!Stein:维岑科夫预计将在下赛季加盟国王 面包上周曾现场观战据名记Stein报道,越来越多的证据表明,欧洲最好的球员之一、保加利亚球星萨沙-维岑科夫将在下赛季加盟国王 -
武威瑞安堡(关于武威瑞安堡介绍)1、河西走廊东北部有一块被腾格里沙漠和巴丹吉林沙漠包围着的绿洲,这就是甘肃省武威市(中国旅游标志的故乡 -
力佳科技: 加大新产品新工艺研发|每日热闻●本报记者董添 5月12日,力佳科技2022年度业绩说明会在中国证券报 中证网举行。力佳科技管理层在业绩说 -
建安工程形象进度指标1、建安工程形象进度指标是用文字结合数字简明扼要地说明工程实际完成的形象部位,以表明工程施工总进度的 -
当前热议!股票行情快报:皇氏集团(002329)5月12日主力资金净卖出321.89万元截至2023年5月12日收盘,皇氏集团(002329)报收于5 66元,下跌2 92%,换手率1 85%,成交量10 89万手,成交额6235 15万元。 -
dpi设备串接的好处不包括什么_dpi设备串接的好处1、串接方式的优点在于较好的网络控制,能够及时对流量进行阻断和整形。2、但是该种方式也引入了故障点的缺 -
当前热议!监控硬盘与台式机硬盘区别_监控硬盘和台式机硬盘有何区别1、硬盘录像机专用硬盘与普通电脑硬盘虽然外观上没什么区别,但是PC普通硬盘则是消费类产品(属于用户级) -
天天最新:石膏板天花板可以承受多少重量?特殊的紧固件用于将重量固定在石膏板上。石膏板,也称为石膏板或石膏板,是住宅建筑中常见的室内饰面。它是 -
海南交警最新一批酒驾名单曝光!看看有你认识的吗?商报全媒体讯(椰网 海拔新闻记者陈勇合)夏季来临,小伙伴们是不是按捺不住躁动的心,想约上三五好友喝酒 -
球星壁纸第86期| 红魔的“左翼之王” 瑞...球星壁纸第86期|红魔的“左翼之王”瑞恩-吉格斯瑞恩·吉格斯(RyanGiggs),全名瑞恩·约瑟夫·吉格斯(Ry -
西安市五环中学分校_西安市五环中学1、西安市五环中学教学质量优秀,师资力量雄厚,是一个好学校。2、西安市五环中学是位于西安市东郊纺织城的 -
血红蛋白浓度偏高是什么病_血红蛋白浓度偏高1、平均红细胞血红蛋白浓度偏高,原因是血红蛋白和红细胞及红细胞压积不成比例的,浓度是根据前三项换算而 -
当前资讯!合资品牌销量劲增35% 德系扩大领先 日系大溃败乘联会数据显示,4月主流合资品牌零售61万辆,同、环比分别增长35%和12%。4月德系品牌零售份额21 6%,同比 -
今天,向最美的Ta们致敬-天天视点记者靳林青5月12日是国际护士节今年我国护士节的主题是“发展护士队伍,改善护理服务”今天我们一起走近临 -
世界热头条丨[快讯]爱仕达发布质押公告CFi CN讯: 爱仕达(股票代码:002403)发布关于公司实际控制人股票质押的公告。截至公告披露日,上述股 -
西安未央绿港医疗美容诊所怎么样?医院医生、口碑等相关资料~_全球热门西安未央绿港医疗美容诊所西安未央绿港医疗美容诊所是一家以分享青春与健康快乐为宗旨而创立的医美机构,致 -
世界观天下!刘亦菲机场穿搭引热议,全身奢牌总价格超 82 万普通人辛辛苦苦一辈子,攒够几十万才能凑一套房的首付,每月还要缩衣节食地攒钱还房贷,而明星有时候一身行 -
精选!您被禁止访问这个网站_你被禁止访问这个网站请联系网站管理员1、说实话,这个太大惊小怪了!傲盾真是有点扯了!没有备案就没备案,怎么了!傲盾就是提示你。2、这个网站 -
环球报道:多只债基遭遇大额赎回 投资者态度现分歧4月以来,超20只债券基金遭遇大额赎回。记者采访获悉,当前不同投资者对债券基金分歧较大,部分机构投资者 -
落实党风廉政建设方面存在的问题-领导班子怎样落实党风廉政建设责任清单1、认真履行“一岗双责”,对分管范围内的党风廉政建设负主要领导责任,定期研究、布置、检查和报告分管范 -
焦点快播:联拓生物(LIAN.US)心肌病药物Camzyos获澳门药品监督管理局批准智通财经APP获悉,联拓生物(LIAN US)表示,澳门药品监督管理局已批准Camzyos(mavacamten)在中国 -
天天短讯!迎战ChatGpt,全球搜索引擎之王今迎巨变北京时间5月11日凌晨1点,GoogleI O2023开发者大会如期而至。在美国加州山景城总部,谷歌在多项产品和服务 -
第十二届中外会展投资合作洽谈会开幕_全球新要闻5月10日,第十二届中外会展投资合作洽谈会在北京中德国际会议会展中心开幕。大会以“共享投资机遇创新会展 -
群星死亡堡垒成就怎么做 焦点速读《群星(Stellaris)》这款游戏DLC和版本不同都会多出很多不同的特殊成就,死亡堡垒就是其中一个,而想要做
