SpringCloud-GateWay

这篇具有很好参考价值的文章主要介绍了SpringCloud-GateWay。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景介绍

随着微服务架构的盛行,项目由原来的单体系统不断进行演变到现在的微服务,系统被拆分为合适粒度的多个服务,当面临多服务的调用,客户端(发送请求的一段)要如何去调用这么多的微服务呢?如果按照没有使用网关的方式去调用对于客户端是不是就需要知道每一个服务的地址信息,然后一个一个的记录去调用,这对于客户端来说是非常糟糕的;对于服务端来说也并不省事,如果需要对多个服务进行鉴权、认证等操作,单独对每个服务进行配置这样不利于实现系统的可复用性和可靠性,因此springcloud提供了GateWay


二、过程

GateWay是什么?

GateWay是Spring公司提供网关,目的是为微服务架构提供简单有效的API路由管理方式以及基于Filter链的方式提供的安全、监控和限流等等功能
官网:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-starter

网关的作用是什么?

给客户端提供统一的服务入口,当服务请求到达后端的时候先经过网关,根据网关配置的路由和断言规则进行转发到具体的某一个服务地址上,我们可以把Gateway理解为是中转站。Gateway我们可以理解为将用户请求和服务端进行了隔离,当请求来临的时候会先经过gateway,此时被拦截下来进行统一的权限判断,判断服务时候具备访问权限,如果具备权限则通过,反之则拦截。
SpringCloud-GateWay,spring cloud,gateway,微服务
路由:需要转发的服务地址
断言:请求地址的时候需要满足的条件

GateWay有什么优点?

内置功能强度大,如:转发、监控、限流

GateWay有什么缺点?

不能部署在Tomcat等Servlet容器中,只能达成jar包执行
使用时需要基于SpringBoot2.0以上的版本

GateWay的出现是为了解决什么问题?(为什么会有网关?)

没有使用GateWay前:

SpringCloud-GateWay,spring cloud,gateway,微服务

客户端需要记录每一个服务的地址;如果系统需要进行鉴权、认证,每个服务单独鉴权认证,业务复杂;存在跨域问题,解决起来复杂

使用GateWay后:

SpringCloud-GateWay,spring cloud,gateway,微服务

GateWay作为所有服务统一的入口,在GateWay中我们可以统一进行鉴权、认证等等操作,当满足条件才转发到目标地址,增加了安全性

GateWay的组成有哪些?

  • routes:路由数组

  • id:当前路由的唯一标识

  • uri:请求要转发的地址

  • order:路由的优先级,数字越小级别越高

  • predicates:断言,判断请求是否符合要求,符合要求则转发到目标路由地址
    SpringCloud-GateWay,spring cloud,gateway,微服务
    说明:按照图中配置的断言规则是:当请求url路径中是以/user-service开头就认为是符合的
    SpringCloud-GateWay,spring cloud,gateway,微服务

  • filters:路由过滤器,处理请求或响应


如何使用GateWay?——实例演示

项目版本:SpringCloud

新建gateway服务,引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

主函数中添加@EnableDiscoveryClient注解

在启动项中添加@EnableDiscoveryClient注解,开启nacos发现服务。所有的服务都是通过nacos注册到注册中心,而gateway服务要从nacos中去发现服务

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

添加配置文件


server:
  port: 8091
spring:
  application:
    name: internetbar-gateway
  profiles:
    active: local
  cloud:
    nacos:
      discovery:
        server-addr: 152.136.111.77:8848
        namespace: 0759bc76-60b5-4f32-acd5-e5095cf2b93d        
    gateway:
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedHeaders: "*"
            allowedOrigins: "*"
            allowCredentials: true
            allowedMethods: "*"
          default-filters:
            - DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials Vary, RETAIN_UNIQUE
      discovery:                      #通过注册中心获取路由地址
        locator:
          enabled: true               #让gateway可以发现nacos中的微服务
      routes:                         #路由数组
        - id: user_route              #当前路由的标识,唯一标识
          uri: lb://internetbar-provider-user   #请求要转发的地址
          order: 1                    #路由的优先级,数字越小级别越高
          predicates:                 #断言(路由转发要满足什么条件)
            - Path=/user-service/**   #当请求路径满足Path指定的规则时,才进行路由转发
          filters:   #过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改
            - StripPrefix=1           #转发之前去掉1层路径
        - id: login_route
          uri: lb://internetbar-provider-login
          order: 1
          predicates:
            - Path=/login-service/**
          filters:
            - StripPrefix=1

上面的实例对GateWay进行了简单的演示,接下来我们具体来看看GateWay的核心——过滤器


Filters(过滤器)

作用

在请求传递的过程中允许以某种方式对请求和响应的HTTP请求做一些处理修改(在请求真正到达具体的目标服务之前,判断请求体中是否携带token、token是否过期、用户是否有权限等等)
SpringCloud-GateWay,spring cloud,gateway,微服务

生命周期

Pre:前置过滤,在请求被转发到目标地址之前,通过过滤器进行身份验证等
Post:后置过滤,请求转发到具体的某个服务之后要执行的操作,将响应从微服务端发送给客户端等

过滤器的分类有哪些?

  • 局部过滤器(GatewayFilter)
  • 全局过滤器(GlobalFilter)

当项目中同时配置了多种过滤器,如何选择执行那个过滤器呢?

过滤器的执行顺序

思想:当请求到达GateWay后,会经过默认过滤器、路由过滤器、全局过滤器,它们三个被合并到了一个过滤器集合中,根据某种规则排序后依次执行:

  • 过滤器按照order值从小到大的顺序依次执行过滤,order值越小优先级越高
  • 当过滤器的order值一样是,会按照defaultFilter>路由过滤器>GlobalFilter的顺序执行

①、局部过滤器

在SpringCloud GateWay中内置了很多不同类型的网关路由过滤器,在官网中提供的有32中,当然spring非常贴心的考虑到自已自定义配置,所以开发人员也可以自定义局部过滤器
具体的内置局部过滤器我就不一一演示了,站在巨人肩膀上,官网提供了非常详细的教程,大家可以参考使用:SpringCloud GateWay官网说明
我们重点来说说自定义局部过滤器

我们依旧是通过实例演示内置局部过滤器的一个使用

场景:添加Log的过滤器配置

package com.internet.config;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Arrays;
import java.util.List;

@Component
public class LogGatewayFilterFactory
        extends AbstractGatewayFilterFactory<LogGatewayFilterFactory.Config> {
    //构造函数
    public LogGatewayFilterFactory() {
        super(LogGatewayFilterFactory.Config.class);
    }
    
    //读取配置文件中的参数 赋值到 配置类中
    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("consoleLog", "cacheLog");
    }
    
    //过滤器逻辑@Override
    public GatewayFilter apply(LogGatewayFilterFactory.Config config) {
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                if (config.isCacheLog()) {

                    System.out.println("cacheLog已经开启了	");
                }
                if (config.isConsoleLog()) {
                    System.out.println("consoleLog已经开启了	");
                }

            	//放行
                return chain.filter(exchange);
            }
        };
    }

    //配置类 接收配置参数
    @Data
    @NoArgsConstructor
    public static class Config {
        private boolean consoleLog;
        private boolean cacheLog;
    }
}

**在yml中添加日志是否开启控制**

SpringCloud-GateWay,spring cloud,gateway,微服务

②、全局过滤器(GlobalFilter)

作用:作用域所有路由,一般使用全局过滤器对权限 进行统一校验
在SpringCloud Gateway内部也提供了一系列的内置全局过滤器
SpringCloud-GateWay,spring cloud,gateway,微服务

如何自定义一个全局过滤器?

场景:登录的时候进行身份认证,认证通过后将token返回给客户端,之后的每次请求都在请求头携带token进行验证
SpringCloud-GateWay,spring cloud,gateway,微服务

实现流程

客户登录的请求服务端(后端)端服务
服务端对进行身份验证
验证通过后将信息加密成形成token
返回给客户端,token作为身份凭证
之后客户端每次请求都需要携带token(我这里的实现是将token放在了请求头中)
服务端验证是否携带token,对token进行解密之后验证token是否正确

代码演示
package com.internet.config;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class AuthGlobalFilter implements GlobalFilter , Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //获取请求体中的token
        String token = exchange.getRequest().getQueryParams().getFirst("token");
        //验证token是否为空
        if(StringUtils.isBlank(token)){
            System.out.println("鉴权失败");
            //UNAUTHORIZED(401, "Unauthorized")
            //拦截:返回401,没有权限提示
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            //设置这个请求响应标记为已完成(说明响应已经发送并且可以被客户端接收)
            return exchange.getResponse().setComplete();
        }

        //调用chain.filter继续向下游执行(放行)
        return chain.filter(exchange);
    }

    //顺序,数值越小,优先级越高
    @Override
    public int getOrder() {
        return 0;
    }
}
如何自定义前置全局过滤器? 我们可以理解为对请求到的内容进行逻辑处理就是前置过滤器 SpringCloud-GateWay,spring cloud,gateway,微服务
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //前置过滤器
        //获取请求体中的token
        String token = exchange.getRequest().getQueryParams().getFirst("token");
        //验证token是否为空
        if (StringUtils.isBlank(token)) {
            System.out.println("鉴权失败");
            //UNAUTHORIZED(401, "Unauthorized")
            //返回401,没有权限提示
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            //设置这个请求响应标记为已完成(说明响应已经发送并且可以被客户端接收)
            return exchange.getResponse().setComplete();
        }

        //调用chain.filter继续向下游执行(放行)
        return chain.filter(exchange);
    }

    //顺序,数值越小,优先级越高
    @Override
    public int getOrder() {
        return 0;
    }
}

如何自定义后置全局过滤器?
当请求验证通过的时候说明可以放行,这个时候我们可以在放行中增加对应的逻辑处理
SpringCloud-GateWay,spring cloud,gateway,微服务


@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //前置过滤器
        //获取请求体中的token
        String token = exchange.getRequest().getQueryParams().getFirst("token");
        //验证token是否为空
        if (StringUtils.isBlank(token)) {
            System.out.println("鉴权失败");
            //UNAUTHORIZED(401, "Unauthorized")
            //返回401,没有权限提示
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            //设置这个请求响应标记为已完成(说明响应已经发送并且可以被客户端接收)
            return exchange.getResponse().setComplete();
        }


        //后置过滤器
        //调用chain.filter继续向下游执行(放行)
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            System.out.println("这是后置过滤器");
        }));
    }

    //顺序,数值越小,优先级越高
    @Override
    public int getOrder() {
        return 0;
    }
}

我们可以看一下在我们项目中网关的一个应用位置:
SpringCloud-GateWay,spring cloud,gateway,微服务


三、总结

对于系统来说实现可复用是一直的追求,能重复的就抽象,减少服务和服务之间的耦合,实现可配置;暴露的内容越少安全稳定性越高,对于客户端来说只需要知道【网关IP://网关端口号:/服务接口/参数】接口,减少系统被恶意攻击的概率。文章来源地址https://www.toymoban.com/news/detail-709385.html

到了这里,关于SpringCloud-GateWay的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Matlab】智能优化算法_遗传算法GA

    遗传算法(Genetic Algorithm,简称GA)是一种基于生物进化理论的优化算法,由John Holland于20世纪70年代初提出。它通过模拟自然选择和遗传机制,利用群体中个体之间的遗传信息交流和变异来搜索问题的解空间。 遗传算法的设计灵感来源于达尔文的进化论。达尔文提出,自然界

    2024年02月16日
    浏览(57)
  • 遗传算法与Matlab GA工具箱

    GA是一种进化算法,基本原理效仿生物界“物竞天择,适者生存”的演化法则。 一些基本概念 种群population:问题潜在的解集 个体individual:每一个可能的解,通过基因编码一定数目的个体形成一个种群 适应度fitness:由此判断个体的优良,进而进行选择 选择selection、交叉cr

    2024年02月09日
    浏览(60)
  • 遗传算法(GA)入门知识梳理(超详细)

    目录 一、遗传算法的生物背景 二、遗传算法(GA)思想 2.1遗传算法的组成 2.2编码 2.3适应度函数 2.4遗传算子 2.4 运行参数 三、基本遗传算法(SGA)伪代码 3.1算法流程图 3.2 算法伪代码 四、遗传算法的优化、应用前景 4.2 遗传算法的优化 4.3 遗传算法的应用 五、遗传算法实例分析

    2024年02月06日
    浏览(42)
  • GA-BP遗传神经网络预测

    本人毕业设计是 基于遗传算法优化的城市公交系统车站客流量预测 在学习过程中 不断积累经验并优化改进模型 学习完后 认为遗传神经网络预测模型 可以在大多专业领域应用实现预测效果 通俗地总结分享一下 自己最满意的流程和方法供小白参考 有误请指正和讨论 (以下特

    2023年04月26日
    浏览(48)
  • 什么是遗传算法(Genetic Algorithm,简称 GA)?

    遗传算法(Genetic Algorithm,简称 GA)是一种基于自然选择和遗传学原理的优化搜索方法。它起源于 20 世纪 60 年代,由美国计算机科学家 John H. Holland 提出。遗传算法是通过模拟自然界生物进化过程中的达尔文自然选择和遗传遗传规律,对问题的解进行迭代更新,从而搜索最优

    2024年02月11日
    浏览(44)
  • Java 21 正式 GA,虚拟线程真的来了

    UTC 时间 2023 年 9 月 19 日,期盼已久的 Java 21 终于发布正式版! 本文一起来看看其中最受 Java 开发者关注的一项新特性:Loom 项目的两个新特性之一的 ”虚拟线程(Virtual Thread)“(另外一个新特性是 ”结构化并发(Structured Concurrency)“,当前是预览状态),它被称之为 J

    2024年02月08日
    浏览(59)
  • 51 最佳实践-安全最佳实践-qemu-ga

    51 最佳实践-安全最佳实践-qemu-ga 51.1 概述 qemu-ga(Qemu Guest Agent)它是运行在虚拟机内部的守护进程,它允许用户在host OS上通过QEMU提供带外通道实现对guest OS的多种管理操作:包括文件操作(open、read、write、close,seek、flush等)、内部关机、虚拟机休眠(suspend-disk、suspend-ram、

    2024年02月10日
    浏览(46)
  • 【算法】遗传算法GA寻优xgboost最优参数模型

    需求:实现遗传算法GA寻优xgboost最优参数模型搭建 遗传算法(Genetic Algorithm)是一种 通过模拟生物进化过程来解决优化问题的算法 。它模拟了自然界中的遗传、变异和选择等过程,并通过不断迭代寻找最优解。 并行性强 遗传算法可以应用并行计算技术,同时对多个个体进行

    2024年02月12日
    浏览(39)
  • 遗传算法GA解决混合流水车间调度问题HFSP

    混合流水车间调度问题(HFSP)是传统流水车间调度问题(FSP)的拓展,本文针对HFSP问题进行描述、建模和求解。 通常模型做如下假设: HFSP符号描述: 决策变量: 主要约束: 优化目标: 本节使用带精英保留的遗传算法GA对HFSP问题进行求解。求解结果如下: 自定义算例如下:

    2024年02月11日
    浏览(50)
  • AS-V1000产品介绍:支持GA/T1400视图库标准(可通过GA/T1400接入海康、华为、大华等图传前端设备,实现图传功能)

    目                 录 一、概述 二、AS-V1000视频监控管理平台的特点 二、视频监控平台通过GA/T1400接入前端设备 (一)接入华为GA/T1400前端设备 (二)接入大华GA/T1400前端设备 (三)接入海康威视GA/T1400前端设备 三、接入GA/T1400后的效果 1、白名单设置 2、告警描述 3、实时

    2024年02月19日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包