SpringBoot整合SpringCloud组件-Gateway网关

SpringBoot整合SpringCloud组件-Gateway网关,第1张

SpringBoot整合SpringCloud组件-Gateway网关 一、网关的简单介绍 (一)网关的定义和职能 1、网关的的定义

网关的角色是作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问。

API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的调用者透明。因此,隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务,而不用去处理这些策略性的基础设施。

2、网关的的职能

(二)Gateway的介绍 1、什么是Gateway

Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

2、为什么要用Gateway

Gateway是用来替代Zuul网关的,其明确的区分了Router和Filter,并且内置了许多功能都可以通过配置就行直接使用。
其内置了多种Router,可以在配置文件中根据Header、Path、Host等方式来做路由,我后面只介绍通过path的方式进行路由,至于其他方式可以自行查看网上资料。
其也内置了一般Filter和全局Filter,我们也可以自定义Filter进行业务处理,后面将介绍通过内置的Filter对请求path进行处理以及通过自定义Filter对token进行校验。

3、概念

二、基础路由规则的配置使用 (一)项目说明

用gateway作为项目的整体网关,所有请求都先打到gateway上,经过安全、权限过滤以后通过的请求再根据路由规则从nacos上获取服务名然后转发到对应的服务上。

gateway网关项目整体就是一个springboot项目,在项目里面做路由配置以及权限过滤等 *** 作,该项目整体结构如下:

(二)依赖的导入

由于是微服务的,所以需要导入springcloud和springCloudAlibaba的依赖,至于2者与springboot版本之间的应该选择哪个版本可以参考我之前的文章:Spring,SpringCloud,SpringCloudAlibaba各版本对应关系


由于要用nacos做为注册中心获取各服务的真实地址,所以还需要导入nacos

当然gateway本身的依赖也是必不可少的

(三)配置文件说明
server:
  port: 7000
#
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      globalcors:
        # gateway 跨域设置
        cors-configurations:
          '[
@Component
public class GlobalTokenFilter  implements GlobalFilter, Ordered {

    private static final String PATH = "/login";
    public static final String SECRET = "develop-Platform";            // JWT密钥
    public static final String TOKEN_KEY = "Authorization";// 存放Token的Header Key

    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();

        // 获取请求路径
        String path = request.getPath().toString();
        //登录请求直接到认证服务
        if(path.contains(PATH)){
            return chain.filter(exchange);
        }

        //验证token
        HttpHeaders headers = request.getHeaders();
        List headerList = headers.get(TOKEN_KEY);
        if(headerList.isEmpty()){
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            String msg = "无token,请重新登录";
            DataBuffer buffer = response.bufferFactory().wrap(msg.getBytes());
            return response.writeWith(Mono.just(buffer));
        }

        String token = headerList.get(0);
        String userId;
        try {
            userId = JWT.decode(token).getAudience().get(0);
        } catch (JWTDecodeException j) {
            throw new RuntimeException("401");
        }

        // 验证 token
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
        try {
            jwtVerifier.verify(token);
        } catch (JWTVerificationException e) {
            throw new RuntimeException("401");
        }

        ServerHttpRequest host = request.mutate().header("userId",userId).header("userToken",token).build();

        //将request变成change对象
        ServerWebExchange build = exchange.mutate().request(host).build();
        return chain.filter(build);
    }

    //实现Ordered接口保证优先级,值越小加载的优先级越高
    @Override
    public int getOrder() {
        return -1;
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5659611.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存