作者:钟z4z萍 | 来源:互联网 | 2023-09-10 13:44
如何在微服务项目中集成spring gateway 前提:之前我是一直在维护我的自己的一个微服务项目,使用的是spring cloud这个微服务框架,在这个项目,我实践了以下技术及知识: 探索微服务项目的组成, 探索微服务项目的pom文件该如何管理、 集成dubbo、 探索定时任务、 探索前后端跨域、 微服务集成redis、 微服务集成rabbitmq、 设计秒杀流程防止超卖、 以及对秒杀的优化、 探索spring data jpa的集成和使用、 探索auth模块, 探索gateway模块的作用、 探索如何在微服务集成gateway模块,并 实现管理转发所有接口 。。。。
可以说,这个项目就是我的成长史,所有的技术,框架,对架构的理解,都来自这个我自己维护的项目
好了,接下来是具体细节:
1.在项目中创建一个gateway模块,如下:
2.pom文件 < dependencies> < dependency> < groupId> org.springframework.cloud< /groupId> < artifactId> spring-cloud-starter-netflix-hystrix< /artifactId> < /dependency> < dependency> < groupId> org.springframework.cloud< /groupId> < artifactId> spring-cloud-starter-gateway< /artifactId> < /dependency> < /dependencies>
3.bootstrap.yml文件配置
spring: cloud: gateway: routes: - id: gateway uri: http://localhost:10001 predicates: - Path = /user/** server: port: 10003
4.GateWayApplication启动类
5.postmain测试是否成功 http://localhost:10001/user/queryByUser?pageNum= 1 & pageSize = 1
使用gateway网关的端口访问
目前只是配置一个模块,还看不出gateway的作用,那如果有多个模块呢
server: port: 10003 spring: cloud: gateway: routes: - id: user uri: http://localhost:10001 predicates: - Path = /user/** - id: product uri: http://localhost:10002 predicates: - Path = /product/** - id: killOrder uri: http://localhost:10002 predicates: - Path = /killOrder/**
其实如果想要对某一个模块(端口)的全部路径进行开放,可以直接在uri中写 :/**即可 比如:
- id: product uri: http://localhost:10002 predicates: - Path = /**
也许有些人就会疑惑了,设置这个gateway干嘛用呀,他有啥作用啊? 这是我刚接触gateway时最大的疑问,我一直认为,只有知道一个东西的具体作用,或者说为什么要在项目中加这么一个模块,才能让人学的更快,更清晰,记的也更加牢固
1 .首先,如果有了gateway,那么,我们无论有多少个模块,无论每个模块的端口号是多少,我们只需要用gateway的端口号访问就可以了,我们就不需要记住各种模块的端口号了。
这只是gateway最基本的作用,gateway最重要的作用就是可以对所有的接口访问,在进入controller层之前进行拦截,处理。
2 .为什么要拦截?举几个我遇到的例子,比如用户体系中的token,没有gateway,你就得在每一个接口中对token进行生成,处理,和验证。可以毫不夸张的说,gateway是token实现的前提。
3 .再举个例子哈,比如跨域配置,我们知道,每一个前后端分离项目,第一个要处理的就是跨域问题,否则根本无法将前后端项目联系起来,至于什么是跨域,看这里: spring boot前后端分离项目如何解决跨域问题,提供三种方法: https://blog.csdn.net/yuanchangliang/article/details/108441273
如果没有gateway,那么在后端配置跨域,要么就在每一个模块中都写一个跨域配置类,要么就在每一个controller类上面都使用注解进行配置,简直太麻烦了。
如果有了gateway呢,我们只需要在gateway模块写一个跨域配置类即可,简单又优雅。
你们如果有什么问题,欢迎随时问我
-------我是道祖且长,一个在互联网苟且偷生的Java程序员