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

目录

一、概述

二、 设计

三、服务网格

四、总结


一、概述

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

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

服务网格不仅描述了这个应用的网络,而且还描述了分布式应用程序组件之间的交互,所有在该应用之间传递的数据都会由服务网格来接管。这意味着它能管控流量,控制路由……如果仅仅只是这些倒是与传统的网关基础设施没什么区别。但微服务体系结构通常还有更复杂的操作需求,比如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 在这一阶段也许就能满足需求;如果微服务应用已经达到一定规模,开发工程师或运维工程师已经无法了解整个系统的全貌,那使用服务网格倒也无可厚非。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka-集群管理者(Controller)选举机制、任期(epoch)机制

Kafka概述 Kafka-集群管理者(Controller)选举机制 Kafka中的Controller是Kafka集群中的一个特殊角色,负责对整个集群进行管理和协调。Controller的主要职责包括分区分配、副本管理、Leader选举等。当当前的Controller节点失效或需要进行重新…

嵌入式实时操作系统笔记1:RTOS入门_理解简单的OS系统

今日开始学习嵌入式实时操作系统RTOS:UCOS-III实时操作系统 本次目标是入门RTOS,理解多任务系统...... 本文只是个人学习笔记,基本都是对网上资料的整合...... 目录 STM32裸机与RTOS区别: 裸机中断示例: RTOS对优先级…

Spring MVC/Web

1.Spring MVC 的介绍 Spring Web MVC是基于Servlet API构建的原始Web框架,也是Spring框架的一部分。它提供了灵活可扩展的MVC架构,方便开发者构建高性能的Web应用程序,并与 Spring 生态系统无缝集成。 2.MVC 设计模式 MVC(Model…

设计模式—23种设计模式重点 表格梳理

设计模式的核心在于提供了相关的问题的解决方案,使得人们可以更加简单方便的复用成功的设计和体系结构。 按照设计模式的目的可以分为三大类。创建型模式与对象的创建有关;结构型模式处理类或对象的组合;行为型模式对类或对象怎样交互和怎样…

研发机构大数据迁移如何保障敏感数据不泄露

随着云计算和大数据技术的飞速进步,越来越多的企业正试图通过数据迁移来提升IT基础设施的效率,减少成本,并增强业务的灵活性。但是,这一过程并非没有它的挑战,尤其是在数据安全方面。数据在转移过程中可能会遭遇黑客攻…

解决深度确定问题:使用不相交集合森林

解决深度确定问题:使用不相交集合森林 引言不相交集合森林(DSF)基础按秩合并与路径压缩深度确定问题的解决方案实现MAKE-TREE修改FIND-SET实现FIND-DEPTH实现GRAFT分析最坏情况运行时间结论参考文献 引言 在计算机科学中,树结构是…

时空扭曲:重温相对论的终极挑战,探寻真理的脚步

大家都知道,相对论是爱因斯坦提出的划时代理论,为人类认知时空和引力做出了革命性贡献。但这个理论真的万无一失吗?近日,一项新研究提出了测试时间扭曲的新方法,或许能让我们重新审视相对论在宇宙大尺度上的适用性。 时…

HTML5好看的通用网站模板源码

文章目录 1.设计来源1.1 主界面1.2 模板菜单1 界面1.3 模板菜单2 界面1.4 模板菜单3 界面1.5 下拉菜单1 界面1.6 下拉菜单2 界面1.7 模板菜单4 界面1.8 模板菜单5 界面1.9 界面底部 2.效果和源码2.1 动态效果2.2 源码目录2.3 源代码 源码下载 作者:xcLeigh 文章地址…

Python 造数据神器Faker

大家好,在编写代码过程中,我们经常需要一些假数据来进行测试或者演示。手动创建这些数据不仅耗时,而且容易出错。幸运的是,Python有一个非常有用的库叫做Faker,它可以生成各种类型的假数据,从名字、地址到公…

day 38 435.无重叠区间 763.划分字母区间 56. 合并区间 738.单调递增的数字 968.监控二叉树

435.无重叠区间 思路 为了使区间尽可能的重叠所以排序来使区间尽量的重叠,使用左边界排序来统计重叠区间的个数与452. 用最少数量的箭引爆气球恰好相反。 代码 class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals,(a,…

如何在cPanel面板中开启盗链保护

本周有一个客户,购买Hostease的主机, 客户购买的是Linux虚拟主机,带cPanel面板的。询问我们的在线客服,如何可以防止他的网站上的图片不被盗用。cPanel的盗链保护功能可以帮助客户防止图片被盗链。 盗链(Hotlinking&a…

呆马科技----构建智能可信的踏勘云平台

近年来,随着信息技术的快速发展,各个行业都在积极探索信息化的路径,以提升工作效率和服务质量。智慧踏勘云平台是基于区块链和大数据技术构建的全流程智慧可信踏勘解决平台。平台集远程视频、数据显示、工作调度、过程记录为一体,…

有容量限制的车辆路径规划问题(Capacitated Vehicle Routing Problem)

在看matlab的时候发现了这篇文章https://www.frontiersin.org/articles/10.3389/fict.2019.00013/full 仔细阅读一下。(英语渣渣,自学用) The Capacitated Vehicle Routing Problem (CVRP) is an NP-optimization problem (NPO) that has been of great interest …

图像处理之边缘检测(C++)

图像处理之边缘检测(C) 文章目录 图像处理之边缘检测(C)前言一、Roberts算子1.原理2.代码实现 二、Sobel算子1.原理2.代码实现 三、Prewitt算子1.原理2.代码实现 四、Laplacian算子1.原理2.代码实现 五、LOG算子1.原理2.代码实现 …

完全匹配企业需求的替代FTP升级软件怎么找

企业在处理数据传输时,效率和安全性是关键。尽管传统的FTP曾被广泛采用,但因其传输慢、安全性不足和难以管理等问题,已不再满足现代企业的需求。许多企业正在寻找能够满足其需求的FTP替代方案,但市场上选择众多,找到合…

Python01:初入Python(Mac)

Python环境准备 下载Python:官网https://www.python.org/ 下载PyCharm:官网https://www.jetbrains.com/pycharm/download Python与PyCharm的关系 Python(解释器):机器语言—>翻译人员–>翻译成电脑能读懂的 PyC…

STM32应用开发进阶--SPI总线(7脚OLED中景园ss1306+HAL库_硬件SPI/软件模拟SPI)

实现目标 1、掌握SPI总线基础知识; 2、会使用软件模拟SPI总线和STM32硬件SPI总线; 3、 学会STM32CubeMX软件关于SPI的配置; 4、掌握OLED显示屏驱动; 5、具体目标:(1)用STM32硬件SPI驱动OLED显示“你好…

抽烟行为检测:从传统巡查到智能算法

在当前人工智能和计算机视觉技术的迅猛发展下,基于视觉分析的抽烟行为检测算法成为一种高效的技术手段。此类算法通常依赖于深度学习模型,特别是卷积神经网络(CNN),通过对摄像头捕捉的视频流进行实时分析,能…

在旧版 Nginx 官方 Dockerfile 上集成第三方模块的探索

问题背景 线上生产环境用的 nginx 1.21, 然后由于新功能引入的一个问题,需要使用第三方模块 ngx_http_subs_filter_module,目的是使用正则表达式来移除响应结果中的某些数据。 由于这个客户的环境非常重要,组内的大哥们也不敢随便升级 ngin…

网络安全、信息安全、数据安全的定义与区别

信息安全 信息安全是指信息的保密性、完整性、可用性和真实性的保持。从定义角度来说,信息安全没有严格标准定义,但从信息安全涉及的内容出发,信息安全确保信息存储或传输中的信息,不被他人有意或无意的窃取与破坏。这里的“信息”…