springcloud之Zuul初识篇—背景
分布式项目中存在大量独立运行的服务,如果把所有服务的端口都暴露出来肯定是不可取的(不安全也不方便调用)。所以需要一组服务来作为代理,外部请求只请求这个代理服务,由该服务代理请求相应的业务服务,同时完成鉴权、限流等一系列通用操作。这样既减少了服务的暴露也简化了各业务模块部分冗余代码的开发(如:订单模块只做和订单相关的事,权限鉴证什么的都交给代理服务来做),这样的代理服务我们一般定义为网关,springcloud中最常用的网关就是Zuul。
示意图
没有网关
PS:服务端需要将每个服务的接口都暴露出来,且不同的模块操作时都需要相关的权限,鉴权的方法也要在每个服务中都写一遍(每个服务都是在独立进程中无法复用公共方法),客户端维护接口困难(服务端每增加一个服务客户端就要多加一个接口)且无法实现负载均衡。
添加网关
PS:客户端只向网关发起请求,由网关选择具体调用哪一个服务。
这样只需要对外暴露网关接口,其他服务的接口不需要暴露出去,各个服务的鉴权等前置操作也都由网关统一执行,各服务只需要专注自己的本质业务就好。
客户端只需要维护网关对应的接口信息,不需要维护一堆的接口,负载均衡也交由网关实现,简化客户端的开发。
QA1:请求较多时单个网关服务无法保证并发量
对网关服务进行集群操作
QA2:网关服务集群后客户端维护网关服务信息变得复杂
在对网关请求的中间架上一层Nginx,客户端的请求由Nginx获取后由Nginx进行负载到指定的网关服务,这样既减少了客户端的信息维护,也提供了很好的并发处理(nginx+keepalived)
简图: