Spring Cloud Alibaba(一):服务网关 Spring Cloud GateWay 入门

首先,引入一个场景:
在微服务架构中,每个服务都是一个可以独立开发和运行的组件,而一个完整的微服务架构由一系列独立运行的微服务组成。其中每个服务都只会完成特定领域的功能,比如订单服务提供与订单业务场景有关的功能、商品服务提供商品展示功能等。各个微服务之间通过轻量级通信机制 REST API 或者 RPC 完成通信。 微服务之后在某些层面会带来一定的影响,比如,一个用户查看一个商品的详情,对于客户端来说,可能需要调用商品服务、评论服务、库存服务、营销服务等多个服务来完成数据的渲染
在这个场景中,客户端虽然能通过调用多个服务实现数据的获取,但是会存在一 些问题,比如:
1.客户端需要发起多次请求,增加了网络通信的成本及客户端处理的复杂性。
2.服务的鉴权会分布在每个微服务中处理,客户端对于每个服务的调用都需要重复鉴权。
3.在后端的微服务架构中,可能不同的服务采用的协议不同,比如有 HTTP、RPC 等。客户端如果需要调用多个服务,需要对不同协议进行适配。
在这里插入图片描述
网关旨在为微服务架构提供一种简单而有效的统一的API路由管理方式
网关就是系统的入口,封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、缓存、负载均衡、流量管控、路由转发等。
  今天就来学习下网关之一的Spring Cloud GateWay。
  Spring Cloud GateWay是什么?
  GateWay是Spring生态系统上构建的API网关服务,基于Spring5,SpringBoot2和Project Reactor等技术。旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤功能,例如:限流、熔断、重试等。SpringCloud GateWay是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
 请求流程如下图所示:
 在这里插入图片描述

在微服务中的位置如图:
在这里插入图片描述
网关的作用:
1.性能:API高可用,负载均衡,容错机制。
2.安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制)。
3.日志:日志记录(spainid,traceid)一旦涉及分布式,全链路跟踪必不可少。
4.缓存:数据缓存。
5.监控:记录请求响应数据,api耗时分析,性能监控。
6.限流:流量控制,错峰流控,可以定义多种限流规则。
7.灰度:线上灰度部署,可以减小风险。
8.路由:动态路由规则。

Spring Cloud GateWay的核心概念
1.Route 路由,它是网关的基础元素,包含ID、目标URI、断言、过滤器组成,当前请求到达网关时,会通过Gateway Handler Mapping,基于断言进行路由匹配,当断言为true时,匹配到路由进行转发
2.Predicate,断言,学过java8的同学应该知道这个函数,它可以允许开发人员去匹配HTTP请求中的元素,一旦匹配为true,则表示匹配到合适的路由进行转发
3.Filter,过滤器,可以在请求发出的前后进行一些业务上的处理,比如授权、埋点、限流等。

代码部分:
1.引入gateway的依赖

  <!--引入gateway 网关-->

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

        <!-- eureka-client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

配置文件配置:

  cloud:
    # 网关配置
    gateway:
      # 路由配置:转发规则
      routes: #集合。
      # id: 唯一标识。默认是一个UUID
      # uri: 转发路径
      # predicates: 条件,用于请求网关路径的匹配规则
      # filters:配置局部过滤器的

      - id: gateway-provider
        # 静态路由
        # uri: http://localhost:8001/
        # 动态路由
        uri: lb://GATEWAY-PROVIDER
        predicates:
        - Path=/goods/**
        filters:
        - AddRequestParameter=username,zhangsan

      - id: gateway-consumer
        # uri: http://localhost:9000
        uri: lb://GATEWAY-CONSUMER
        predicates:
        - Path=/order/**
        # 微服务名称配置
      discovery:
        locator:
          enabled: true # 设置为true 请求路径前可以添加微服务名称
          lower-case-service-id: true # 允许为小写

测试后,可以通过不暴露各服务的端口信息,只需要通过gateway就可以访问其他服务。

Spring Cloud Gateway 的 Filter 分为两种:
GatewayFilter 与 GlobalFilter。
GlobalFilter 会应用到所有的路由上
GatewayFilter 将应用到单个路由或者一个分组的路由上。
全局过滤主要实现 GlobalFilter,Ordered这两个接口(全局日志记录、统一网关鉴权);
局部过滤主要通过配置文件进行配置过滤某个单一的.

おすすめ

転載: blog.csdn.net/qq_35529931/article/details/119513156