Spring Cloud Gateway是Spring Cloud的一个子项目,它是一个基于Spring Framework 5,Spring Boot 2和Project Reactor等技术的API网关,可以用于构建微服务架构中的网关服务。

使用步骤:

前置配置:配置Nacos注册中心(略)

Nacos用来管理微服务的注册与发现以及配置中心

1.创建SpringBoot项目(略)

2.添加依赖(SpringBoot基础依赖以及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

3.配置文件(bootstrap.yml)

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 #过滤器

4.启动类

@SpringBootApplication

@EnableDiscoveryClient //服务注册与发现

public class GateWayApplication {

public static void main(String[] args) {

SpringApplication.run(GateWayApplication.class,args);

}

}

5.浏览器输入localhost:8100/producer-api/xxx,该路径下的资源都会经过网关处理

过滤器

路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。

生命周期:

PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等

POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的 HTTPHeader、收集统计信息和指标、将响应从微服务发送给客户端等。

根据 Filter 的作用范围可以分成两种:GatewayFilter 与 GlobalFilter。

GatewayFilter:应用到单个路由或者一个分组的路由上。

GlobalFilter:应用到所有的路由上。

其中局部过滤器一般用的比较少,这里只对全局过滤器进行介绍

全局过滤器配置

全局过滤器作用于所有路由, 无需配置。通过全局过滤器可以实现对权限的统一校验,安全性验证等功能。

GateWay内置了一些全局过滤器,它们都实现 GlobalFilter 和 Ordered 接口。有兴趣的读者可以自行查看 GlobalFilter 的实现类或浏览下文提供的官方文档获取详细信息。

这里我们主要演示自定义全局过滤器。比如:我们在接受请求时需要验证 token。

1.自定义全局过滤器类

@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);

}

}

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: