初识Spring Cloud系列——Gateway原理

1,873 阅读4分钟

这是我参与更文挑战的第21天,活动详情查看: 更文挑战

续接上文的初识Spring Cloud系列——Hystrix原理, 我们今天来说说与与Hystrix有关联的Spring Cloud Gateway

开始之前,我们先来了解什么是网关?

参考网站

前提

假设你的名字叫小不点,你住在一个大院子里,你的邻居有很多小伙伴,父母是你的网关。

父母不在家时

当你想跟院子里的某个小伙伴玩,只要你在院子里大喊一声他的名字,他听到了就会回应你,并且跑出来跟你玩。

父母在家时

你不能够随便走出大门,你想与外界发生的一切联系,都必须由父母(网关)用电话帮助你联系。

假如你想找你的同学小明聊天,但是你不知道小明家的电话号码,不过你的班主任老师有一份你们班全体同学的名单和电话号码对照表,你的老师就是你的DNS服务器。

于是你在家里和父母有了下面的对话:

  • 小不点:妈妈(或爸爸),我想找班主任查一下小明的电话号码行吗?
  • 家长:好,你等着。(接着你家长给你的班主任拨了一个电话,问清楚了小明的电话)问到了,他家的号码是211.99.99.99
  • 小不点:太好了!妈(或爸),我想找小明,你再帮我联系一下小明吧。
  • 家长:没问题。(接着家长向电话局发出了请求接通小明家电话的请求,最后一关当然是被转接到了小明家家长那里,然后他家长把电话给转到小明).

就这样你和小明取得了联系。

产生网关的原因?

  • 客户端会多次请求不同的微服务,增加了客户端的复杂性。 比如小不点有很多同学,但是如果要小不点记住所有同学的联系方式,那太难了。

  • 存在跨域请求,在一定场景下处理相对复杂。

  • 认证复杂,每个服务都需要独立认证。 外面的院子很危险,小不点要联系其它院子的小伙伴,需要由父母跟班主任确定一下小不点的同学身份,不然万一小不点变成大灰狼呢!

  • 难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。

  • 某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。

什么是SpringCloud Gateway?

SpringCloud Gateway提供了一个构建在 Spring 生态系统之上的 API 网关,包括:Spring 5、Spring Boot 2 和 Project Reactor。Spring Cloud Gateway 旨在提供一种简单而有效的方式来路由到 API 并为它们提供交叉关注点,例如:安全性、监控/指标和弹性。

为什么选择SpringCloud Gateway?

  • 在SpringCloud Finchley正式版之前,Spring Cloud推荐的网关是Netflix提供的Zuul,而gateway是原zuul1.x版的替代
  • SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty
  • Spring Cloud Gateway还支持WebSocket,并且与Spring紧密集成拥有更好的开发体验

SpringCloud Gateway的特性?

  • 基于Spring Framework 5,Project Reactor和Spring Boot 2.0进行构建;
  • 动态路由:能够匹配任何请求属性;
  • 可以对路由指定Predicate (断言)和Filter(过滤器);
  • 集成Hystrix的断路器功能;
  • 集成Spring Cloud 服务发现功能;
  • 易于编写的Predicate (断言)和Filter (过滤器);
  • 请求限流功能;
  • 支持路径重写。

SpringCloud Gateway的核心?

Route(路由)

路由时构建网关的基础模块,由ID、目标URL以及一系列过滤器组成,然后根据断言的判断条件来转发

Predicate(断言)

路由转发的判断条件,目前SpringCloud Gateway支持多种方式,常见如:Path、Query、Method、Header等。

Filter(过滤)

指的是Spring框架中GatewayFilyter的实例,使用过滤器,可以在请求被路由前或者之后进行修改

承接上文Hystrix的地方就在于过滤器这里了,Spring Cloud Gateway的Filter中加入了Hystrix,让网关具备了熔断功能 image.png

执行过程

  1. 客户端向 Spring Cloud Gateway 发出请求。
  2. 如果网关处理程序映射确定请求与路由匹配,则将其发送到网关 Web 处理程序。此处理程序通过特定于请求的过滤器链运行请求。
  3. 过滤器被虚线分隔的原因是过滤器可以在发送代理请求之前和之后运行逻辑。
  4. 执行所有“预”过滤器逻辑。然后进行代理请求。
  5. 发出代理请求后,将运行“post”过滤器逻辑。 image.png

今日小结

今日主要讲了网关的由来、选用Gateway作为微服务网关的原因还有Gateway包含的特性以及执行过程!