一.简介
1.前言
SpringCloud是一套理论框架,在这套框架中,本来使用的zuul担当网关,但是由于zuul的开发团队内部的一些问题,导致迟迟不更新。所以Spring的开发团队开发了新一代网关Gateway。
2.优点
- Spring Cloud Gateway是基于Spring Framework5,Spring Boot2.0和Project Reactor进行构建
3.关键点
Gateway主要组件为:路由(routes)、断言(predicates)、过滤器(filters)
- predicates为路由的匹配条件,只有满足该路由的断言的请求,才能被该路由处理。
- filters通过自定义类实现GlobalFilter,Ordered,并重写filter方法和getOrder方法。getOrder用来指定该自定义过滤器的执行顺序。
二.使用
1.静态路由
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
编写配置文件
server:
port: 9900
eureka:
client:
fetch-registry: false
register-with-eureka: true
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
# 显示在eureka网页status处名字,集群中要唯一
instance-id: cloud-gateway
# 点击eureka网页上该服务的名字,可以显示服务的ip地址
prefer-ip-address: true
# 显示在eureka网页application处名字,集群中要相同
spring:
application:
name: cloud-gateway
cloud:
gateway:
routes:
- id: cloudtext1
# 静态路由写死地址,没有负载均衡
uri: http://localhost:8001
predicates:
- Path=/login/**
在启动类上加上@EnableEurekaClient注解
2.动态路由
其他步骤都一样,只是配置文件不同
server:
port: 9900
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
# 显示在eureka网页上的名字
instance-id: cloud-gateway
# 点击eureka网页上该服务的名字,可以显示服务的ip地址
prefer-ip-address: true
spring:
application:
name: cloud-gateway
cloud:
inetutils:
ignored-interfaces:
- VMware.* # 忽略虚拟机网卡
- Npcap.* # 忽略虚拟机网卡
gateway:
discovery:
locator:
enabled: false
routes:
- id: cloudtest1
uri: lb://CLOUDTEST
predicates:
- Path=/cloudtest/**
filters:
- StripPrefix=1
- 若 discovery.locator.enabled = true,那么需要前端请求路径中带上eureka中的大写服务名,也就是说若请求路径为/login,那么前端请求网关时应该为
大写服务名/login
。 - discovery.locator.lowerCaseServiceId: true,则前端请求网关时应为
小写服务名/login
- 而上述的写法是通过断言自定义请求路径,上面配置的意思是,当前端请求为/cloudtest/**的路径,就会由该条id的路由进行处理。
uri: lb://CLOUDTEST
表示该条路由会转发给CLOUDTEST服务处理。filters.StringPrefix = 1
代表转发给CLOUDTEST服务时,第一道路由去掉,也就是只将/**转发给CLOUDTEST服务。