服务网关应用场景
一般微服务架构如下图
后端服务比较健全,但是当涉及到前后端交互时,存在如下问题:
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内置的全局过滤器如下:
内置的过滤器可以完成绝大多数功能,但是对于企业开发的一些业务功能处理,还能需要我们自己编写过滤器来实现的,那么我们一起通过代码的形式自定义一个过滤器,去完成统一的权限校验。
自定义全局过滤器,开发鉴权逻辑:
- 当客户端第一次请求服务时,服务端对用户进行信息认证(登录)。
- 认证通过,将用户信息进行加密形成token,返回给客户端,作为登录凭证。
- 以后每次请求,客户端都携带认证的token
- 服务端对token进行解密,判断是否有效
网关限流
sentinel提供了gateway的适配模块,可以提供两种资源维度的限流。
route维度:即在spring配置文件中配置的路由条目,资源名为对应routeId。
自定义API维度:用户可以利用提供的API来自定义一些API分组。