目录
官网文档:https://cloud.spring.io/spring-cloud-gateway/reference/html
所有配置参数文档:https://cloud.spring.io/spring-cloud-gateway/reference/html/appendix.html
网关系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能,提供路由请求、鉴权、监控、缓存、限流等功能。
路由是网关最基础的部分,它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
Java8 中的断言函数。Spring Cloud Gateway 中的断言函数输入类型是 Spring 5.0 框架中 的 ServerWebExchange。Spring Cloud Gateway 中的断言函数允许开发者去定义匹配来自于 Http Request 中的任 何信息,比如请求头和参数等。
一个标准的 Spring Web Filter。Spring Cloud Gateway 中的 Filter 分为两种类型,分别是 Gateway Filter 和 Global Filter。过滤器将会对请求和响应进行处理。
网关是一个单独的子服务,要新建一个微服务模块
pom.xml 中添加依赖
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-gatewayartifactId>
- dependency>
pom.xml 中移除依赖
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
application.yml 文件配置 gateway
- server:
- port: 7000
- spring:
- cloud:
- gateway:
- routes:
- - id: user-service
- uri: http://localhost:9000
- order: 1
- predicates:
- - Path=/user-server/**
- filters:
- - StripPrefix=1
配置说明:
- routes:核心概念路由。这里配置路由,数组的形式
- id:自定义路由唯一标识,用于区别于其他的路由
- uri:路由指向的目的地URL,例如要路由转发到 用户服务,用户服务的地址是 http://localhost:9000,这里就写 http://localhost:9000
- order:优先级,数字越小优先级越高
- predicates:核心概念断言,断言有很多种类型,写多个的时候,必须都满足才转发
- Path:根据路径断言,意思是通过访问url的前缀匹配到该路由,转发到该路由上的uri地址,这里配置的是/user-server/**。页面访问 http://localhost:7000/user-server/xx,就进入到此路由把 请求转发到 http://localhost:9000/xx 路径上。
- Header:请求头断言,带有指定请求头的才进行路由,适用场景:公共头
- Method:请求方法(get、post等)断言,符合的才进行路由
- Query:请求参数断言,请求包含指定的参数才进行路由,适用场景:公共参数
- 说明:内置路由是RoutePredicateFactory这个接口的实现。更多断言示例请查看官网:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories
- filters:核心概念过滤,过滤有很多种,这里使用的是 StripPrefix。
- StripPrefix:去除路径上的前缀,数字写几,就是去除url上前几个 / 斜杠的地址。例如:http://localhost:7000/user-server/xxx,就会路由到 http://localhost:9000/user-server/xxx 接口,StripPrefix=1,就是去除 /user-server,路由到 http://localhost:9000/xxx 接口。
- 说明:内置局部过滤器是GatewayFilterFactory这个接口的实现。更多过滤器示例请查看官网:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories
- 说明:全局过滤器是GlobalFilter接口的实现。官网:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#global-filters
效果:
pom.xml 中添加依赖
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-loadbalancerartifactId>
- dependency>
通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能
application.yml 文件配置 nacos
- spring:
- cloud:
- nacos:
- # 配置 nacos 服务地址
- discovery:
- server-addr: 127.0.0.1:8848
- gateway:
- routes:
- - id: user-service
- # 这里就不是写死ip了,这里写注册在nacos上服务名,lb是负载均衡的意思
- uri: lb://user-service
- order: 1
- predicates:
- - Path=/user-server/**
- filters:
- - StripPrefix=1
- # 开启网关自动拉取 nacos 配置的服务
- discovery:
- locator:
- enabled: true
- @Component
- public class UserGlobalFilter implements GlobalFilter, Ordered {
-
- @Override
- public Mono
filter(ServerWebExchange exchange, GatewayFilterChain chain) { - // 这里写业务逻辑, 比如 查询数据库、redis、校验 token 等逻辑
- String token = exchange.getRequest().getHeaders().getFirst("token");
- if (null == token) {
- exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
- // 执行完成,返回 401 失败状态码
- return exchange.getResponse().setComplete();
- }
- // 继续向下一个过滤器执行
- return chain.filter(exchange);
- }
-
- /**
- * 设置过滤器的优先级,数字越小,越先执行
- */
- @Override
- public int getOrder() {
- return 0;
- }
- }