一、什么是网关
二、配置网关
- 创建一个gateway的maven项目,在pom文件中引入网关依赖和nacos依赖,注册到服务中心
<!--gateway负载均衡依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>3.1.5</version>
</dependency>
<!--nacos的服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--网关gateway依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--网关接口文档整合-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-gateway-spring-boot-starter</artifactId>
<version>4.4.0</version>
</dependency>
<!--网关限流需要使用-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
- 配置application.yml文件
spring:
application:
name: gateway #服务名称
cloud:
nacos:
server-addr: localhost:8848 #nacos地址
gateway:
routes: #网关路由配置
- id: user-service #路由id,自定义,只要唯一就行
uri: lb://userserver #路由的目标地址,lb(loadBalance)代表负载均衡,后面跟服务名称
predicates: #路由断言,也就是判断请求是否符合路由规则的条件,官方文档有10几种
- Path=/user/** #这个是按照路径匹配,只要以/user/开头就符合条件
- id: order-service
uri: lb://orderserver
predicates:
- Path=/order/**
default-filters:
- AddRequestHeader=auth,lanxiu
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 2 # 令牌桶每秒填充速率
redis-rate-limiter.burstCapacity: 2 # 令牌桶总容量
key-resolver: "#{@hostAddrKeyResolver}" # 使用 SpEL 表达式按名称引用 bean
- name: Retry
args:
retries: 3
statuses: TOO_MANY_REQUESTS,NOT_FOUND
methods: GET,POST
backoff:
firstBackoff: 10ms # 第一次重试前等待的时间为 10 毫秒。
maxBackoff: 50ms # 最大重试间隔时间不超过 50 毫秒。
factor: 2 # 每次重试之间的时间间隔将以 2 倍增长。
basedOnPreviousValue: false # 默认为 false,表示每次重试间隔时间都以 firstBackoff 为基础。
三、断言工厂
- 断言工厂:我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件,配置如下:
spring:
application:
name: gateway #服务名称
cloud:
nacos:
server-addr: localhost:8848 #nacos地址
gateway:
routes: #网关路由配置
- id: user-service #路由id,自定义,只要唯一就行
uri: lb://userserver #路由的目标地址,lb(loadBalance)代表负载均衡,后面跟服务名称
predicates: #路由断言,也就是判断请求是否符合路由规则的条件,官方文档有10几种
- Path=/user/** #这个是按照路径匹配,只要以/user/开头就符合条件
# - Before=2017-01-20T17:42:47.789-07:00[America/Denver]
官方文档:SpringCloud中文文档
四、过滤器配置
- 作用:网关过滤器用于拦截并链式处理Web请求,可以实现横切与应用无关的需求,比如:鉴权、限流、日志输出等
过滤器分类:
- 局部过滤器:只针对某个服务生效
- 默认过滤器:对所有服务都生效
- 自定义过滤器:对所有路由都生效的过滤器,并且可以自定义处理逻辑
1.局部过滤器:
spring:
application:
name: gateway #服务名称
cloud:
nacos:
server-addr: localhost:8848 #nacos地址
gateway:
routes: #网关路由配置
- id: user-service #路由id,自定义,只要唯一就行
uri: lb://userserver #路由的目标地址,lb(loadBalance)代表负载均衡,后面跟服务名称
predicates: #路由断言,也就是判断请求是否符合路由规则的条件,官方文档有10几种
- Path=/user/** #这个是按照路径匹配,只要以/user/开头就符合条件
# - Before=2017-01-20T17:42:47.789-07:00[America/Denver]
filters: #过滤器,官方文档有31种
- AddRequestHeader=Truth, lxwork is freaking aowsome! #添加请求头 order=1 优先级
# - AdxxxuestHeader=Truth, lxwork is freaking aowsome! #添加请求头 order=2
2. 默认过滤器:
spring:
application:
name: gateway #服务名称
cloud:
nacos:
server-addr: localhost:8848 #nacos地址
gateway:
routes: #网关路由配置
- id: user-service #路由id,自定义,只要唯一就行
uri: lb://userserver #路由的目标地址,lb(loadBalance)代表负载均衡,后面跟服务名称
predicates: #路由断言,也就是判断请求是否符合路由规则的条件,官方文档有10几种
- Path=/user/** #这个是按照路径匹配,只要以/user/开头就符合条件
# - Before=2017-01-20T17:42:47.789-07:00[America/Denver]
default-filters: #默认过滤器,会对所有的路由请求都生效,
#如果order值一样,会按照DefualtFilter-->路由过滤器-->GlobalFilter的顺序执行
- AddRequestHeader=Truth, lxwork is freaking aowsome! #添加请求头 order=order=1
# - AxxxxuestHeader=Truth, lxwork is freaking aowsome! #添加请求头 order=2
3.自定义过滤器:
认证用户登录案例:
/*
* 全局过滤器
* */
//@Order(-1) //指定过滤器的优先级,数字越小优先级越高,也可以通过实现orderd接口实现
@Component//注入spring容器中
public class AuthorizeFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1.获取请求参数
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> queryParams = request.getQueryParams();
//2.获取参数中的authorization参数
String authorization = queryParams.getFirst("authorization");
//3.判断是否等于admin
if("admin".equals(authorization)){
//4.是,放行
return chain.filter(exchange);
}
//5.否
//5.1设置状态码
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//5.2拦截
return exchange.getResponse().setComplete();
}
@Override
public int getOrder() {
return -1;
}
}
没加authorization参数
加了authorization参数之后
它们三个的优先级为:如果order值一样,会按照DefualtFilter–>路由过滤器–>GlobalFilter的顺序执行,平常只用order就可以觉得先后顺序了,order越小优先级越高
五、跨域请求配置
跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样,凡是发送请求的url的 协议、域名、端口号三者之间任意一者与当前页面地址不同的请求。这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。
配置application.yml
spring:
application:
name: gateway #服务名称
cloud:
nacos:
server-addr: localhost:8848 #nacos地址
gateway:
routes: #网关路由配置
- id: user-service #路由id,自定义,只要唯一就行
uri: lb://userserver #路由的目标地址,lb(loadBalance)代表负载均衡,后面跟服务名称
predicates: #路由断言,也就是判断请求是否符合路由规则的条件,官方文档有10几种
- Path=/user/** #这个是按照路径匹配,只要以/user/开头就符合条件
# - Before=2017-01-20T17:42:47.789-07:00[America/Denver]
filters: #过滤器,官方文档有31种
- AddRequestHeader=Truth, lxwork is freaking aowsome! #添加请求头 order=1 优先级
# - AdxxxuestHeader=Truth, lxwork is freaking aowsome! #添加请求头 order=2
default-filters: #默认过滤器,会对所有的路由请求都生效,
#如果order值一样,会按照DefualtFilter-->路由过滤器-->GlobalFilter的顺序执行
- AddRequestHeader=Truth, lxwork is freaking aowsome! #添加请求头 order=order=1
# - AxxxxuestHeader=Truth, lxwork is freaking aowsome! #添加请求头 order=2
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些网站的跨域请求
- "http://localhost:63342"
- "http://www.leyou.com"
allowedMethods: # 允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期