学习SprinngCloud到了网关这一组件,照例简单记录下网关的作用
网关有以下几个作用:
在1.x版本中都是采用Zuul网关。但是在2.x版本中,zuul的升级一直跳票,SpringCloud最后自己研发了一个网关代替Zuul,就是SpringCloud Gateway,Gateway就是原zuul1.x版的替代。
Spring Cloud Gateway 里明确的区分了 Router 和 Filter,并且一个很大的特点是内置了非常多的开箱即用功能,并且都可以通过 SpringBoot 配置或者手工编码链式调用来使用。
比如内置了 10 种 Router,使得我们可以直接配置一下就可以随心所欲的根据 Header、或者 Path、或者 Host、或者 Query 来做路由。
比如区分了一般的 Filter 和全局 Filter,内置了 20 种 Filter 和 9 种全局 Filter,也都可以直接用。当然自定义 Filter 也非常方便。
接着开始实战,首先创建一个新的moudule,就叫gateway
然后引入依赖
org.springframework.cloud
spring-cloud-starter-gateway
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
接着创建启动类
package com.wl.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author wl
* @date 2022/3/7 16:34
*/
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
System.out.println("o(* ̄▽ ̄*)o启动成功!!!⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄");
}
}
然后对配置文件进行配置
server:
port: 10010
spring:
application:
name: gateway
cloud:
gateway:
# 网关路由配置
routes:
- id: user-service
# lb表示负债均衡
uri: lb://user-service
# 断言
predicates:
# 按照路径匹配
- Path=/user/**
# 过滤器
filters:
- AddRequestHeader=topic, wl is a good man
其中predicates意为断言,配置Path=/user/**表示只有以/user开头的请求路径才会放行,否则拦截。除了可以按路径匹配,还可以设置按时间,比如Before=xx时间表示在xx时间前放行,After=xx时间表示在xx时间后放行,一共有11种选项可进行配置
filter过滤器则可以对请求和响应进行修改处理,此处配置为给user-service这个服务的请求头添加一段话。Spring Cloud Gateway 内置的过滤器工厂一览表如下:
启动服务,访问10010端口,如图
除此以外,还有一个GlobalFilter可以作为全局的过滤器,这里同样参考黑马程序员视频写了个小例子,针对权限为admin的用户放行,否则拦截。
package com.wl.gateway.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
* @author wl
* @date 2022/3/7 17:00
*/
@Order(Ordered.HIGHEST_PRECEDENCE)
@Component
public class AuthorizeFilter implements GlobalFilter {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1.获取请求参数
ServerHttpRequest request = exchange.getRequest();
MultiValueMap queryParams = request.getQueryParams();
//2.获取请求参数中的authorization参数
String authorize = queryParams.getFirst("authorization");
//3.判断参数是否等于admin
if ("admin".equals(authorize)) {
//4.是,放行
return chain.filter(exchange);
}
//5.1 设置状态码
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//5.2 拦截请求
return exchange.getResponse().setComplete();
}
}
重新启动,再次访问
显示401,在url后面加上?authorization=admin再次访问
另外,如果有多个过滤器,可以配置@Order注解里的数字来进行排序,数字越小,执行顺序越靠前。