前置配置:配置Nacos注册中心(略)
Nacos用来管理微服务的注册与发现以及配置中心
org.springframework.boot
spring-boot-starter-web
org.springframework
spring-webmvc
org.springframework.cloud
spring-cloud-starter-gateway
2.2.5.RELEASE
org.springframework.boot
spring-boot-starter-actuator
2.2.5.RELEASE
com.alibaba.cloud
spring-cloud-alibaba-sentinel-gateway
2.2.5.RELEASE
server:
port: 8100 #网关服务访问端口
spring:
application:
name: gateway #网关服务名称
cloud:
#配置中心
nacos:
discovery:
server-addr: localhost:8848
gateway:
#路由的id,唯一,一个网关里面可以建多个路由
#一个路由指向一个服务,起名字一般与服务相关
routes:
- id: producer_route
uri: lb://producer #lb代表负载均衡,从nacos中获取微服务,使用负载均衡策略访问
predicates:
- Path=/producer-api/** #使用断言:条件 判断url里面是否包含它
filters:
- StripPrefix=1 #过滤器
@SpringBootApplication
@EnableDiscoveryClient //服务注册与发现
public class GateWayApplication {
public static void main(String[] args) {
SpringApplication.run(GateWayApplication.class,args);
}
}
路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。
生命周期:
PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等
POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的 HTTPHeader、收集统计信息和指标、将响应从微服务发送给客户端等。
根据 Filter 的作用范围可以分成两种:GatewayFilter 与 GlobalFilter。
GatewayFilter:应用到单个路由或者一个分组的路由上。
GlobalFilter:应用到所有的路由上。
其中局部过滤器一般用的比较少,这里只对全局过滤器进行介绍
全局过滤器作用于所有路由, 无需配置。通过全局过滤器可以实现对权限的统一校验,安全性验证等功能。
GateWay内置了一些全局过滤器,它们都实现 GlobalFilter 和 Ordered 接口。有兴趣的读者可以自行查看 GlobalFilter 的实现类或浏览下文提供的官方文档获取详细信息。
这里我们主要演示自定义全局过滤器。比如:我们在接受请求时需要验证 token。
@Component
public class LoginGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//获取请求参数
ServerHttpRequest request = exchange.getRequest();
List token = request.getHeaders().get("token");
if(token!=null && token.size()>0 ){
//token存在,继续从redis中获取token校验
//校验通过,放行
return chain.filter(exchange);
}else{
//token校验失败,返回错误信息
//方式一:通过抛出异常,在全局异常处理中返回错误信息
//方式二:正常返回
//注意ServerHttpResponse包别导错了
ServerHttpResponse response = exchange.getResponse();
response.getHeaders().add("content-type","application/json");
ResultObject result = new ResultObject(301, "token校验错误");
String s = JSONObject.toJSONString(result);
DataBuffer wrap = response.bufferFactory().wrap(s.getBytes());
return response.writeWith(Flux.just(wrap));
}
}
@Override
public int getOrder() {
//过滤器执行顺序,值越小越优先
return 0;
}
}
只需要添加这个配置类就完成了全局过滤器的配置
注意:配置了GateWay跨域之后需要把SpringMVC的跨域关闭
@Configuration
public class GlobalCorsConfig {
@Bean
public CorsFilter corsFilter(){
CorsConfiguration config=new CorsConfiguration();
//config.addAllowedOrigin("*"); //-过时的
//允许哪些域名访问
config.addAllowedOriginPattern("*");
//是否允许前端传递验证信息 cookie
config.setAllowCredentials(true);
//允许所有的方法 POST GET ...
config.addAllowedMethod("*");
//允许哪些请求头
config.addAllowedHeader("*");
//暴露哪些头部信息
config.addExposedHeader("*");
//设置允许哪些接口可以被跨域访问
UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**",config);
return new CorsFilter(source);
}
}