一、什么是Spring Cloud Gateway
Spring Cloud Gateway是一个API网关,可以统一管理我们的微服务的API调用,具有路由转发,权限校验,限流等功能。
二、为什么需要
比如我们有100个微服务,每个微服务ip和端口都不同,总不可能前端调用的时候配置100个ip端口,或者在nginx配置100个ip端口吧,所以最佳的解决方案就是引入一个高性能的API网关,该网关最好可以跟注册中心集成,这样我们前端调用nginx,nginx配置网关集群,然后网关统一对所有微服务的调用路由进行管理。
三、环境搭建
1、先准备一个服务
可以参考如下链接准备一、springCloudAlibaba-nacos环境搭建,我这里准备的是可以跟注册中心搭交道的,毕竟网关里面也不可能直接配置微服务的地址。当然这一篇文章gateway网关暂时不接入nacos先,先把环境搭建起来。
2、准备maven项目
我这里的就基于上面微服务对应的父工程来搭建了。引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
这里用的版本是2.2.6.RELEASE,若是没有按之前环境搭建引入父工程的话可以加上这个版本
3、准备启动类
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
4、准备配置文件
application.yml
server:
port: 8088
spring:
application:
name: api-gateway
cloud:
#gateway配置
gateway:
#路由规则
routes:
- id: order_route # 路由的唯一标识
uri: http://localhost:8010 #需要转发的地址
#断言规则 用于路由规则的匹配
predicates:
- Path=/order-service/**
#匹配请求http://localhost:8088/order-service/order/add
#过滤器 用于过滤请求
filters:
- StripPrefix=1 #转发之前去掉第一层路径
#http://localhost:8010/order/add
#- id: stock_route
主要四看上面的配置,上面已经涉及了gateway网关的:路由、断言、过滤
路由:是一个数组,可以配置多个,每个有唯一id指定,id名字可以任意,不冲突即可,uri对应要转发的服务地址,也就是要代理的微服务地址,这里我的订单服务就是8010端口
断言:也是可以有多个,因为我们用了gateway网关后,前端请求的就是网关的地址了,也就是8088,而不会直接请求服务的地址,那么网关怎么知道要把前端的请求转发到哪个服务?这里就靠断言了,上面配置的/order-service/**
意思是前端请求网关的地址路径上如果以order-service开头就都转到该条路由规则,也就是这种请求
http://localhost:8088/order-service/order/add
网关判断有order-service开始就会转发到
http://localhost:8010/order-service/order/add
但是这样请求肯定也是不行的,毕竟我们的订单服务8010根本就没有order-service这个路径,怎么办呢,这就要用到过滤了。
过滤:StripPrefix=1的意思就是转发之前去掉第一层路径,也就是把
http://localhost:8010/order-service/order/add
变为
http://localhost:8010/order/add
再转发,这样就合情合理了!
5、启动测试
访问http://localhost:8088/order-service/order/add, 得到了预期的结果!