目录
一、Gateway简介
1.1 Gateway简介
Spring Cloud Gateway旨在提供一种简单而有效的方式来对API进行路由,并为他们提供切面,例如:安全性,监控/指标 和弹性等。
1.2 Gateway原理
客户端向spring-cloud-gateway请求网关映射处理程序(gateway handler mapping),如果确认请求与路由匹配,则将请求发送到web处理程序(gateway web handler),web处理程序通过特定于该请求的过滤器链处理请求,图中filters被虚线划分的原因是filters可以在发送代理请求之前(pre filter)或之后执行逻辑(post filter)。先执行所有pre filter逻辑,然后进行请求代理。在请求代理执行完后,执行post filter逻辑。
二、Gateway程序案例
2.1 总体说明
本项目总体上为一个分步骤编写完成SpringCloud微服务开发项目的示例程序,使用了Eureka服务注册(第一步)、Ribbon请求负载均衡(第二步)和SpringCloud Gateway微服务网关(第三步)、Feign完成统一服务接口调用(第四步)。
本案例说明为第三步:在前两步完成的基础上,引入SpringCloud-Gateway,通过网关统一调用服务。
本案例在第二步案例基础上,原有项目不做改变,只是新建了Gateway子项目,有变化的内容如图:
注意:由于SpringCloud-Gateway是基于webflux的,它跟传统的springboot-mvc是冲突的,因此不需在其中排除springmvc相关包!
2.2 新建SpringCloud-Gateway子项目
1.在父项目中,新建子模块项目:new->Module依然选择maven项目。
本项目名称我们命名为Gateway。
2.配置pom.xml
依赖项配置如下:
<dependencies>
<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- SpringCloud网关Gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
注意:由于SpringCloud-Gateway是基于webflux的,它与spring boot mvc方式不兼容,启动Gateway会报错,因此不要引入spring-boot-starter-web依赖!
3.配置application.yml文件
Gateway项目也是一个Eureka客户端,并且需要SpringCloud-Gateway自身的配置:
4.编写SpringBoot应用主类
2.3 结果验证
1.按顺序启动各个子项目
先启动EurekaService子项目,它是Eureka服务器,其他子模块都需作为Eureka客户端在它上面进行注册!
再启动Gateway、ServiceOne、ServiceOneCopy、ServiceTwo和ServiceThree,启动后如下图:
2.进入Eureka服务状态页面,查看服务注册情况
在谷歌浏览器中输入:http://127.0.0.1:8000/,进入Eureka服务页面,我们查看当前注册情况:
3.验证已有的各业务接口
在使用Gateway之后,所有的请求都应当通过Gateway来统一调用各个微服务业务模块的接口,根据Gateway的配置,调用形式统一为:
http://Gateway_HOST:Gateway_PORT/大写的serviceId/**
我们在浏览器地址栏或者PostMan中依次请求已存在的几个接口地址:
1)ServiceOne模块业务接口
http://127.0.0.1:8088/SERVICE-ONE/serviceOne
由于ServiceOne和ServiceOneCopy都使用同一个应用ID:“service-one”,因此Gateway通过应用ID请求“serviceOne”接口时,已经自动进行了负载均衡,第二次重复调用的结果:
2)ServiceTwo模块业务接口
http://127.0.0.1:8088/SERVICE-TWO/serviceTwo
3)ServiceThree模块业务接口(负载均衡)
http://127.0.0.1:8088