简介:在Spring Cloud中,网关的角色是非常重要的,它负责整个系统的入口流量,并且可以处理路由、过滤、协议转换等操作

目录

1、网关的技术实现

1.1 网关功能

1.2 网关的形式

2、网关实现步骤

2.1 添加相关依赖

2.2 创建此module的main()方法,用来启动此服务

3、路由过滤器

3.1 路由断言工厂

4.1 路由过滤工厂

4.2 全局过滤器

4.3 跨域问题处理

4、总结


1、网关的技术实现

1.1 网关功能

图 1.1-1 网关功能

springcloud 网关安全 springcloud中网关_spring boot

上图中展示的便是网关的作用:

  • 身份认证和权限校验:对不同的登录用户校验身份,确定有那些访问权限
  • 服务路由、负载均衡:确定登录的用户访问那些服务,从而调用空闲的服务
  • 请求限流:当访问量过多,就限制用户登录或者让用户等待

1.2 网关的形式

图 1.2-1 网关的两种形式

springcloud 网关安全 springcloud中网关_spring boot_02

2、网关实现步骤

2.1 添加相关依赖

图 2.1-1 添加相关依赖

springcloud 网关安全 springcloud中网关_后端_03

上图中展示的是搭建网关的第一步:

  • 在项目中创建一个新的模块
  • 在新模块pom文件中添加依赖

2.2 创建此module的main()方法,用来启动此服务

图 2.2-1 创建此module的main()方法

springcloud 网关安全 springcloud中网关_springcloud 网关安全_04

上图中展示的是在当前项目中创建一个 gateway 模块而且创建此模块的main()方法,用来启动此服务

3、路由过滤器

3.1 路由断言工厂

图 3.1-1 路由断言工厂

springcloud 网关安全 springcloud中网关_spring cloud_05

  • 我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件
  • 例如Path=/user/**是按照路径匹配,这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的
  • 像这样的断言工厂在SpringCloudGateway还有十几个

4.1 路由过滤工厂

图 4.1-1 路由过滤工厂

springcloud 网关安全 springcloud中网关_后端_06


springcloud 网关安全 springcloud中网关_spring_07

上图中展示的便是路由过滤工厂的常见过滤器

4.2 全局过滤器

package cn.itcast.gateway;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * 全局过滤器
 */
public class AuthorizeFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> map = request.getQueryParams();
        // 2.获取authorization参数
        String authorizeFilter = map.getFirst("authorizeFilter");
        // 3.校验
        if ("admin".equals(authorizeFilter)){
            // 4.校验成功,放行
            Mono<Void> mono = chain.filter(exchange);
            return mono;
        }
        // 5.校验失败,结束处理
        exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        return exchange.getResponse().setComplete();

    }

    // 设置全局过滤器的执行顺序,数字越小越先执行
    @Override
    public int getOrder() {
        return -1;
    }
}

4.3 跨域问题处理

图 4.3-1 跨域问题处理

springcloud 网关安全 springcloud中网关_spring_08

上图展示的便是处理跨域问题的方法,即在网关微服务的配置文件中,添加如上对应配置(参数要根据开发情况做出调整)

4、总结