天天新资讯: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, 8
5、过滤器
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-Foo
spring: 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 ListblackList = 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 Monofilter(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基本配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
-
金都城:黄金开启三浪下跌反弹仍是高空,原油将继续走强在一系列强势经济数据支持下,9月8日,也就是本周周五ICE美元指数
-
阿根廷tini(史蒂芬说:阿根廷70万人请愿)阿根廷球迷杀人诛心了,哈哈!不甘心的法国人,20万人在网上签名请愿,
-
突发!日媒:日本外相访问乌克兰,系俄乌冲突爆发以来首次日本外相首次访乌克兰,支持其抵御俄罗斯入侵。
-
西安多区通知:9月9日10点开始预约HPV疫苗新一波的HPV疫苗预约来了!9月9日(星期六)上午10:00,雁塔区、新城区、
-
坤鹏论:读《形而上学》 学习亚里士多德的第一哲学(16)真正有本事的是疏,而非堵与禁。——坤鹏论第一卷第六章(二)原文:而
-
茶和咖啡(关于茶和咖啡简述),你们好,今天0471房产来聊聊一篇和咖啡,和咖啡简述的文章,网友们对
-
如何下载豆丁网(豆丁下载器)来为大家解答以上问题,如何下载豆丁网,豆丁下载器很多人还不知道,现
-
逾5千家上市公司披露年报,235家公司被出具非标审计意见逾5千家上市公司披露年报,235家公司被出具非标审计意见,年报,非标,证
-
“讲好山东政法故事”创意传播大赛暨“我的政法故事”征文优秀作品展示举行海报新闻记者丛萍济南报道9月8日下午,忠诚的力量——“讲好山东政法故
-
因控股股东非经营性资金占用触及违规 ST天顺及控股股东、实控人等相关责任人遭深交所通报批评深交所9月8日向ST天顺及控股股东舟山天顺股权投资有限公司,控股股东关
-
曼联女足首任主帅是曾入狱的恋童癖,但曼联仍邀他参加俱乐部活动曼联女足首任主帅是曾入狱的恋童癖,但曼联仍邀他参加俱乐部活动,英超,
-
房地产收并购市场热度回升 八月交易额明显增长房地产收并购市场8月热度回升显著,企业正在加快处置资产回笼资金。根
-
合肥一中学班主任向学生推销教辅材料 校方:行为错误,已纠正合肥一中学班主任向学生推销教辅材料 【合肥一中学班主任向学生推销40
-
五根手指各叫什么名字_五根手指分别叫什么1、拇指、食指、中指、无名指、小指。本文到此讲解完毕了,希望对大家
-
幸福蓝海9月8日快速反弹以下是幸福蓝海在北京时间9月8日13:41分盘口异动快照:  9月
-
2开双控开关接线图解(2开)1、2开纸的尺寸是:530mm×760mm不过既然是学校发的就可以就用那个啊。
-
南通向全市教育工作者发放“江海尊师卡”本报讯(记者王艳芳)为弘扬尊师重教的传统美德,充分凸显对广大教师群
-
深入分布式一致性:Raft 和 etcdRaft分布式一致性是构建可靠的分布式系统的关键要素之一。为了确保数据的一
-
北交所总经理隋强:打造资本市场改革试验田 北交所进入高质量建设2.0版本9月7日,北交所联合北京市地方金融监管局、市科委中关村管委会、市经信
-
阿维塔12重磅来袭!比极氪001更酷炫由长安汽车、华为科技以及宁德时代三家巨头共同鼎力打造的阿维塔,在市
-
厚普股份(300471)8月31日主力资金净买入1221.10万元截至2023年8月31日收盘,厚普股份(300471)报收于13 47元,上涨2 51%,
-
文昌航天发射场规划建设新一代载人登月火箭发射工位记者8月31日从文昌航天发射场获悉,目前该发射场正在规划建设新一代载
-
西安警方捣毁特大“网络水军”团伙 125人被采取刑事强制措施虚假信息、诽谤攻击、非法推广、恶评去势、操控扰乱网上舆论秩序,“网
-
广西自贸试验区加快构建面向东盟跨境产业链供应链【东盟专线】广西自贸试验区加快构建面向东盟跨境产业链供应链中新社南
-
福晟国际上半年收入1.88亿元 筹集新借贷0元观点网讯:8月31日,福晟国际控股集团有限公司发布了截至2023年6月30日
-
2023暑期档票房206.08亿2023暑期档票房206 08亿:格隆汇8月31日|据灯塔专业版,截至8月31日21
-
婚礼现场布置设计(婚礼现场布置)精选小编来为大家解答以上问题。婚礼现场布置设计,婚礼现场布置很多人
-
福州楼市限购再松绑 “本地户籍+市区”成为政策亮点为更好满足居民刚性和改善性住房需求,促进房地产市场平稳健康发展,8
-
NH4CL的电子式和结构式(nh4cl的电子式)1、nh4+中的n的其中一对孤对电子也h形成配位键,表示为n→h,其他的就
-
镇江67个乡镇(街道)全部建立应急办 将应急管理的触角延伸到基层末梢“本次培训会议,住宿3人及以上的‘三合一’场所要通知到位、派人参加