Spring Cloud 微服务项目实战
姚秋辰(姚半仙)
PayPal 研发经理
15862 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
结束语 (1讲)
Spring Cloud 微服务项目实战
15
15
1.0x
00:00/00:00
登录|注册

26 | 微服务网关:如何设置请求转发、跨域和限流规则?

你好,我是姚秋辰。
在上节课中,我们了解了如何在 Spring Cloud Gateway 中加载一个路由,以及常用的内置谓词都有哪些。今天我们就来动手实践一把,在实战项目中搭建一个 Gateway 网关,并完成三个任务:设置跨域规则、添加路由和实现网关层限流。这三个任务将以怎样的方式展开呢?
首先是跨域规则,它是一段添加在配置文件中的逻辑。我将在编写网关配置文件的同时,顺便为你讲解下跨域的基本原理,以及如何设置同源访问策略。
然后,我将使用基于 Java 代码的方式来定义静态路由规则。当然了,你也可以使用配置文件来编写路由,用代码还是用配置全凭个人喜好。不过呢,如果你的路由规则比较复杂,比如,它包含了大量谓词和过滤器,那么我还是推荐你使用代码方式,可读性高,维护起来也容易一些。
最后就是网关层限流,我们将使用内置的 Lua 脚本,并借助 Redis 组件来完成网关层限流。
闲话少叙,我们先去搭建一个微服务网关应用吧。你可以在Gitee 代码仓库中找到下面所有源码。

创建微服务网关

微服务网关是一个独立部署的平台化组件,我们先在 middleware 目录下创建一个名为 gateway 的子模块。接下来的工作就是按部就班地搞定依赖项、配置项和路由规则。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何在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-10
    5
  • inrtyx
    老师,能否讲讲网关如何鉴权?即鉴权时序图

    作者回复: 网关鉴权可以通过oauth实现(spring提供了spring-cloud-starter-oauth2),根据oauth 2.0的规范有很多种不同的对接方式。我推荐一个网站可以进一步了解oauth规范 https://oauth.net/2/

    2022-02-11
    3
  • 黄叶
    老师请问下,今天试着写了gateway+vue整合。 vue请求发送给后端,预检通过了但是当真正发送跨域请求时,提示:CORS错误,也配置了gateway跨域 但是就是不成功

    作者回复: 我在想会不会是后台跨域的method列表里只写了Options,没有加上其他方法呢?同学可以把浏览器里的request header(包括Options和后面那个真实请求)发出来我们看下

    2022-02-11
    3
    1
  • 乘风
    我怎么没看明白如何测试,是访问哪个地址?

    作者回复: 访问网关应用的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-12
    1
    15
  • 刚强
    postman测试gateway,一直403。调查DefaultCorsProcessor.processRequest方法后发现,CorsUtils.isCorsRequest(request)=true。跨域了,origin=chrome-extension://XXXX。把这个加到yml里面就可以了。
    2022-04-18
    1
  • 王凯
    不支持一个路由多个限流规则配置
    2023-04-12归属地:安徽
  • 小猪丶快跑
    完全没搞明白为什么限流是这样配置就可以了???
    2023-02-18归属地:湖南
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部