7.springcloudAlibaba-网关gateway
1.springcloudAlibaba-nacos
2.springcloudAlibaba-openFeign
3.springcloudAlibaba-负载均衡器Ribbon
4.springcloudAlibaba-nacos配置中心
5.springcloudAlibaba-Seata 分布式事务
6.springcloudAlibaba-sentinel
7.springcloudAlibaba-网关gateway
目录
网关介绍
核心概念
Spring Cloud Gateway快速开始
集成Nacos
路由断言工厂
过滤器工厂( GatewayFilter Factories)配置
全局过滤器(Global Filters)配置
Reactor Netty 访问日志
Gateway跨域配置(CORS Configuration)
网关介绍
在微服务中存在很多服务,前端需要每个服务都维护一个ip,如果搭建集群 更是头疼,再比如鉴权、限流、日志、跨域等问题,都需要每个服务配一下,所以就衍生出网关来进行统一处理,就像家里的大门,所有人都走大门,收快递,防盗 都要在门口处理
Spring Cloud GateWay是Spring Cloud的一个全新项目,目标是取代Netflix Zuul,它基于 Spring5.0+SpringBoot2.0+WebFlux(基于高性能的Reactor模式响应式通信框架Netty,异步非阻塞模 型)等技术开发,性能高于Zuul,官方测试,GateWay是Zuul的1.6倍,旨在为微服务架构提供一种简 单有效的统一的API路由管理方式。
Spring Cloud GateWay不仅提供统一的路由方式(反向代理)并且基于 Filter(定义过滤器对请求过滤, 完成一些功能) 链的方式提供了网关基本的功能,例如:鉴权、流量控制、熔断、路径重写、日志监控 等。
基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 进行构建;
动态路由:能够匹配任何请求属性;
支持路径重写;
集成 Spring Cloud 服务发现功能(Nacos、Eruka);
可集成流控降级功能(Sentinel、Hystrix);
可以对路由指定易于编写的 Predicate(断言)和 Filter(过滤器)
核心概念
路由(route)
路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真,则说明请求的URL和
配置的路由匹配。
断言(predicates)
Java8中的断言函数,SpringCloud Gateway中的断言函数类型是Spring5.0框架中的ServerWebExchange。断言函数允许开发者去定义
匹配Http request中的任何信息,比如请求头和参数等。
过滤器(Filter)
SpringCloud Gateway中的filter分为Gateway FilIer和Global Filter。Filter可以对请求和响应进行处理
Spring Cloud Gateway快速开始
新建modules springcloud-gateway
添加依赖
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency></dependencies>
新增启动类
新增application.yml
server:port: 8881 spring:application:name: springcloud-gatewaycloud:gateway:routes: # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]- id: product_route # 当前路由的标识, 要求唯一uri: http://localhost:9999 # 请求要转发到的地址order: 1 # 路由的优先级,数字越小级别越高predicates: # 断言(就是路由转发要满足的条件)- Path=/gateway/** # 当请求路径满足Path指定的规则时,才进行路由转发filters:- StripPrefix=1 #转发之前去掉1层路径
这里我们请求http://localhost:8881/gateway/orderController/getInfo
gateway拿到这个地址 截取到 /gateway/ 然后转发到 uri地址 在转发之前 filters会 去掉第一次路径
我们在启动 之前的order module
可以看到 通过gateway 分发到了该服务上
集成Nacos
引入依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
修改application.yml
加入nacos 配置 将本服务注册到nacos
uri 就可以直接修改为服务名,同时加入nacos的负载均衡策略
server:port: 8881 spring:application:name: springcloud-gatewaycloud:nacos:server-addr: 49.232.193.91:8848username: nacospassword: nacosnacosgateway:routes: # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]- id: product_route # 当前路由的标识, 要求唯一uri: lb://order-service # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略order: 1 # 路由的优先级,数字越小级别越高predicates: # 断言(就是路由转发要满足的条件)- Path=/gateway/** # 当请求路径满足Path指定的规则时,才进行路由转发filters:- StripPrefix=1 #转发之前去掉1层路径
再次请求http://localhost:8881/gateway/orderController/getInfo
效果是一样的
同时gateway也提供了一种默认配置
实现方式也很简单 如下
server:port: 8881 spring:application:name: springcloud-gatewaycloud:nacos:server-addr: 49.232.193.91:8848gateway:discovery:locator:enabled: true
等同于
gateway:routes: # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]- id: product_route # 当前路由的标识, 要求唯一uri: lb://order-service # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略order: 1 # 路由的优先级,数字越小级别越高predicates: # 断言(就是路由转发要满足的条件)- Path=/order-service/** # 当请求路径满足Path指定的规则时,才进行路由转发filters:- StripPrefix=1 #转发之前去掉1层路径
路由断言工厂
gateway提供了很多断言方式,具体可以看一下官网说明跟样例,这里简单介绍几个
官网地址:Spring Cloud Gateway
作用:当请求gateway的时候, 使用断言对请求进行匹配, 如果匹配成功就路由转发, 如果匹配失败就返回404
基于Datetime类型的断言工厂
此类型的断言根据时间做判断,主要有三个:
AfterRoutePredicateFactory: 接收一个日期参数,判断请求日期是否晚于指定日期
BeforeRoutePredicateFactory: 接收一个日期参数,判断请求日期是否早于指定日期
BetweenRoutePredicateFactory: 接收两个日期参数,判断请求日期是否在指定时间段内
ZonedDateTime.now()
‐ After=2019‐12‐31T23:59:59.789+08:00[Asia/Shanghai]
基于远程地址的断言工厂
RemoteAddrRoutePredicateFactory:接收一个IP地址段,判断请求主机地址是否在地址
‐ RemoteAddr=192.168.1.1/24
基于Header的断言工厂
HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式。 判断请求Header是否具有给定名称且值与正则表达式匹配
‐Header=X‐Request‐Id, \d+
基于Host的断言工厂
HostRoutePredicateFactor:接收一个参数,主机名模式。判断请求的Host是否满足匹配
‐Host=**.testhost.org
基于Method请求方法的断言
MethodRoutePredicateFactory:接收一个参数,判断请求类型是否跟指定的类型匹配
‐Method=GET
基于Query请求参数的断言工厂
QueryRoutePredicateFactory :接收两个参数,请求param和正则表达式, 判断请求参数是否具有给定名称且值与正则表达式匹配
‐Query=baz, ba.
基于路由权重的断言工厂
WeightRoutePredicateFactory:接收一个[组名,权重], 然后对于同一个组内的路由按照权重转发
routes:‐id: weight_route1uri: host1predicates:‐Path=/product/**‐Weight=group3, 1‐id: weight_route2uri: host2predicates:‐Path=/product/**‐Weight= group3, 9
这些基本上开发使用够用了,同事也提供了自定义断言方式 有兴趣可以了解一下
过滤器工厂( GatewayFilter Factories)配置
大体修改方式大同小异
像 AddRequestParameter 添加参数 、 PrefixPath为匹配的路由统一添加前缀 、‐ Redirect 重定向 还是用的挺多的 同事也提供了自定义过滤器
过滤器工厂 |
作用 |
参数 |
AddRequestHeader |
为原始请求添加Header |
Header的名称及值 |
AddRequestParameter |
为原始请求添加请求参数 |
参数名称及值 |
AddResponseHeader |
为原始响应添加Header |
Header的名称及值 |
DedupeResponseHeader |
剔除响应头中重复的值 |
需要去重的Header名称及去重策略 |
Hystrix |
为路由引入Hystrix的断路器保护 |
Hystrixcommand的名称 |
FallbackHeaders |
为fallbackUri的请求头中添加具体的异常信息 |
Header的名称 |
PrefixPath |
为原始请求路径添加前缀 |
前缀路径 |
PreserveHostHeader |
为请求添加一个preserveHostHeader=true的属性,路由过滤器会检查该属性以决定是否要发送原始的Host |
无 |
RequestRateLimiter |
用于对请求限流,限流算法为令牌桶 |
keyResolver、rateLimiter、statusCode、denyEmptyKey、emptyKeyStatus |
RedirectTo |
将原始请求重定向到指定的URL |
http状态码及重定向的url |
RemoveHopByHopHeadersFilter |
为原始请求删除IETF组织规定的一系列Header |
Header名称 |
RemoveResponseHeader |
为原始请求删除某个Header |
Header的名称 |
RewritePath |
重写原始的请求路径 |
原始路径正则表达式以及重写后路径的正则表达式 |
RewriteResponseHeader |
重写原始响应中的某个Header |
Header名称,值的正则表达式,重写后的值 |
SaveSession |
在转发请求之前,强制执行websession::save操作 |
无 |
secureHeaders |
为原始响应添加一系列起安全作用的响应头 |
无,支持修改这些安全响应头的值 |
SetPath |
修改原始的请求路径 |
修改后的路径 |
SetResponseHeader |
修改原始响应中某个Header的值 |
Header名称,修改后的值 |
SetStatus |
修改原始响应的状态码 |
HTTP状态码,可以是数字,也可以是字符串 |
StripPrefix |
用于截断原始请求的路径 |
使用数字表示要截断的路径的数量 |
Retry |
针对不同的响应进行重试 |
retries、statuses、methods、 series |
RequestSize |
设置允许接收最大请求包的大小。如果请求包大小超过设置的值,则返413Payload Too Large |
请求包大小,单位为字节,默认值为5M |
ModifyRequestBody |
在转发请求之前修改原始请求体内容 |
修改后的请求体内容 |
ModifyResponseBody |
修改原始响应体的内容 |
修改后的响应体内容 |
全局过滤器(Global Filters)配置
局部过滤器和全局过滤器区别:
局部:局部针对某个路由, 需要在路由中进行配置
全局:针对所有路由请求, 一旦定义就会投入使用
GlobalFilter 接口和 GatewayFilter 有一样的接口定义,只不过, GlobalFilter 会作用于所有路由
package oo.config;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono;@Component public class LogFilter implements GlobalFilter {Logger log = LoggerFactory.getLogger(this.getClass());@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info(exchange.getRequest().getPath().value()+"-----------------");return chain.filter(exchange);} }
Reactor Netty 访问日志
要启用 Reactor Netty 访问日志,请设置Dreactor.netty.http.server.accessLogEnabled=true.
它必须是 Java 系统属性,而不是 Spring Boot 属性。
您可以将日志记录系统配置为具有单独的访问日志文件。以下示例创建一个 Logback 配置:
<appender name="accessLog" class="ch.qos.logback.core.FileAppender"><file>access_log.log</file><encoder><pattern>%msg%n</pattern></encoder></appender><appender name="async" class="ch.qos.logback.classic.AsyncAppender"><appender‐ref ref="accessLog" /> </appender><logger name="reactor.netty.http.server.AccessLog" level="INFO" additivity="false"><appender‐ref ref="async"/></logger>
Gateway跨域配置(CORS Configuration)
globalcors:cors-configurations:'[/**]':allowCredentials: true#springboot2.4后需用allowedOriginPatternsallowedOriginS: "*"allowedMethods: "*"allowedHeaders: "*"
7.springcloudAlibaba-网关gateway相关推荐
- 6.SpringCloud -- 注册中心与配置中心 Nacos、网关 Gateway
6.SpringCloud -- 注册中心与配置中心 Nacos.网关 Gateway 一.了解一下 SpringCloud Alibaba 1.1 SpringCloudAlibaba (1)简单说 ...
- SpringCloud Alibaba微服务实战(七) - 路由网关(Gateway)全局过滤
说在前面 全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,IP 访问限制,监控,限流等等. 创建路由网关(Gateway)启动服务cloud-ac ...
- 限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容都在这儿
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:雄 ...
- Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway
转载自 Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使 ...
- SpringCloud 微服务网关Gateway 动态路由配置
概述:在上一章节<SpringCloud 微服务网关Gateway介绍及简单路由配置>中我们讲述了Gateway的最简单的路由配置方式.但是其中比较明显的问题就是我们在配置路由服务的地址时 ...
- Spring cloud网关gateway代理websocket报Max frame length of 65536 has been exceeded
Spring cloud网关gateway代理websocket报io.netty.handler.codec.http.websocketx.CorruptedWebSocketFrameExcep ...
- day02 Nacos集群配置、Feign远程调用和统一网关Gateway
1.Nacos配置管理 Nacos除了可以做注册中心,同样可以做配置管理来使用. 统一配置管理 当微服务部署的实例越来越多,达到数十.数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错.我们需要一 ...
- SpringCloud 网关 Gateway
哈喽~大家好,这篇来看看SpringCloud 网关 Gateway.
- SpringCloud:统一网关Gateway
目录 1.网关介绍 2.搭建网关服务 3.路由断言工厂 4.路由过滤器 5.全局过滤器GlobalFilter 6.过滤器执行顺序 7.跨域问题处理 1.网关介绍 网关(Gateway)又称网间连接器 ...
- 【微服务技术09】统一网关Gateway
[微服务技术09]统一网关Gateway 案例代码:https://gitee.com/pikachu2333/spring-cloud-hexuan 1.网关作用 网关功能: 身份认证和权限校验 服 ...
最新文章
- 【干货下载】聚美优品、中商惠民、倍全,如何让数据驱动“新零售”落地?...
- How to install Toad on linux with Corssover
- 接口测试基础之入门篇(待续)
- kafka原理_kafka入门(原理搭建简单使用)
- Centos实现svn本地认证apache认证
- 为啥非要用Python?Excel不香吗?
- UVALive 6508 Permutation Graphs
- 【Redis】Redis 乐观锁
- 算法与数据结构篇(暂未解答)
- python爬取微博评论_python爬虫手把手教你抓取微博评论(完整代码)
- 伯努利贝叶斯分类算法
- 一个按钮控制定时器的开始与暂停
- mac键盘快捷键详解,苹果电脑键盘快捷键图文教程
- MobileNet v2的Inverted Bottleneck为什么可以抵消ReLU激活函数所带来的信息损失
- 如何下载OpenJDK安装版本
- 原生JS javascript解除绑定事件 JS删除绑定事件
- h5 修改title 微信_iH5中级教程:微信必备,为H5设定标题
- 华为南研所提前批面试(2015年8月22日)
- 柏拉图团队-手把手教你发代币(二)remix入门
- 将页面中的指定 div 下载为图片
热门文章
- dcm4che 介绍及下载安装
- char* strlen()学习
- No result defined for action com.zhen.user.UserInfoAction and result success
- 洛谷 P3959 [NOIP2017]宝藏 题解
- python面向对象试题_python面向对象程序设计-中国大学mooc-试题题目及答案
- Delphi字符串操作的常用函数二
- html怎么优化导航条,seo优化教程seo技巧:网站html面包屑导航栏代码
- matlab如何做粒子模拟,求助,如何用matlab做蒙特卡罗模拟!!??
- html网页播放器编辑代码大全
- BIM在工程中的20种典型应用