26 | 微服务网关:如何设置请求转发、跨域和限流规则?
创建微服务网关
- 深入了解
- 翻译
- 解释
- 总结
本文详细介绍了如何在Spring Cloud Gateway中设置请求转发、跨域和限流规则。作者首先介绍了跨域规则的基本原理和设置同源访问策略的方法,然后使用Java代码定义静态路由规则,并推荐了使用代码方式定义复杂路由规则的优势。接着,作者介绍了如何使用内置的Lua脚本和Redis组件实现网关层限流。在创建微服务网关时,作者指导读者在pom.xml文件中添加关键依赖项,包括Gateway、Nacos和Loadbalancer,并强调了这些依赖项的重要性。读者可以从中学习到如何利用Spring Cloud Gateway实现这些功能,以及在创建微服务网关时所需的关键依赖项和配置方法。文章还介绍了如何使用过滤器实现对Request和Response的处理,以及如何通过内置的限流过滤器实现网关层限流。总的来说,本文通过实际操作指导读者搭建微服务网关应用,并完成设置跨域规则、添加路由和实现网关层限流等三个任务。文章内容丰富,适合对Spring Cloud Gateway感兴趣的读者阅读学习。
《Spring Cloud 微服务项目实战》,新⼈⾸单¥59
全部留言(9)
- 最新
- 精选
- 勤奋的樂向老师请教一个问题,gateway做限流和sentinel限流两者的关系,是配合使用还是二选一? 我的理解是:gateway服务也要像nacos服务中心组册,本质上它也是微服务体系中的一个服务提供者,应该用sentinel统领整个微服务体系,做全局的流量控制,请求经过sentinel粗粒度流量整形后,在gateway中再针对具体的服务规则,进行细粒度的资源调配和请求转发。 不知道我的理解是不是对的,望指正 PS: gitee上最新的代码中找不到request_rate_limiter.lua文件
作者回复: 蟹腰,先上结论:配合使用。 gateway只能做“外部流量”->“微服务集群”这一道的限流,粒度比较粗狂。sentinel面相的限流维度是“资源”,也就是说它可以在微服务之间调用流转的环节做精细力度的限流,且有多种多样的流控效果。 总之来说网关限流(redis, gateway etc..)是一种相对廉价的粗粒度限流手段,应用sentinel的成本是高于网关限流的,但同时可以获取更灵活+多维度的限流效果 request_rate_limiter是gateway开源代码里的一个文件,同学要到spring cloud的源码库里找哦
2022-05-105 - inrtyx老师,能否讲讲网关如何鉴权?即鉴权时序图
作者回复: 网关鉴权可以通过oauth实现(spring提供了spring-cloud-starter-oauth2),根据oauth 2.0的规范有很多种不同的对接方式。我推荐一个网站可以进一步了解oauth规范 https://oauth.net/2/
2022-02-113 - 黄叶老师请问下,今天试着写了gateway+vue整合。 vue请求发送给后端,预检通过了但是当真正发送跨域请求时,提示:CORS错误,也配置了gateway跨域 但是就是不成功
作者回复: 我在想会不会是后台跨域的method列表里只写了Options,没有加上其他方法呢?同学可以把浏览器里的request header(包括Options和后面那个真实请求)发出来我们看下
2022-02-1131 - 乘风我怎么没看明白如何测试,是访问哪个地址?
作者回复: 访问网关应用的port,采用localhost:port/xxxx的方式,后面的xxx是路由规则里配置的path
2023-04-14归属地:北京 - Geek_8d3106使用阿里云Redis集群,会报以下错误 Caused by: io.lettuce.core.RedisCommandExecutionException: ERR bad lua script for redis cluster, all the keys that the script uses should be passed using the KEYS array, and KEYS should not be in expression 这是因为阿里云的Redis集群对Lua脚本调用的时候做了限制:所有key都应该由KEYS数组来传递,redis.call/pcall中调用的redis命令,key的位置必须是KEYS array(不能使用Lua变量替换KEYS),否则直接返回错误信息。 不知道是否有好的解决方案?
作者回复: 忘了阿里云这道坎儿,这个简单,在gateway源码里有一个lua限流脚本,只要本地根据阿里云的要求重写这个脚本,然后指定gateway在auto-config阶段加载你重新定义的这个脚本就行了
2022-04-01 - peter请教老师几个问题: Q1:Gateway的限流与sentinel的限流是什么关系? Gateway的限流是替代sentinel的限流吗?或者是相互配合?从“总结”部分来看,老师你是不赞成在Gateway做限流吗? Q2:定义路由规则中的uri用的lb,gateway怎么知道是用的哪一个loadbalancer? 需要配置吗?在哪里配置的? Q3:小鸟游戏用的lua,是主要开发语言,还是辅助开发语言? 小鸟游戏可以在安卓和iOS上运行,那么。Lua有自己的虚拟机吗? Q4:pom文件中加入了actuator依赖,请问actuator可以用来实现对整个微服务系统的监控吗? Q5:跨域设置校验是谁完成的? 在配置文件中设置跨域信息后,是谁负责完成跨域校验的?是SpringBoot完成的吗?还是上层业务代码完成的?我个人理解是SpringBoot完成的,上层业务代码没有看到有相应的处理代码。 Q6:expose-headers表示“被暴露出去的Header属性”,暴露给谁?暴露给浏览器吗? 如果不设置,浏览器获取不到这些属性吗?是用什么方法不暴露的?对字段加密还是禁止访问? Q7:request_rate_limiter.lua,搜不到? 搜索方法:Edit ->Find->Find in Path,但搜不到,为什么?(下载的是最新代码,IDEA2019)2022-02-12115
- 刚强postman测试gateway,一直403。调查DefaultCorsProcessor.processRequest方法后发现,CorsUtils.isCorsRequest(request)=true。跨域了,origin=chrome-extension://XXXX。把这个加到yml里面就可以了。2022-04-181
- 王凯不支持一个路由多个限流规则配置2023-04-12归属地:安徽
- 小猪丶快跑完全没搞明白为什么限流是这样配置就可以了???2023-02-18归属地:湖南