服务网关之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分组。

原文地址:https://www.cnblogs.com/guanghe/p/13937262.html