一、微服务网关介绍
1.1 存在的问题
在分布式项目中,不同的微服务有不同的网络地址,而外部的客户端完成一个业务需求时,可能涉及到多个微服务接口,若让客户端直接与多个微服务通信,会带来以下问题:
- 业务复杂,客户端会多次请求不同的微服务,增加了业务处理时间和业务复杂度
- 存在跨域的问题
- 认证复杂,各个微服务都需要先对用户的请求进行身份认证
- 安全问题,直接将各个微服务模块都暴露给客户端
- 访问困难,根据实际情况,部分微服务设置了防火墙等方式,无法直接访问
- 重构复杂,随着项目咖啡啊,若项目需要重新划分微服务,如将多个微服务合并成一个微服务,或是拆分微服务,若是由客户端直接与微服务通信,则会导致工作复杂度增加
1.2 微服务网关
1.2.1 概述
使用微服务网关即能解决上面的问题。
网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过网关,这就可以形成这样的功能架构:
- 网关:处理安全、性能、监控方面的业务
- 业务微服务:更专注于业务逻辑的实现
整体架构图如下:
1.2.2 优点
- 降低了业务复杂度,让客户端只需发起一次请求到网关,由网关根据业务需求请求各个微服务处理,并将结果返回给客户端。
- 可以统一解决跨域问题
- 能够在网关服务中统一处理认证、日志、监控、限流
- 提高了安全性,由统一的访问入口,降低了业务服务的暴露风险和服务器受攻击面积
- 便于重构,客户端只负责向网关请求,实际的后端业务处理由后端自己完成,即若修改了后端业务逻辑,无需升级客户端,降低了前后端的耦合性。
1.2.3 常用技术
常见的实现微服务网关的技术有:
- nginx:高性能的HTTP和方向代理web服务器,同时也提供了IMAP/POP3/SMTP服务
- zuul:由 Netflix 出品的基于JVM路由和服务器的负载均衡器
- spring-cloud-gateway:由 spring 出品的基于spring 的网关项目,集成断路器、路径重写等
由于spring-cloud-gateway 的性能优于 zuul,且无缝兼容 springboot 等框架的项目,故市场大部分使用 spring-cloud-gateway
二、微服务网关的搭建