为什么微服务一定要有网关呢
一、什么是服务网关
二、为什么需要服务网关
上述所说的横切功能(以权限校验为例)可以写在三个位置:
-
每个服务自己实现一遍 写到一个公共的服务中,然后其他所有服务都依赖这个服务 写到服务网关的前置过滤器中,所有请求过来进行权限校验
第一种,缺点太明显,基本不用;第二种,相较于第一点好很多,代码开发不会冗余,但是有两个缺点:
-
由于每个服务引入了这个公共服务,那么相当于在每个服务中都引入了相同的权限校验的代码,使得每个服务的jar包大小无故增加了一些,尤其是对于使用docker镜像进行部署的场景,jar越小越好; 由于每个服务都引入了这个公共服务,那么我们后续升级这个服务可能就比较困难,而且公共服务的功能越多,升级就越难,而且假设我们改变了公共服务中的权限校验的方式,想让所有的服务都去使用新的权限校验方式,我们就需要将之前所有的服务都重新引包,编译部署。
而服务网关恰好可以解决这样的问题:
-
如果想修改权限校验的逻辑,只需要修改网关中的权限校验过滤器即可,而不需要升级所有已存在的微服务。
所以,需要服务网关!!!
三、服务网关技术选型
引入服务网关后的微服务架构如上,总体包含三部分:服务网关、open-service和service。
1、总体流程
-
服务网关、open-service和service启动时注册到注册中心上去; open-service聚合内部service响应,返回给网关,网关再返回给用户
2、引入网关的注意点
-
网关要尽量轻。
3、服务网关基本功能
-
智能路由:接收 外部 权限校验:只校验用户向open-service服务的请求,不校验服务内部的请求。服务内部的请求有必要校验吗? API监控:只监控经过网关的请求,以及网关本身的一些性能指标(例如,gc等); 限流:与监控配合,进行限流操作; API日志统一收集:类似于一个aspect切面,记录接口的进入和出去时的相关日志 。。。后续补充
上述功能是网关的基本功能,网关还可以实现以下功能:
-
A|B测试:A|B测试时一块比较大的东西,包含后台实验配置、数据埋点(看转化率)以及分流引擎,在服务网关中,可以实现分流引擎,但是实际上分流引擎会调用内部服务,所以如果是按照上图的架构,分流引擎最好做在open-service中,不要做在服务网关中。 。。。后续补充
4、技术选型
笔者准备自建一个轻量级的服务网关,技术选型如下:
-
开发语言:java + groovy,groovy的好处是网关服务不需要重启就可以动态的添加filter来实现一些功能; 微服务基础框架:springboot; 网关基础组件:netflix zuul; 服务注册中心:consul; 权限校验:jwt; API监控:prometheus + grafana; API统一日志收集:logback + ELK; 压力测试:Jmeter; 。。。后续补充
在后续的介绍中,会逐渐介绍各个知识点,并完成一个轻量级的服务网关!!!