云原生|为什么服务网格能够轻松重塑微服务?一文讲清楚!

目录

一、概述

二、 设计

三、服务网格

四、总结


一、概述

容器化技术与容器编排推动了微服务架构应用的演进,于是应用的扩展与微服务的数量日益增加,新的问题随之而来,监控服务的性能变得越来越困难,微服务与微服务之间相互通信变得越来越复杂,请求链路越来越长,排查问题变得越来越繁琐……

云原生应用下使用服务网格作为解决上述问题的方案之一。

服务网格不仅描述了这个应用的网络,而且还描述了分布式应用程序组件之间的交互,所有在该应用之间传递的数据都会由服务网格来接管。这意味着它能管控流量,控制路由……如果仅仅只是这些倒是与传统的网关基础设施没什么区别。但微服务体系结构通常还有更复杂的操作需求,比如A/B测试,Canary部署,速率限制,访问控制,加密和端到端身份验证等。

服务网络可以通过可观测性,网络和安全策略来分隔应用程序的业务逻辑。通过服务网格可以链接微服务,让微服务更安全,可以更好地监控微服务。

二、 设计

假设我们现在已存在一个微服务架构的系统,但是我们用传统的网关代理方式来作为服务之间的通信代理(如下图所示)。

图片

可以看到Nginx代理了该系统中的所有服务,无论是服务1还是Minio,DB等都在Nginx的代理下。在这种网络代理下如果Server1请求Server2还是访问DB服务都要将流量先打到Nginx,然后再由路由进行分发,代理到具体的某个服务下。

在上述这种代理模式下,服务的Path管理会变得很繁琐,每引入或者扩容一个新服务就需要更改一次Nginx的配置,服务可能因为某种原因而崩溃,但是Nginx只能做到基础的健康检查,如果想做负载均衡还得再调整配置……

服务发现也许能通过引入Consul来解决,但是路由的代理最终还是需要在网关层面做配置,健康检查也不能解决服务因为崩溃后断连的问题,手动运维这些会相当繁琐。这时候可能会想:不如直接上Kubernetes,容器化技术解决自启动的问题,Kubernetes中自带服务发现/注册,只需要使用Nginx代理一下Server就好。

于是设计可能会演变成:

图片

上述示意图中为了代理各个服务,由ingress接管原本Nginx路由分发,然后将流量转发给Service,由Service来做负载均衡。而Minio则代表着⼀些边缘服务。

Minio API 在代码访问中不能添加Path路径,它的安全策略不允许,所以 www.demo.com/minio 这类的地址是无法访问的。使用Ingress时代理Minio需要额外申请一个域名。

当请求从客户端发起时,由Nginx转发到Kubernetes Nginx-Ingress服务端口,再由Ingress进行流量分割发送到不同的Service。这一网络链路看似没什么问题,但是在做单体应用向微服务应用拆分时,往往也容易背负巨大的技术债务。

例如:Minio/DB从单体部署演变成集群,势必涉及到部署的方式改变,数据的迁移,数据备份,容灾等......某些暂时无法进行拆分的基础设施成为了云原生环境下的边缘服务,示意图中的Minio也代表着这一类的服务(它们不好拆分或成本略高)。

于是我们依旧保留着Nginx作为唯一网关的入口,并代理一部分的边缘服务,业务服务的网络代理由Kubernetes接管,服务与服务之间的通信使用集群网络。

上述的方案可能对于一定规模的应用下够用了,但是随着业务要求,引入一些新技术,比如为了服务的稳定性,要求上线前做金丝雀发布(Kubernetes固然可以通过更改Pod的数量来按照比例伸缩达到目的);收集整个系统的日志信息(还记得我们有一部分部署在集群之外的边缘服务吗?);跨集群进行访问,亦或跨不同云厂商的集群访问;

这些新技术的引入会让原本就复杂的网络链路变得更加复杂,当你想对系统进行测压时,一个配置(可能是Nginx的配置,也可能是Ingress的配置)错误都会让你难以定位,可能你会找错瓶颈,混淆你的判断从而走向错误的方向。

三、服务网格

Kubernetes最精细的颗粒度也只能达到容器层次,如果再想进一步只能依靠工程师来管理,容器编排系统很难提供更有效的支持。但是服务网格的出现就是为了弥补这一缺憾。

服务网格只是处理程序间通信的基础设施,但它不是一个独立的存在,它以"边车"的形式直接部署在应用旁边,一对一为应用提供服务代理。

"边车",⼀种常见的容器设计模式,用来形容外挂在容器身上的辅助程序。

服务网格在容器的支持下,不需要侵入业务代码就能强制性地对应用通信进行管理,原理类似中间人流量劫持,透明地接管容器。

下图出自《凤凰架构》

图片

服务网格包括两大块内容:和微服务共同部署的边车代理;用于控制这些代理的管理者;服务网格使用数据平面通信和控制平面通信来形容这两类流量。

我们使用服务网格其实希望更好梳理网络的访问链路,期望在基础设施服务就能解决网络的一部分问题,比如中断重试,不同云厂商之间平稳迁移,统一纳入网络平面,不依赖程序就能控制访问等……

数据平面也被称为转发平面,为了在不可靠的物理网络中保证程序间通信的最大可靠性,它可以在无感情况下自动完成服务路由,健康检查,负载均衡,认证鉴权,产生监控数据等……

四、总结

我们从单体应用向微服务的演变讲述了网络代理在各个阶段的变化。服务网格可能是未来的一个趋势,时至今日服务网格的代表Istio已经从CNCF中毕业了,但服务网格并非是"银弹",它不支持与其他系统或服务集成,也不解决转换映射或路由类型之类的问题……使用服务网格也需要云原生环境,一些边缘,独立部署的服务也无法纳入系统中享受新技术带来的便利;引入一套全新的网络服务也会增加应用的成本,使用不当反而会增加项目风险,留下成本巨大的技术债务。 

在实际项目中我们需要考虑不同应用架构,规模使用最合适的网络服务代理。如果仅仅只是一个单体应用,那么Nginx或许是最好的选择;如果是正在演进的分布式系统,又在不断迭代,那么Nginx ingress 在这一阶段也许就能满足需求;如果微服务应用已经达到一定规模,开发工程师或运维工程师已经无法了解整个系统的全貌,那使用服务网格倒也无可厚非。

版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。

公众号搜索神州数码云基地,了解更多技术干货!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/652299.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习实战-yolox训练ExDark数据集所遇到的错误合集

跳转深度学习实战-yolox训练ExDark数据集(附全过程代码,超详细教程,无坑!) 一、 训练时出现ap为零 情况1.数据集没导进去 修改exps/example/yolox_voc/yolox_voc_s.py 当然由于image_sets只有一个元素因此修改yolox/data/datasets/voc.py 情况2.iou设置过高 修改yolo…

【全开源】在线题库微信小程序系统源码(ThinkPHP+FastAdmin+UniApp)

打造个性化学习平台 一、引言:在线学习的未来趋势 在数字化时代,线上学习已逐渐成为主流。随着移动互联网的普及,小程序以其轻便、快捷、无需安装的特点,成为用户日常学习的新选择。为了满足广大用户对于在线学习的需求&#xf…

深度学习模型在OCR中的可解释性问题与提升探讨

摘要: 随着深度学习技术在光学字符识别(OCR)领域的广泛应用,人们对深度学习模型的可解释性问题日益关注。本文将探讨OCR中深度学习模型的可解释性概念及其作用,以及如何提高可解释性,使其在实际应用中更可…

SqlServer 2016 2017 2019安装失败-无法找到数据库引擎启动句柄

SqlServer 2016 2017 2019安装失败-无法找到数据库引擎启动句柄 出现以上问题的原因是因为系统账户无法操作数据库引擎服务。需要调整权限。 按照以下步骤解决,成功完成安装,已亲测: 1、如果您已经安装了相同版本的SQL Server,…

Net快速开发-创建和使用项目模板(多个项目(解决方案)打包)

1.从nuget安装模版包 下载安装官方模版 从 NuGet 包源安装 Microsoft.TemplateEngine.Authoring.Templates 模板。 从终端运行 dotnet new install Microsoft.TemplateEngine.Authoring.Templates 命令。2.创建模版 Microsoft.TemplateEngine.Authoring.Templates 包含可用于…

TiDB-从0到1-分布式事务

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCC 一、事务定义 这属于老生常谈了,无论不管是传统事务还是分布式事务都离不开ACID A:原子性C:一致性I:隔离性D:…

智能工厂:ThingsBoard网关在工业物联网中的桥梁作用

自动化及工业物联网 解放生产力的未来之路 在当今高度信息化的时代,工业自动化及工业物联网(IIoT)已成为工业制造领域的核心驱动力。随着人工智能、大数据和云计算等技术的持续发展,自动化及工业物联网正在以前所未有的速度改变…

shell脚本-函数

一、函数 1.函数的定义和格式 函数定义:封装的可重复利用的具有特定功能的代码 先定义函数,再调用函数,注意顺序 函数类似于命令的别名,别名一些简单的小命令 函数是某一个脚本的别名,有些脚本会重复使用 函数格…

音视频开发—音频相关概念:数模转换、PCM数据与WAV文件详解

文章目录 前言1.模拟数字转换(ADC)1.1ADC的关键步骤: 2.数字模拟转换(DAC)2.1DAC 的基本流程包括: 3.PCM数据3.1PCM 数据的关键要素包括: 4.WAV文件4.1 WAV的构成4.2WAV文件的标准块结构4.3WAV的…

浙江大学数据结构MOOC-课后习题-第六讲-图3 六度空间

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 心路历程 当我看到慕课上对这题的简介写的是: 不过实现起来还是颇有码量的,有时间就尝试一下。 我甚至在想要不要在距离图书馆闭馆仅2个小时的时候,挑战这道题&#x…

Linux: network: TCP: zero window size/window full 示例

最近遇到一个问题,当前机器的CPU使用率非常高,然后导致其中一个程序处理socket的数据过慢,然后出现下面的zero的示例。 下面是在接收buff用光的时候,发出的 TCP zeroWindows的消息 这种问题就是内存,CPU,网速之间的性能取舍。具体解决的话,需要看具体的需要是什么样的?…

Monocular Model-Based 3D Tracking of Rigid Objects:2005年综述

1 Introduction 在视频序列中跟踪一个物体意味着在物体或摄像机移动时,持续识别其位置。根据物体类型、物体和摄像机的自由度以及目标应用的不同,有多种方法可供选择。二维跟踪通常旨在跟踪物体或物体部分的图像投影,这些物体的三维位移会导…

(十二)统计学基础练习题六(选择题T251-300)

本文整理了统计学基础知识相关的练习题,共50道,适用于想巩固统计学基础或备考的同学。来源:如荷学数据科学题库(技术专项-统计学二)。序号之前的题请看往期文章。 251) 252) 253) 2…

测试驱动编程(4)模拟消除依赖

文章目录 测试驱动编程(4)模拟消除依赖模拟框架Mockito什么要模拟名词解释Mockito常用注解Mockito常用静态方法Mockito测试流程三部曲基础用法可变返回结果验证verfily对象监视spy 示例实战升级版井字游戏需求一需求二需求三 总结 测试驱动编程(4)模拟消除依赖 模拟框架Mockit…

硬盘文件可以直接剪切到另一个盘吗?分享方法与注意事项

在数字化时代,硬盘成为了我们存储和管理文件的重要设备。随着数据量的不断增长,我们有时需要将文件从一个硬盘盘符转移到另一个盘符,以便更好地组织和利用存储空间。硬盘文件剪切操作就是实现这一目标的有效方式之一。本文将详细介绍如何直接…

医疗小程序源码SpringBoot2.X + Vue + UniAPP全栈开发

源码说明: 看到好多坛友都在求SpringBoot2.X Vue UniAPP,全栈开发医疗小程序 – 带源码课件,我看了一下,要么链接过期,要么课件有压缩密码。 特意整理了一份分享给大家,个人认为还是比较全面的。 希望…

day16--集合进阶(Set、Map集合)

day16——集合进阶&#xff08;Set、Map集合&#xff09; 一、Set系列集合 1.1 认识Set集合的特点 Set集合是属于Collection体系下的另一个分支&#xff0c;它的特点如下图所示 下面我们用代码简单演示一下&#xff0c;每一种Set集合的特点。 //Set<Integer> set ne…

深度解析Nginx配置文件:从全局块到upstream块的探索之旅

Nginx配置文件的简介 在浩瀚的互联网世界中&#xff0c;Nginx就如同一座大型交通枢纽&#xff0c;将访问者的请求精准地引导到正确的服务终点。而这一切&#xff0c;都离不开一个神秘而重要的角色——Nginx配置文件。这个文件&#xff0c;就像是一份详尽的路线图&#xff0c;为…

【动手学PaddleX】谁都能学会的基于迁移学习的老人摔倒目标检测

本项目使用PaddleX搭建目标检测模块&#xff0c;在一个精选的数据集上进行初步训练&#xff0c;并在另一个老年人跌倒检测的数据集上进行参数微调&#xff0c;实现了迁移学习的目标检测项目。 1.项目介绍 迁移学习是非常有用的方法&#xff0c;在实际生活中由于场景多样&…

Maven查看项目中的pom依赖

一&#xff0c;背景 Spring项目上线前进行了安全扫描&#xff0c;一些安全漏洞扫出来了&#xff0c;需要做一些处理。扫描的结果如下&#xff1a; [安装包路径:/usr/local/opr-platform/opr-platform.jar -> BOOT-INF/lib/commons-compress-1.19.jar 当前版本:1.19 存在漏洞…