如何在微服务项目中集成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 # 路由的id,没有规定规则但要求唯一,建议配合服务名
#匹配后提供服务的路由地址
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 # 路由的id,没有规定规则但要求唯一,建议配合服务名
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=/** #这样写就是对10002端口下的所有接口进行转发
也许有些人就会疑惑了,设置这个gateway干嘛用呀,他有啥作用啊?
这是我刚接触gateway时最大的疑问,我一直认为,只有知道一个东西的具体作用,或者说为什么要在项目中加这么一个模块,才能让人学的更快,更清晰,记的也更加牢固
1.首先,如果有了gateway,那么,我们无论有多少个模块,无论每个模块的端口号是多少,我们只需要用gateway的端口号访问就可以了,我们就不需要记住各种模块的端口号了。
这只是gateway最基本的作用,gateway最重要的作用就是可以对所有的接口访问,在进入controller层之前进行拦截,处理。
2.为什么要拦截?举几个我遇到的例子,比如用户体系中的token,没有gateway,你就得在每一个接口中对token进行生成,处理,和验证。可以毫不夸张的说,gateway是token实现的前提。
3.再举个例子哈,比如跨域配置,我们知道,每一个前后端分离项目,第一个要处理的就是跨域问题,否则根本无法将前后端项目联系起来,至于什么是跨域,看这里:
spring boot前后端分离项目如何解决跨域问题,提供三种方法:
如果没有gateway,那么在后端配置跨域,要么就在每一个模块中都写一个跨域配置类,要么就在每一个controller类上面都使用注解进行配置,简直太麻烦了。
如果有了gateway呢,我们只需要在gateway模块写一个跨域配置类即可,简单又优雅。
你们如果有什么问题,欢迎随时问我
-------我是道祖且长,一个在互联网苟且偷生的Java程序员