首页 > 其他分享 >SpringCloud之Gateway

SpringCloud之Gateway

时间:2023-09-25 19:33:11浏览次数:40  
标签:网关 服务 SpringCloud token 模块 Gateway 路由

1. 什么是Gateway

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

优点:

l 性能强劲:是第一代网关Zuul的1.6倍

l 功能强大:内置了很多实用的功能,例如转发、监控、限流等

l 设计优雅,容易扩展

缺点:

l 其实现依赖Netty与WebFlux,不是传统的Servlet编程模型,学习成本高

l 不能将其部署在Tomcat、Jetty等Servlet容器里,只能打成jar包执行

l 需要Spring Boot 2.0及以上的版本,才支持

 

2. Gateway--服务网关

大家都都知道在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。

 

这样的架构,会存在着诸多的问题:

l 客户端多次请求不同的微服务,增加客户端代码或配置编写的复杂性

l 认证复杂,每个服务都需要独立认证。

l 存在跨域请求,在一定场景下处理相对复杂。

上面的这些问题可以借助API网关来解决。

所谓的API网关,就是指系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服 务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、路由转发等等。 添加上API网关之后,系统的架构图变成了如下所示:

 

 3. 使用Gateway

 单独创建GatewayMaven工程

【注:Gateway本质来说也是一个子服务模块】

【注:Gateway是和xw-serve、xw-comm服务模块同级】

在其pom文件加入依赖:

<!--加入gateway的依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

【注:还有在工程中创建启动类】

 

 3.1 进行Gateway配置

创建application.yml配置文件在其中配置子服务模块信息:

【注:可以是yml后缀的配置文件,因为用properties后缀的配置文件比较麻烦】

 

3.1.1 复杂配置设置:

server:
  port: 8851
spring:
  application:
    name: gateway    #服务名称
  # 配置子服务模块api
  #【注:可以配置多个子服务模块】
  cloud:
    gateway:
      routes:
        - id: order   # 路由的唯一标识,只要不重复都可以,如果不写默认会通过UUID产生,一般写成被路由的服务名称
          uri: http://localhost:8082/  # 被路由的地址(去向子服务模块的地址+端口)
          order: 1                     #表示优先级  数字越小优先级越高
          predicates:                  #断言: 执行路由的判断条件
            - Path=/product_serv/**
          filters:                     # 过滤器: 可以在请求前或请求后作一些手脚
            - StripPrefix=1

 

3.1.2 简单配置设置及Gateway前后端跨域:

server:
  port: 8851
spring:
  application:
    name: gateway
  # 配置api
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOriginPatterns: "*"
            allowedHeaders: "*"
            allowedMethods: "*"
            allowCredentials: true
#        default-filters:
#          - DedupeResponseHeader=Vary Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST
      discovery:
        locator:
          enabled: true

 【注:使用Gateway本身不能跟web依赖共存】

【注:使用Gateway只需要其本身配置跨域信息即可,子服务模块不需要配置跨域信息】

【注:一切都以通过Gateway去访问子服务模块】

 访问路径:ip地址:Gateway端口号/子服务模块微服务微服务名称/要访问的子服务路径

 3.1 自定义Gateway全局拦截器

创建com.aaa包下config包下AuthGlobalFilter 配置类:

com -> aaa -> congif -> AuthGlobalFilter

@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //获取请求头中的token值
        ServerHttpRequest request = exchange.getRequest();
        String token = request.getHeaders().getFirst("token");
        //判断token是否为空
        if (StringUtils.isEmpty(token)){
                exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
                return exchange.getResponse().setComplete();
        }else {
            //不为空则校验token,校验通过将token存入Redis中
            try {
                Claims claims = JwtUtils.parseJWT(token);
                return chain.filter(exchange);
            }catch (Exception e){
                e.printStackTrace();
                throw new RuntimeException("token非法");
            }
        }
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

【注:此配置文件作为Gateway检测前端每次发起请求是否携带token】

【注:此配置文件后期可根据业务需求进行更改拦截条件】

 

 4. 将heads注入容器获取token

注:【假如有需求需要使用到用户id或用户信息从token中解析取值】

该如何?

通过注入HTTPServletRequest 来获取request 对象:

@Resource
private HttpServletRequest request;
String token = request.getHeader("token");//从请求头中获取token
Claims claims = JwtUtils.parseJWT(token);//解析token
    // 将这个map转化为对象
    List token1 = (List) claims.get("token");
    Map o = (Map) token1.get(0);
    user user = BeanUtil.fillBeanWithMap(o, new user(), false);//将集合转换对象
    int id = user.getId();//获取到了用户id

 

   


 

以上便是SpringCloud之Gateway中的内容,如有漏缺请在下方留言告知,我会及时补充

标签:网关,服务,SpringCloud,token,模块,Gateway,路由
From: https://www.cnblogs.com/9--1/p/17727890.html

相关文章

  • springBoot结合springcloud alibaba
    版本对应很重要,很多问题都源于版本没有对应Q1:SpringCloud启动报错Didyouforgettoincludespring-cloud-starter-loadbalancerQ2:Nacos集群出现NacosException:Clientnotconnected,currentstatus:STARTINGQ3:配置中心不生效Q4:Errorcreatingbeanwithname‘configDataConte......
  • SpringCloud微服务学习笔记(一)
    微服务介绍用于开发大型项目时,将所有代码都放在一个项目中会增加压力,而且单体架构的并发数也有限,占用的线程多的时候就不行了。这时就需要用到微服务分布式开发。单体架构(monolithicstructure):顾名思义,整个项目中所有功能模块都在一个工程中开发;项目部署时需要对所有模块一起编......
  • 负载均衡 —— SpringCloud Netflix Ribbon
    Ribbon简介Ribbon是Netfix客户端的负载均衡器,可对HTTP和TCP客户端的行为进行控制。为Ribbon配置服务提供者地址后,Ribbon就可以基于某种负载均衡算法自动帮助服务消费者去请求。Ribbon默认提供了很多负载均衡算法,例如轮询、随机等,也可以为Ribbon实现自定义的负载均......
  • SpringCloud-Config配置中心搭建保姆级教程
    一、分布式配置中⼼在使⽤微服务架构开发的项⽬中,每个服务都有⾃⼰的配置⽂件(application.yml),如果将每个服务的配置⽂件直接写在对应的服务中,存在以下问题:1.服务开发完成之后,需要打包部署,配置⽂件也会打包在jar⽂件中,不便于项⽬部署之后的配置修改(在源码中修改——重新打包—......
  • SpringCloud --> 什么是微服务?
    微服务我们可以理解为是一种架构设计风格,就是将一个项目拆分成一个或者多个服务,每个服务都可以单独的运行,而且每个服务都会占用线程。从字面意思上我们可以理解为"微小的服务",我们从微小、服务来理解微小:强调的是单一项目的体积小,一个微服务通常只提供单个业务的功能,一个......
  • SpringCloud-ZipKin搭建保姆级教程
    服务链路追踪一、服务追踪说明微服务架构是通过业务来划分服务的,使⽤REST调⽤。对外暴露的⼀个接⼝,可能需要很多个服务协同才能完成这个接⼝功能,如果链路上任何⼀个服务出现问题或者⽹络超时,都会形成导致接⼝调⽤失败。随着业务的不断扩张,服务之间互相调⽤会越来越复杂,......
  • springCloud
     一、Eureka服务注册与发现 eureka是ap原则,注重服务的可用性(不会挂,只是数据可能会不一致)zookeeper是cp原则,注重数据的一致性(当一个接点挂了,在几分钟内就不能访问了) 一、创建eureka的server服务端1、创建eureka注意pom.xml文件中的spring-boot的版本要与spring-cl......
  • SpringCloudAlibaba整合Seata
    Seata(全称为SimpleExtensibleAutonomousTransactionArchitecture)是一个开源的分布式事务解决方案,用于解决分布式系统中的事务一致性问题。在分布式系统中,由于各个服务可能分布在不同的服务器上,涉及的数据库也可能不同,因此需要一种机制来保证分布式事务的原子性、一致性、隔离......
  • SpringCloudAlibaba整合Gateway
    在微服务架构中,加入网关(Gateway)是一种常见的模式,其作用是为了更好地管理和控制微服务的访问和通信。网关可以看作是微服务架构的入口,它位于客户端和内部微服务之间,充当了一个中间层的角色。以下是加入网关的作用:统一访问点:通过网关,客户端只需要与一个统一的访问点进行通信,而不用直......
  • SpringCloudAlibaba整合SkyWalking
    SkyWalking是一个开源的分布式系统性能监测和追踪解决方案。它主要用于监控和追踪分布式系统中的服务和应用,以便帮助开发人员和运维团队定位和解决性能问题和故障。以下是SkyWalking的主要作用:分布式追踪:SkyWalking可以跟踪分布式系统中各个组件之间的调用链,从而实现对整个系统的......