在微服务架构中API网关和分布式追踪都是重要的组件。
但是很多人在选型的时候,会困惑API网关和分布式追踪Jaeger到底有什么区别该怎么选是不是选了一个就不用另一个了?
其实API网关和分布式追踪Jaeger是两个完全不同的组件解决的是,不同的问题它们不是互斥的而是互补的在微服务架构中通常都需要。
今天想详细对比API网关设计和分布式追踪Jaeger的区别帮大家理解这两个组件的定位做出合理的选型决策。
一、先搞清楚:它们解决什么问题
在对比之前,先搞清楚API网关和分布式追踪Jaeger各自解决什么问题。
API网关解决什么问题:
API网关是微服务架构中的统一入口所有的外部请求都先经过API网关再转发到后端的微服务。
API网关主要解决以下问题:
- 统一入口:所有外部请求统一从API网关进入后端服务不需要暴露给外部。
- 路由转发:根据请求的路径,或者规则转发到对应的后端服务。
- 认证授权:统一处理认证和授权不需要每个服务都实现一遍。
- 限流熔断:统一处理限流熔断降级保护后端服务。
- 日志监控:统一记录请求日志监控请求状态。
- 协议转换:比如HTTP转gRPC或者其他协议。
- 请求改写:修改请求头参数路径等等。
简单来说API网关是微服务的"大门"负责管理所有进入系统的请求。
分布式追踪Jaeger解决什么问题:
分布式追踪是微服务架构中的可观测性组件用来追踪一个请求在多个微服务之间,的调用链路记录每个服务的处理时间和状态。
Jaeger是Uber开源的分布式追踪系统是目前最流行的分布式追踪方案之一也是CNCF的毕业项目。
分布式追踪主要解决以下问题:
- 调用链路追踪:追踪一个请求经过了哪些服务调用顺序是什么。
- 性能分析:记录每个服务的处理时间找出性能瓶颈。
- 故障定位:当请求出错的时候,快速定位是哪个服务出了问题。
- 依赖分析:分析服务之间,的依赖关系了解系统的架构。
- 调用统计:统计服务的调用次数错误率响应时间等等。
简单来说,分布式追踪是微服务的"CT"负责透视请求在系统内部的调用过程。
二、核心区别对比
搞清楚了各自解决的问题再详细对比它们的核心区别。
| 对比项 | API网关 | 分布式追踪Jaeger |
|---|---|---|
| 定位 | 微服务的统一入口请求管理 | 微服务的可观测性调用追踪 |
| 作用位置 | 系统边界外部请求入口 | 系统内部服务之间,调用 |
| 核心功能 | 路由、认证、限流、熔断、日志 | 链路追踪、性能分析、故障定位 |
| 处理对象 | 进入系统的外部请求 | 系统内部的服务调用 |
| 是否必须 | 微服务架构推荐使用 | 微服务架构推荐使用 |
| 数据流向 | 请求经过网关转发到服务 | 服务上报追踪数据到Jaeger |
| 性能影响 | 有一定延迟,因为要经过网关 | 有一定开销,因为要上报数据 |
| 典型产品 | Nginx、Kong、Zuul、Spring Cloud Gateway | Jaeger、Zipkin、SkyWalking |
| 用户 | 运维、后端开发、架构师 | 开发、运维、SRE |
从这个对比可以看出API网关和分布式追踪Jaeger是完全不同的组件解决的是,不同的问题它们不是竞争关系而是互补关系。
三、API网关详解
下面再详细讲讲API网关的设计和选型。
API网关的核心功能:
- 路由转发:这是API网关最基础的功能根据请求的路径,或者规则转发到对应的后端服务。比如/api/user/转发到用户服务/api/order/转发到订单服务。
- 认证授权:统一处理认证和授权,比如JWT验证OAuth2权限检查等等。这样后端服务就不需要都实现认证逻辑只需要关注业务逻辑。
- 限流熔断:统一处理限流熔断降级保护后端服务不被大流量打垮。比如限制某个IP的请求频率某个服务的并发数等等。
- 日志监控:统一记录请求日志包括请求参数响应状态处理时间等等方便排查问题和,监控系统状态。
- 协议转换:比如外部用HTTP请求网关网关转成gRPC调用后端服务。或者外部用RESTful网关转成GraphQL等等。
- 请求改写:修改请求头参数路径等等,比如添加统一的请求头修改路径前缀等等。
- 缓存:对一些不常变的接口做缓存减少后端服务的压力。
API网关的选型:
目前主流的API网关有以下几种:
- Nginx:高性能的Web服务器和,反向代理也可以作为API网关用。优点是性能高稳定成熟缺点是动态配置不够方便需要重启,或者reload扩展功能需要用Lua脚本,或者OpenResty。
- Kong:基于Nginx和OpenResty的API网关提供了丰富的插件机制支持动态配置管理界面等等。优点是功能丰富生态好性能不错缺点是比较重部署复杂一些。
- Zuul:Netflix开源的API网关是Spring Cloud早期的默认网关。优点是和Spring Cloud集成好开发简单缺点是性能一般Zuul 1是同步阻塞的Zuul 2虽然是异步非阻塞的,但是Spring Cloud没有集成。
- Spring Cloud Gateway:Spring官方推出的API网关替代Zuul基于Spring 5Spring Boot 2Project Reactor是异步非阻塞的。优点是性能好和Spring Cloud集成好开发简单缺点是相对新一些生态不如Kong成熟。
- Traefik:现代的HTTP反向代理和,负载均衡器支持自动服务发现动态配置等等。优点是轻量简单自动配置缺点是功能不如Kong丰富。
API网关的设计要点:
设计API网关的时候,要注意以下几点:
- 高性能:API网关是所有请求的入口性能很重要不能成为瓶颈。要选择高性能的网关方案合理配置参数。
- 高可用:API网关是单点一旦挂了整个系统都无法访问。所以一定要做高可用部署多个实例前面加负载均衡。
- 可扩展:API网关的功能要可扩展支持插件机制方便添加新的功能。
- 安全:API网关是系统的入口安全很重要要做好认证授权限流防攻击等等。
- 可观测:API网关要有完善的日志监控告警方便排查问题和,监控系统状态。
四、分布式追踪Jaeger详解
下面再详细讲讲分布式追踪Jaeger的设计和使用。
分布式追踪的核心概念:
在讲Jaeger之前,先理解分布式追踪的核心概念:
- Trace(追踪):一个请求的完整调用链路从请求开始到结束经过的所有,服务的调用组成一个Trace。
- Span(跨度):Trace中的一个调用单元,比如一个服务的处理过程就是一个Span。每个Span有开始时间结束时间操作名标签等等。
- SpanContext(跨度上下文):Span的上下文包含TraceIDSpanID等等用于在服务之间,传递追踪信息。
一个Trace由多个Span组成Span之间,有父子关系形成一棵树的结构代表请求的调用链路。
Jaeger的架构:
Jaeger的架构主要由以下几个组件组成:
- Jaeger Client(客户端):集成在应用中用来创建Span上报追踪数据。支持多种语言JavaGoPythonNode.js等等。
- Jaeger Agent(代理):部署在每台机器上接收客户端上报的追踪数据做一些处理,然后批量发送给Collector。Agent的作用是减轻客户端的负担和Collector解耦。
- Jaeger Collector(收集器):接收Agent发送的追踪数据做验证索引转换,然后存储到后端存储。
- Storage(存储):存储追踪数据支持多种存储后端,比如CassandraElasticsearchKafka等等。
- Jaeger Query(查询服务):提供API查询追踪数据给UI使用。
- Jaeger UI(界面):Web界面用来查看追踪数据搜索Trace查看调用链路性能分析等等。
Jaeger的使用:
使用Jaeger主要分以下几步:
- 部署Jaeger后端:部署Jaeger的AgentCollectorStorageQueryUI等组件。可以用DockerKubernetes或者二进制部署。
- 集成客户端:在应用中集成Jaeger客户端,或者OpenTracing客户端。OpenTracing是分布式追踪的标准APIJaeger支持OpenTracing所以可以用OpenTracing的API写代码底层用Jaeger实现。
- 埋点:在代码中埋点创建Span记录操作信息。比如在HTTP请求入口创建Span在调用其他服务的时候,传递SpanContext创建子Span。
- 查看追踪数据:在Jaeger UI中搜索Trace查看调用链路分析性能定位故障。
Jaeger的优势:
- 开源免费:Jaeger是Uber开源的完全免费源码开放。
- CNCF毕业项目:Jaeger是CNCF的毕业项目成熟稳定社区活跃。
- 支持OpenTracing:Jaeger支持OpenTracing标准API和,其他分布式追踪系统兼容方便切换。
- 多语言支持:Jaeger支持多种编程语言的客户端JavaGoPythonNode.jsC++等等。
- 性能好:Jaeger的性能很好能处理大量的追踪数据对应用的性能影响小。
- UI友好:Jaeger的Web UI很友好功能丰富方便查看和,分析追踪数据。
五、到底该选哪个
讲了这么多回到最初的问题API网关和分布式追踪Jaeger到底该选哪个?
答案是都要选它们不是互斥的而是互补的。
因为它们解决的是完全不同的问题:
- API网关解决的是请求入口管理的问题是系统的"大门"。
- 分布式追踪Jaeger解决的是调用链路追踪的问题是系统的"CT"。
一个管入口一个管内部调用它们配合使用才能构建完整的微服务架构。
打个比方API网关就像小区的大门和保安负责管理进出小区的人员和,车辆登记验证放行。而分布式追踪就像小区的监控系统负责记录人员和,车辆在小区内部的行动轨迹方便查找问题。
大门和监控都是需要的不能说有了大门就不用监控了也不能说有了监控就不用大门了。
所以在微服务架构中API网关和分布式追踪Jaeger都应该部署和使用。
六、它们如何配合使用
API网关和分布式追踪Jaeger不仅都需要,而且还能配合使用发挥更大的作用。
1. API网关作为追踪的入口:
API网关是所有请求的入口,所以可以在API网关层创建Trace的根Span然后把SpanContext传递给后端服务后端服务继续创建子Span。
这样整个请求的调用链路从API网关开始到各个后端服务都能被追踪形成完整的Trace。
很多API网关都支持集成分布式追踪,比如Kong有Jaeger插件Spring Cloud Gateway也支持集成Jaeger或者Zipkin。
2. 网关日志和追踪数据关联:
API网关记录的请求日志和分布式追踪的Trace数据可以通过TraceID关联起来。
当请求出错的时候,可以通过网关日志找到TraceID然后在Jaeger中搜索这个TraceID查看完整的调用链路快速定位问题。
3. 网关指标和追踪数据结合分析:
API网关的监控指标,比如请求量错误率响应时间等等和分布式追踪的数据结合分析能更全面地了解系统的状态。
比如网关监控发现某个接口响应时间变长可以在Jaeger中查看这个接口的Trace分析是哪个服务慢找出性能瓶颈。
七、常见误区
最后讲讲关于API网关和分布式追踪的常见误区。
误区1:有了API网关就不用分布式追踪了:
这是错误的。API网关只能看到请求进入系统的情况和网关转发的情况,但是看不到请求在后端多个服务之间,的调用链路。
如果请求在后端某个服务出错,或者变慢API网关只能看到最终的结果,但是不知道具体是哪个服务出了问题需要分布式追踪来定位。
误区2:有了分布式追踪就不用API网关了:
这也是错误的。分布式追踪只能追踪调用链路,但是不能管理请求入口不能做认证授权限流熔断等等。
如果没有API网关所有后端服务都要暴露给外部都要自己实现认证授权限流等等很混乱也不安全。
误区3:分布式追踪会严重影响性能:
很多人担心分布式追踪会严重影响应用的性能,所以不敢用。
其实现在的分布式追踪系统,比如Jaeger性能都很好对应用的性能影响很小一般在5%以下甚至更低。而且可以通过采样的方式只追踪一部分请求进一步降低性能影响。
所以不用太担心性能问题分布式追踪带来的好处远远大于性能的影响。
误区4:API网关会成为性能瓶颈:
很多人担心API网关是所有请求的入口会成为性能瓶颈。
其实现在的API网关性能都很高,比如NginxKongSpring Cloud Gateway都能处理大量的请求,只要合理配置和部署不会成为瓶颈。
而且API网关可以水平扩展部署多个实例前面加负载均衡能处理更大的流量。
八、写在最后
以上就是API网关设计和分布式追踪Jaeger的详细对比。
总结一下API网关和分布式追踪Jaeger是微服务架构中两个不同的组件解决的是,不同的问题它们不是互斥的而是互补的在微服务架构中通常都需要。
API网关是系统的"大门"负责管理请求入口做路由认证限流熔断等等。分布式追踪Jaeger是系统的"CT"负责追踪调用链路做性能分析故障定位等等。
它们配合使用能构建更完善更可观测的微服务架构。
所以不要再问"到底该选哪个"了答案是"都要"。
希望这篇文章能帮大家理解API网关和分布式追踪Jaeger的区别和,定位做出合理的架构决策。
如果有什么问题,或者不同的看法欢迎在评论区留言我们一起交流。
最后用一句话结束这篇文章:"微服务架构没有银弹需要多个组件配合才能构建完善的系统。"
愿大家都能构建稳定可观测的微服务系统。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录