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

news2024/11/24 15:40:58

目录

一、概述

二、 设计

三、服务网格

四、总结


一、概述

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

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

服务网格不仅描述了这个应用的网络,而且还描述了分布式应用程序组件之间的交互,所有在该应用之间传递的数据都会由服务网格来接管。这意味着它能管控流量,控制路由……如果仅仅只是这些倒是与传统的网关基础设施没什么区别。但微服务体系结构通常还有更复杂的操作需求,比如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.coloradmin.cn/o/1689883.html

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

相关文章

Big Demo Day第十三期活动即将启幕,Web3创新项目精彩纷呈,PEPE大奖等你抽取

5月28号在香港数码港 Big Demo Day第十三期 活动即将拉开帷幕,活动将汇集众多Web3领域的创新项目,为参会者带来一场科技与智慧交融的盛宴。在这里,你不仅能深入了解区块链、AI等前沿技术的最新应用,还能有机会赢取丰厚的PEPE大奖。…

智慧校园为高校带来哪些价值

在21世纪的教育图景中,"智慧"不再仅仅是一个科技名词,它已成为衡量教育现代化水平的重要标志。智慧校园,这一融合了物联网、大数据、云计算等先进技术的教育新形态,正逐步成为高校转型升级的关键驱动力。本文将从多个维…

osgearth 3.5 vs 2019编译

下载源码 git clone --recurse-submodules https://github.com/gwaldron/osgearth.git 修改配置文件 主要是修改bootstrap_vcpkg.bat,一处是vs的版本,第二处是-DCMAKE_BUILD_TYPERELEASE 构建 执行bootstrap_vcpkg.bat vs中生成安装 vs2019打开bu…

知了传课Flask学习(持续更新)

一、基础内容 1.Flask快速应用 pip install flask from flask import Flaskapp Flask(__name__)app.route(/) def index():return Hello worldif __name__ __main__:app.run() 2.debug、host、port配置 from flask import Flask,requestapp Flask(__name__)app.route(/) d…

免费,Python蓝桥杯等级考试真题--第11级(含答案解析和代码)

Python蓝桥杯等级考试真题–第11级 一、 选择题 答案: 解析:range取首不取尾,即产生了数1234,list()函数可以把产生的数1234转化为列表,故答案为A。 答案:B 解析:sort&a…

如何一键生成多个文本二维码?excel表格批量生码的方法

现在很多人会将文本信息做成二维码来展示,当有同类型内容生成大量二维码时,可以使用将文本导入excel表格的方式,将表格中的每条数据批量生成二维码,可以有效提升二维码制作的速度和效率。下面就让小编来将具体的操作步骤分享给大家…

计算机组成结构—中断和异常

一、基本概念和分类 计算机在执行程序的过程中,有时会遇到一些异常情况或者特殊请求;这时就需要计算机暂停正在运行的程序,转而先去处理这些异常或特殊请求,处理结束之后再返回程序的断点处继续执行。这种处理方式就被称为 “中断…

USB数据恢复软件:轻松找回U盘重要数据!

USB数据丢失的原因 USB数据丢失有一些常见原因,了解这些原因有利于恢复数据。 文件意外删除病毒攻击软件错误未安全弹出USB设备格式化USB设备 顺便一提,如果你通过快捷键“Ctrl D”删除了数据,那你可以从回收站中还原它们。如果你永久删除…

改进rust代码的35种具体方法-类型(十八)-不要惊慌

上一篇文章 它看起来非常复杂,这就是为什么它贴合的塑料盖上用大号友好字母印上“不要恐慌”的原因之一。——道格拉斯亚当斯 此项目的标题将更准确地描述为更喜欢返回Result而不是使用panic!(但不要惊慌更吸引人)。 Rust的panic机制主要是为…

轧神仙,沾福气!李良济中医药惠民生,为苏城市民送健康!

5月19-22日,苏州人迎来了自己的狂欢节——第六届江南文化艺术国际旅游节“轧神仙”系列活动,石路商圈人头涌动,喧闹非凡。 相传农历的四月十四日是“八仙”之一吕洞宾的诞辰,吕洞宾此日化为乞丐、小贩,混迹苏州阊门福济…

Gradle常见问题及总结

使用android studio开发项目,难免遇到gradle相关的错误,在此总结。 gradle插件与gradle home版本关系错误 参考更新 Gradle Gradle下载太慢 Index of /gradle/ (tencent.com) 是国内下载地址,手动下载对应版本即可 缓存不刷新 问题描述 maven发布…

电影推荐|基于SSM+vue的电影推荐系统的设计与实现(源码+数据库+文档)

电影推荐系统 目录 基于SSM+vue的电影推荐系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍&#…

OneAPI接入本地大模型+FastGPT调用本地大模型

将Ollama下载的本地大模型配置到OneAPI中,并通过FastGPT调用本地大模型完成对话。 OneAPI配置 新建令牌 新建渠道 FastGPT配置 配置docker-compose 配置令牌和OneAPI部署地址 配置config.json 配置调用的渠道名称和大模型名称 {"systemEnv": {&qu…

W801 实现获取天气情况

看了小安派(AiPi-Eyes 天气站)的源码,感觉用W801也可以实现。 一、部分源码 main.c #include "wm_include.h" #include "Lcd_Driver.h"void UserMain(void) {printf("\n user task \n");Lcd_Init();Lcd_Clea…

jenkins插件之xunit

分析测试工具执行的结果,并图形化,比如phpunit,phpstan,可分析junit格式的结果 安装jenkins插件 搜索xunit并安装 项目配置 配置 - Build Steps 您的项目 - 配置 - Build Steps, 新增 Run with timeout 超时时间根据实际情况配置 Build…

架构二。。

1、CAP 只能3选2 1)一致性(Consistency) 客户每次读都是返回最新的写操作结果 2)可用性(Availability) 非故障节点在合理的时间内返回合理的响应 3)分区容忍性(Partition Tolerance…

零基础代码随想录【Day42】|| 1049. 最后一块石头的重量 II,494. 目标和,474.一和零

目录 DAY42 1049.最后一块石头的重量II 解题思路&代码 494.目标和 解题思路&代码 474.一和零 解题思路&代码 DAY42 1049.最后一块石头的重量II 力扣题目链接(opens new window) 题目难度:中等 有一堆石头,每块石头的重量都是正整…

第七步 实现打印函数

文章目录 前言一、如何设计我们的打印函数?二、实践检验! 查看系列文章点这里: 操作系统真象还原 前言 现在接力棒意见交到内核手中啦,只不过我们的内核现在可谓是一穷二白啥都没有,为了让我们设计的内核能被看见被使用…

fyne网格包裹布局

fyne网格包裹布局 与之前的网格布局一样,网格环绕布局以网格模式创建元素排列。但是,此网格没有固定数量的列,而是为每个单元格使用固定大小,然后将内容流到显示项目所需的行数。 layout.NewGridWrapLayout(size) 您可以使用其中…

Mac维护神器CleanMyMac X成为你的苹果电脑得力助手

在数字化时代,Mac电脑已成为众多用户的首选。然而,随着频繁的使用和数据量的日益增长,许多Mac用户面临着系统杂乱、存储空间不足以及隐私保护等问题。幸运的是,"CleanMyMac X"这款优化和清理工具应运而生,它…