为什么微服务一定要有网关?

本文深入解析服务网关的概念,阐述其在微服务架构中的必要性,包括路由转发、权限校验、监控等功能,并探讨服务网关的技术选型,如使用Java、Groovy、SpringBoot、Netflix Zuul等技术构建轻量级网关。

一、什么是服务网关

服务网关 = 路由转发 + 过滤器

1、路由转发:接收一切外界请求,转发到后端的微服务上去;

2、过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。

 

二、为什么需要服务网关
上述所说的横切功能(以权限校验为例)可以写在三个位置:

  • 每个服务自己实现一遍
  • 写到一个公共的服务中,然后其他所有服务都依赖这个服务
  • 写到服务网关的前置过滤器中,所有请求过来进行权限校验

第一种,缺点太明显,基本不用;
第二种,相较于第一点好很多,代码开发不会冗余,但是有两个缺点:

  • 由于每个服务引入了这个公共服务,那么相当于在每个服务中都引入了相同的权限校验的代码,使得每个服务的jar包大小无故增加了一些,尤其是对于使用docker镜像进行部署的场景,jar越小越好;
  • 由于每个服务都引入了这个公共服务,那么我们后续升级这个服务可能就比较困难,而且公共服务的功能越多,升级就越难,而且假设我们改变了公共服务中的权限校验的方式,想让所有的服务都去使用新的权限校验方式,我们就需要将之前所有的服务都重新引包,编译部署。

而服务网关恰好可以解决这样的问题:

  • 将权限校验的逻辑写在网关的过滤器中,后端服务不需要关注权限校验的代码,所以服务的jar包中也不会引入权限校验的逻辑,不会增加jar包大小;
  • 如果想修改权限校验的逻辑,只需要修改网关中的权限校验过滤器即可,而不需要升级所有已存在的微服务。

所以,需要服务网关!!!

 

三、服务网关技术选型

引入服务网关后的微服务架构如上,总体包含三部分:服务网关、open-service和service。

1、总体流程:

  • 服务网关、open-service和service启动时注册到注册中心上去;
  • 用户请求时直接请求网关,网关做智能路由转发(包括服务发现,负载均衡)到open-service,这其中包含权限校验、监控、限流等操作
  • open-service聚合内部service响应,返回给网关,网关再返回给用户

2、引入网关的注意点

  • 增加了网关,多了一层转发(原本用户请求直接访问open-service即可),性能会下降一些(但是下降不大,通常,网关机器性能会很好,而且网关与open-service的访问通常是内网访问,速度很快);
  • 网关的单点问题:在整个网络调用过程中,一定会有一个单点,可能是网关、nginx、dns服务器等。防止网关单点,可以在网关层前边再挂一台nginx,nginx的性能极高,基本不会挂,这样之后,网关服务就可以不断的添加机器。但是这样一个请求就转发了两次,所以最好的方式是网关单点服务部署在一台牛逼的机器上(通过压测来估算机器的配置),而且nginx与zuul的性能比较,根据国外的一个哥们儿做的实验来看,其实相差不大,zuul是netflix开源的一个用来做网关的开源框架;
  • 网关要尽量轻。

3、服务网关基本功能

  • 智能路由:接收外部一切请求,并转发到后端的对外服务open-service上去;
    • 注意:我们只转发外部请求,服务之间的请求不走网关,这就表示全链路追踪、内部服务API监控、内部服务之间调用的容错、智能路由不能在网关完成;当然,也可以将所有的服务调用都走网关,那么几乎所有的功能都可以集成到网关中,但是这样的话,网关的压力会很大,不堪重负。
  • 权限校验:只校验用户向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;
  • 。。。后续补充

在后续的介绍中,会逐渐介绍各个知识点,并完成一个轻量级的服务网关!!!

作者:赵计刚

https://www.cnblogs.com/java-zhao/p/6716059.html

往期推荐:

史上最强Tomcat8性能优化

日均5亿查询量的京东到家订单中心,为什么舍MySQL用ES?

四张图带你了解Tomcat系统架构--让面试官颤抖的Tomcat回答系列!

“12306”架构到底有多牛逼--秒杀系统的艺术

阿里巴巴为什么能抗住90秒100亿?--服务端高并发分布式架构演进之路

B2B电商平台--ChinaPay银联电子支付功能

学会Zookeeper分布式锁,让面试官对你刮目相看

SpringCloud电商秒杀微服务-Redisson分布式锁方案

一只 有深度 有灵魂 的公众号0.0

<think>我们正在讨论前后端分离架构中非微服务项目和微服务项目的区别。注意,前后端分离是一个架构风格,而微服务是另一种架构风格,它们可以独立存在也可以结合使用。因此,我们可以从多个维度来比较这两种架构。 核心区别:微服务架构强调将应用拆分为多个独立部署、运行的服务,每个服务负责特定的业务功能;而非微服务的单体架构(即使是前后端分离)则将所有业务功能集中在一个应用中。 以下从几个关键维度进行对比: 1. **应用拆分与部署**: - **微服务项目**:后端被拆分为多个独立的服务(如用户服务、订单服务、商品服务等),每个服务可以独立开发、测试、部署和扩展。通常每个服务有自己的数据库。 - **非微服务项目**:后端是一个单一的、完整的应用(通常称为单体应用),尽管前端与后端分离,但后端的所有功能都打包在一个应用中,部署为一个单元。 2. **技术栈**: - **微服务项目**:不同服务可以使用不同的技术栈(如Java、Python、Go等),只要它们之间通过标准协议(如HTTP/REST、gRPC)通信即可。同时,微服务架构通常需要引入服务注册与发现、配置中心、API网关等基础设施组件。 - **非微服务项目**:整个后端使用统一的技术栈,因为所有模块都在同一个应用中。不需要服务注册与发现等微服务基础设施。 3. **数据管理**: - **微服务项目**:每个服务拥有自己的数据库(遵循数据库隔离原则),数据一致性通过分布式事务或最终一致性模式保证。 - **非微服务项目**:整个应用共享一个数据库,可以利用数据库的事务特性保证强一致性。 4. **通信方式**: - **微服务项目**:服务之间通过网络调用进行通信(如HTTP/REST、RPC),因此必须考虑网络延迟、容错(如熔断、降级)等问题。 - **非微服务项目**:后端内部模块间通过函数或方法调用通信,效率高,不存在网络延迟问题。 5. **运维复杂度**: - **微服务项目**:运维复杂度高,需要管理多个服务,包括服务监控、日志聚合、链路追踪等,通常需要容器化(如Docker)和容器编排(如Kubernetes)支持。 - **非微服务项目**:运维简单,只需部署一个应用(可能还有数据库等中间件),监控和日志也相对简单。 6. **可扩展性**: - **微服务项目**:可以针对单个服务进行扩展(例如,订单服务压力大,只扩展订单服务实例),资源利用率高。 - **非微服务项目**:扩展时需要复制整个应用(即使只有部分功能需要扩展),资源利用率较低。 7. **开发与测试**: - **微服务项目**:开发时可以独立开发一个服务,但测试需要依赖其他服务(可通过模拟解决),集成测试复杂。 - **非微服务项目**:开发时容易产生代码冲突,但测试简单,因为所有功能都在一个进程内。 8. **适用场景**: - **微服务项目**:适用于大型复杂应用,需要多个团队独立开发,且需要高可扩展性和高可用性。 - **非微服务项目**:适用于中小型应用,开发团队规模不大,对快速启动和简单运维有要求。 总结:前后端分离的非微服务项目(单体架构)和微服务项目的主要区别在于应用内部的拆分方式。前后端分离只是将前端和后端分开,而后端内部是否拆分成多个服务则是微服务与单体的区别。 下面用表格形式总结: | **维度** | **前后端分离的非微服务项目(单体)** | **前后端分离的微服务项目** | |------------------|--------------------------------------|----------------------------------| | 应用拆分 | 后端单体应用 | 后端拆分为多个独立服务 | | 部署方式 | 整体部署 | 每个服务独立部署 | | 技术栈 | 统一技术栈 | 每个服务可使用不同技术栈 | | 数据管理 | 共享数据库 | 每个服务独立数据库 | | 服务间通信 | 进程内方法调用 | 网络调用(HTTP/RPC) | | 运维复杂度 | 低 | 高(需要服务治理) | | 可扩展性 | 整体扩展,资源利用率低 | 按服务扩展,资源利用率高 | | 开发测试 | 简单 | 复杂(需处理分布式系统问题) | | 适用场景 | 中小型应用 | 大型复杂应用 | 注意:前后端分离架构在两种项目中都存在,即前端都是独立的应用(如Vue.js、React等),通过API与后端交互。 因此,判断一个前后端分离的项目是单体还是微服务,关键在于后端是否被拆分为多个独立运行的服务。 相关问题: 1. 如何将前后端分离的单体应用改造成微服务架构? 2. 微服务架构中如何保证数据一致性? 3. 单体架构和微服务架构在性能上各有什么优缺点? 4. 微服务架构中的服务划分有哪些原则? 5. 前后端分离架构中,前端如何适应后端微服务的变化?</think>### 前后端分离架构中非微服务项目与微服务项目的核心区别 以下是两类架构的主要差异对比(基于技术实现、系统结构和运维特性): | **维度** | **前后端分离的非微服务项目** | **前后端分离的微服务项目** | |------------------|---------------------------------------------|-----------------------------------------| | **架构本质** | 单体应用(Monolithic) | 分布式系统(Distributed) | | **后端结构** | 单一代码库,所有功能集成在一个进程中 | 拆分为独立服务(如认证/订单/用户服务) | | **部署单元** | 单个可执行文件(如JAR/WAR) | 多个独立容器/进程(如Docker容器) | | **通信方式** | 前端通过REST API调用单一后端 | 前端通过网关调用多个服务,服务间通过RPC/消息通信 | | **数据库设计** | 共享数据库(单一或主从) | 每个服务独享数据库(数据库隔离) | | **技术栈约束** | 全栈统一技术(如Spring Boot) | 各服务可使用不同语言/框架(如Java+Go) | | **运维复杂度** | 低(监控/日志/部署简单) | 高(需服务发现、链路追踪、配置中心) | | **扩展性** | 垂直扩展(整体扩容) | 水平扩展(按服务独立扩容) | | **容错能力** | 单点故障导致整个系统崩溃 | 故障隔离(单个服务宕机不影响全局) | | **典型组件** | Spring Boot + MySQL + Vue.js | Spring Cloud + Nacos + Sentinel + Vue.js | #### 详细说明: 1. **系统拆分粒度** - **非微服务**:业务模块通过代码包(package)划分,例如: ```java com.example.monolith ├── user // 用户模块 ├── order // 订单模块 └── product // 商品模块 ``` 所有模块编译为单一应用,通过进程内调用通信。 - **微服务**:每个业务模块独立为服务,例如: ``` user-service/ src/ pom.xml // 独立部署单元 order-service/ src/ pom.xml ``` 服务间需网络通信(如OpenFeign)[^1]。 2. **基础设施依赖** - **微服务必备组件**: - **服务注册中心**(如Nacos):实现服务发现 ```yaml spring: cloud: nacos: discovery: server-addr: localhost:8848 ``` - **API网关**(如Spring Cloud Gateway):路由请求到具体服务 - **配置中心**:统一管理各服务配置 - **非微服务**:无需这些组件,配置直接写在`application.yml`中。 3. **数据一致性处理** - **非微服务**:直接用数据库事务保证ACID: ```java @Transactional // 单体事务注解 public void createOrder() {...} ``` - **微服务**:需分布式事务方案(如Seata),采用最终一致性: ```java @GlobalTransactional // 分布式事务注解 public void distributedOperation() {...} ``` 4. **性能对比** - **微服务优势**: - 资源利用率高:热点服务独立扩容(如订单服务实例数 > 用户服务) - 响应优化:并行调用多个服务(如$$T_{总}= \max(T_1,T_2)$$) - **非微服务优势**: - 无网络开销:模块间调用延迟 $$ \approx 0 \mu s $$(进程内) - 开发期性能更高(无需服务发现等中间件) 5. **适用场景** - **选择非微服务**当: - 团队规模小(<10人) - 业务复杂度低(模块<5个) - 需要快速迭代(微服务30%开发量) - **选择微服务**当: - 系统需高可用(99.99% SLA) - 多团队协作(各团队负责独立服务) - 业务持续扩展(未来需新增支付/风控等服务) > **关键判断点**:若项目包含**服务注册中心**、**API网关**、**独立数据库**设计,即为微服务架构;若所有功能集成在**单一进程**且直接访问**共享数据库**,则为非微服务架构[^1]。 --- ### 相关问题 1. 如何将非微服务的单体若依系统改造为微服务架构? 2. 微服务架构中如何保证服务间调用的可靠性? 3. 非微服务项目在哪些场景下性能优于微服务架构? 4. 微服务架构下数据库分库分表的设计原则是什么? 5. 若依微服务版中如何实现跨服务事务管理? [^1]: 基于若依官方文档及微服务架构设计实践,详见 Ruoyi-Cloud GitHub 仓库。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值