1、什么是服务网关java
服务网关 = 路由转发 + 过滤器
一、路由转发:接收一切外界请求,转发到后端的微服务上去;nginx
二、过滤器:在服务网关中能够完成一系列的横切功能,例如权限校验、限流以及监控等,这些均可以经过过滤器完成(其实路由转发也是经过过滤器实现的)。spring
2、为何须要服务网关
上述所说的横切功能(以权限校验为例)能够写在三个位置:docker
- 每一个服务本身实现一遍
- 写到一个公共的服务中,而后其余全部服务都依赖这个服务
- 写到服务网关的前置过滤器中,全部请求过来进行权限校验
第一种,缺点太明显,基本不用;
第二种,相较于第一点好不少,代码开发不会冗余,可是有两个缺点:后端
- 因为每一个服务引入了这个公共服务,那么至关于在每一个服务中都引入了相同的权限校验的代码,使得每一个服务的jar包大小无端增长了一些,尤为是对于使用docker镜像进行部署的场景,jar越小越好;
- 因为每一个服务都引入了这个公共服务,那么咱们后续升级这个服务可能就比较困难,并且公共服务的功能越多,升级就越难,并且假设咱们改变了公共服务中的权限校验的方式,想让全部的服务都去使用新的权限校验方式,咱们就须要将以前全部的服务都从新引包,编译部署。
而服务网关刚好能够解决这样的问题:springboot
- 将权限校验的逻辑写在网关的过滤器中,后端服务不须要关注权限校验的代码,因此服务的jar包中也不会引入权限校验的逻辑,不会增长jar包大小;
- 若是想修改权限校验的逻辑,只须要修改网关中的权限校验过滤器便可,而不须要升级全部已存在的微服务。
因此,须要服务网关!!!服务器
3、服务网关技术选型网络

引入服务网关后的微服务架构如上,整体包含三部分:服务网关、open-service和service。架构
一、整体流程:负载均衡
- 服务网关、open-service和service启动时注册到注册中心上去;
- 用户请求时直接请求网关,网关作智能路由转发(包括服务发现,负载均衡)到open-service,这其中包含权限校验、监控、限流等操做
- open-service聚合内部service响应,返回给网关,网关再返回给用户
二、引入网关的注意点
- 增长了网关,多了一层转发(本来用户请求直接访问open-service便可),性能会降低一些(可是降低不大,一般,网关机器性能会很好,并且网关与open-service的访问一般是内网访问,速度很快);
- 网关的单点问题:在整个网络调用过程当中,必定会有一个单点,多是网关、nginx、dns服务器等。防止网关单点,能够在网关层前边再挂一台nginx,nginx的性能极高,基本不会挂,这样以后,网关服务就能够不断的添加机器。可是这样一个请求就转发了两次,因此最好的方式是网关单点服务部署在一台牛逼的机器上(经过压测来估算机器的配置),并且nginx与zuul的性能比较,根据国外的一个哥们儿作的实验来看,其实相差不大,zuul是netflix开源的一个用来作网关的开源框架;
- 网关要尽可能轻。
三、服务网关基本功能
- 智能路由:接收外部一切请求,并转发到后端的对外服务open-service上去;
- 注意:咱们只转发外部请求,服务之间的请求不走网关,这就表示全链路追踪、内部服务API监控、内部服务之间调用的容错、智能路由不能在网关完成;固然,也能够将全部的服务调用都走网关,那么几乎全部的功能均可以集成到网关中,可是这样的话,网关的压力会很大,不堪重负。
- 权限校验:只校验用户向open-service服务的请求,不校验服务内部的请求。服务内部的请求有必要校验吗?
- API监控:只监控通过网关的请求,以及网关自己的一些性能指标(例如,gc等);
- 限流:与监控配合,进行限流操做;
- API日志统一收集:相似于一个aspect切面,记录接口的进入和出去时的相关日志
- 。。。后续补充
上述功能是网关的基本功能,网关还能够实现如下功能:
- A|B测试:A|B测试时一块比较大的东西,包含后台实验配置、数据埋点(看转化率)以及分流引擎,在服务网关中,能够实现分流引擎,可是实际上分流引擎会调用内部服务,因此若是是按照上图的架构,分流引擎最好作在open-service中,不要作在服务网关中。
- 。。。后续补充
四、技术选型
笔者准备自建一个轻量级的服务网关,技术选型以下:
- 开发语言:java + groovy,groovy的好处是网关服务不须要重启就能够动态的添加filter来实现一些功能;
- 微服务基础框架:springboot;
- 网关基础组件:netflix zuul;
- 服务注册中心:consul;
- 权限校验:jwt;
- API监控:prometheus + grafana;
- API统一日志收集:logback + ELK;
- 压力测试:Jmeter;
- 。。。后续补充
在后续的介绍中,会逐渐介绍各个知识点,并完成一个轻量级的服务网关!!!
笔者准备自建一个轻量级的服务网关,技术选型以下:
- 开发语言:java + groovy,groovy的好处是网关服务不须要重启就能够动态的添加filter来实现一些功能;
- 微服务基础框架:springboot;
- 网关基础组件:netflix zuul;
- 服务注册中心:consul;
- 权限校验:jwt;
- API监控:prometheus + grafana;
- API统一日志收集:logback + ELK;
- 压力测试:Jmeter;
- 。。。后续补充
在后续的介绍中,会逐渐介绍各个知识点,并完成一个轻量级的服务网关!!!