API网关服务:SpringCloud Zuul

背景

当客户端单击某个功能的时候往往会发出一些对微服务获取资源的请求到后端,请求被转发到各个不同的服务实例。运维人员需要去手工维护这些路由规则与服务实例列表,当有实例增减或有IP地址发生变动的时候,也需要手工的去同步修改这些信息,当系统规模不断增大,这些维护的任务会变得越来越难。
此外,为了服务的安全性,往往都会有一定的权限校验机制,我们在很多服务中都实现了一套校验逻辑,随着规模的扩大,冗余变得越来越多。当我们要修改一个bug时就不得不去每个应用中修改一次。

如何解决

为了解决这些问题,SpringCloud提供了SpringCloud Zuul。首先对于路由规则与服务实例的维护问题,zuul与eureka进行整合,将自身注册为eureka服务治理下的应用,同时从eureka中获取其他服务的实例信息。对于路由规则的维护,zuul默认会以服务名作为ContextPath的方式来创建路由映射,这样的默认设置可以满足我们大部分的路由需求
其次,对于权限校验这样的冗余问题,在API网关服务上来对微服务接口做前置过滤。开发者通过使用zuul来创建过滤器,指定哪些规则的请求需要执行校验逻辑,只有通过校验才会路由到具体的服务。

编写zuul微服务网关

  • 在maven中添加zuul依赖
  • 在启动类添加注解@EnableZuulProxy,声明一个zuul代理,该代理用ribbon来定位eureka中的服务并实现负载均衡
  • 在properties.yml中编写配置文件

路由配置

默认zuul会代理所有注册到eureka上的微服务,若只想代理部分服务,就需要对URL进行精确的控制

  • 例如,我们想当访问/user/**时会转发到微服务flim-user,代码如下:
  • 忽略指定服务,使用zuul.ignored-services:
  • 忽略所有服务,只路由指定服务:
    API网关服务:SpringCloud Zuul_第1张图片

zuul过滤器

zuul大部分功能都是通过过滤器来实现的,zuul中定义了4种类型的过滤器

  • PRE:在请求被路由之前调用,在集群中选择请求的微服务
  • ROUTING:请求路由到微服务时执行,用于构建发给微服务的请求
  • POST:在路由到微服务后执行,将响应从微服务发送到客户端等
  • ERROR:在其他阶段发生错误时执行该过滤器

zuul高可用

  • 将多个zuul客户端注册到eureka上,就可以实现zuul高可用
  • 部署多个zuul,zuul客户端会自动从eureka中查询zuul server列表,并用ribbon负载均衡的请求zuul集群
  • 如果zuul客户端并未注册到eureka上,可借助Nginx实现负载均衡

zuul限流(令牌桶算法)

API网关服务:SpringCloud Zuul_第2张图片
令牌桶算法
  • 时机:请求被转发之前调用
原理

以固定速率往桶中添加令牌,请求过来之后会从桶中获取令牌,拿到令牌之后请求才可以继续往下走;如果获取不到令牌请求就会被拒绝,从而达到限流的目的

你可能感兴趣的:(API网关服务:SpringCloud Zuul)