• 服务网关之SpringCloudGateway


    服务网关应用场景

    一般微服务架构如下图

    后端服务比较健全,但是当涉及到前后端交互时,存在如下问题:

    1,客户端需要维护服务端的各个地址,代码困难

    2,认证、鉴权复杂

    3,跨域问题严重

    为了解决以上问题,微服务架构的五大关键技术之一服务网关就登场了。

    服务网关

      所谓服务网关(API网关),就是指系统的统一入口,它封装了应用程序的内部结构,为客户提供统一服务,一些与业务本身无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、路由转发等等。常见的服务网关有Nginx+lua、Kong、Zuul、SpringCloudGateway。

     SpringCloudGateway

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

    优点:

      性能强劲,是第一代网关Zuul的1.6倍。

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

      设计优雅,容易扩展。

    缺点:

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

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

      需要SpringBoot2.0及以上的版本。

    Gateway路由

      路由(Route)是Gateway中最基本的组件之一,表示一个具体的路由信息载体。主要定义了下面几个信息:

      id:路由标识符,区别于其他Route。

      uri:路由指向的目的地uri,即客户端请求最终被转发到的微服务。

      order:用于多个Route之间的排序,数值越小排序越靠前,匹配优先级越高。

      predicate:断言的作用是进行条件判断,只有判断都发返回真,才会真正的执行路由。

      filter:用于修改请求和响应信息。

    Gateway断言

      Predicate(断言、谓词)用于进行条件判断,只有断言都返回真,才会真正执行路由。即在什么条件下,才能进行路由转发。

      Gateway中有许多内置断言工厂,这些断言都与http请求的不同属性匹配,比较常见的有:基于Datetime类型的断言工厂、基于远程地址的、基于Header的、基于Host的、基于Path的......

    Gateway过滤器

      过滤器(filter)就是在请求的传递过程中,对请求和响应做一些处理。生命周期为pre和post。

      pre:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。

      post:这种过滤器在路由到微服务以后运行,这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。

      在Gateway中内置了很多不同种类的网关路由过滤器,常见的有:addRequestHeader、addRequestParameter、addResponseHeader、addResponseParameter、Hystrix、PrefixPath......

      全局过滤器作用于所有路由,无需配置,通过全局过滤器可以实现对权限的统一鉴权、安全验证等功能。Gateway内置的全局过滤器如下:

       内置的过滤器可以完成绝大多数功能,但是对于企业开发的一些业务功能处理,还能需要我们自己编写过滤器来实现的,那么我们一起通过代码的形式自定义一个过滤器,去完成统一的权限校验。

    自定义全局过滤器,开发鉴权逻辑:

    1. 当客户端第一次请求服务时,服务端对用户进行信息认证(登录)。
    2. 认证通过,将用户信息进行加密形成token,返回给客户端,作为登录凭证。
    3. 以后每次请求,客户端都携带认证的token
    4. 服务端对token进行解密,判断是否有效

     网关限流

      sentinel提供了gateway的适配模块,可以提供两种资源维度的限流。

      route维度:即在spring配置文件中配置的路由条目,资源名为对应routeId。

      自定义API维度:用户可以利用提供的API来自定义一些API分组。

  • 相关阅读:
    学习进度条2
    构建之法阅读笔记04
    团队项目——班级派发布视频
    四则运算3
    软件工程结对作业02四则运算四
    构建之法阅读笔记01
    构建之法阅读笔记02
    学习进度条4
    学习进度条1
    返回一个二维整数数组中最大联通子数组的和
  • 原文地址:https://www.cnblogs.com/guanghe/p/13937262.html
Copyright © 2020-2023  润新知