学习笔记—微服务—技术栈实践(2)—网关
什么是网关
网关是一项围绕微服务的重要技术。当微服务多了,端口这些东西自然也就多了,那么也就是说,微服务的入口就多了,这样是相当难以管理的,因此,API网关的出现从某种方面来讲,就是为了解决这个问题。
API网关内部封装了系统内部架构,为每个客户端提供了一个定制的API,由此实现成为一个微服务系统的唯一入口。
换言之,通过网关,所有的客户端和消费端都需要通过统一的网关来接入微服务系统,在网关层来处理所有非业务相关的东西。比如身份验证、监控、负载均衡、缓存、限流熔断、协议转换等等。
对于网关来说,要统筹后端服务,要分为数据平面和控制平面。数据平面主要是为了统一对外暴露后端服务的API等,而控制平面则是对后端服务做一个统一的管控和配置。
对于网关来说,最核心的功能就是路由功能。通过路由功能将微服务网关的请求转发到目标微服务,在实际上的微服务架构中,网关可以结合着注册中心的动态服务发现技术来发现后端服务,也可以借助配置中心的动态配置来变更动态路由。比如网关是localhost:38888,A服务的端口是3001,B服务端口是3002,对于使用来说,要使用A、B两个服务,便需要通过调用localhost:3001和3002来实现,这样显示是复杂的,尤其是服务多了之后,但是当在网关配置好路由后,便可以通过localhost:38888/A访问A服务,通过localhost:38888/B访问B服务,这样就会方便许多。
第二,对于网关来说,同样重要的还有负载均衡的功能,通过服务发现工具,通过如loadBalancer、轮询、IP地址哈希机制等方式来实现对于下游微服务的负载均衡。
此外,网关还可以和权限模块,与Redis、OAuth2等技术相结合,实现对于微服务系统的整体统一鉴权,API网关是统一管理安全性的绝佳场所,可以将认证的部分抽取此处,使得后续的服务,只需要关注业务逻辑而无需关注认证等安全逻辑。
网关还有一个作用,就是限流熔断,由于网关是统一的入口,对于一些由客户端访问次数和频率限制的服务来说,一些高并发请求下是要有限流需求的,网关要可以进行主动的熔断,来保护后端服务,确保前端用户的体验能够合理。
此外,网关还可以对请求进行一些过滤,来实现一个黑白名单的功能,作为一种终端管理的选择。
其他功能还有许多,于此不再一一叙述。可以说,网关对于微服务来说,是非常重要的一个组成部分。
常见的网关
常见的网关有许多。
首先,Nginx作为一个反向代理服务器,自然是可以作为一种网关来使用的。于此不再赘述。
其次,对于Spring Cloud和Spring Cloud Alibaba这一套架构来说,Spring Cloud Gateway是一种相当重要的网关。后文进行详细阐述与实践。
在此以外,还有比如Zuul等网关,性能各异、功能也各异,于此不再过多赘述。
Spring Cloud Gateway
Spring Cloud Gateway 是由WebFlux + Netty + Reactor所实现的一种响应式的 API 网关。
就其在Spring Cloud的定位来说,是为了取代如Netflix Zuul这样的老网关作为一个新一代的网关来使用的。
比起上一代的网关,Spring Cloud Gateway的功能更强大、性能更强大、可拓展的点也更多。
于后文介绍一个Gateway最基本的使用。并在这个基础上,对于动态路由、动态服务容错、IP黑白名单机制、鉴权等方面做一个详细的实践及阐述。
基本使用
一个简单的Spring Gateway网关很好搭建,创建一个gateway-service模块。映入Spring-cloud Gateway依赖。
1 |
|
并添加合适的配置,配置网关的路由规则,包括路由路径、目标信息服务等等。比如如下一个配置
1 |
|
在该配置中,id是路由id,唯一的,uri是路由的目标地址,在没有加入注册中心之前,可以直接通过http这种路径路由,predicate是一个路由断言,判断请求是否符合路由规则,其下的path是要求请求路径以该path开头。
配置完成后,启动项目,访问网关的路径,即可访问到目标服务。例如,在此,访问localhost:8080/auth/check_token的这个路径,便会被网关路由到19088的服务上并调用路径为/check_token的功能。
至此,一个简单的Spring Cloud Gateway网关就搭建完成了。
对于网关更复杂的使用,后续再进行详述。
值得一提的是,断言predicate是用于定义请求匹配的条件,是很重要的,种类很多,Path只是一种,就是更具请求的路径来进行匹配。
1 |
|
匹配路径为/auth/**的请求。
Method是根据请求的HTTP方法进行匹配,比如:
1 |
|
匹配所有GET请求。
Header是根据请求头进行匹配,比如:
1 |
|
匹配所有请求头中包含X-Request-Id并且值为数字的请求。
Query是根据请求参数进行匹配,比如:
1 |
|
匹配所有请求参数中包含key并且值为value的请求。
还有包括cookie的匹配等等,根据实际情况具体使用。此外,还可以通过AND将多个断言组合成一个逻辑条件来实现更为复杂的匹配,比如:
1 |
|
这个能同时匹配路径是/auth/**,同时是GET请求的请求。
除了路由以外,网关的另一大关键内容过滤器放置于后续权限一节陈述。
总结
对于微服务来说,网关几乎是不可或缺,必不可少的,通过网关,能够实现微服务业务与技术逻辑相解耦的一个重中之重。
如果用较为简洁的语言来阐述网关,几乎就等同于路由转发+过滤器。路由转发就是其数据平面的工作而过滤器便是其控制平面的工作。
由此,重要性,不言而喻。