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

目录

一、概述

二、 设计

三、服务网格

四、总结


一、概述

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

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

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

相关文章

v-rep--lua接口和c++接口的关联

我们在coppeliasim中调用的lua脚本函数sim.xxxxx()的执行规律有两种情况: 1,要么就是在coppliasim的sim.lua中有这个lua函数的定义,直接执行这个lua函数即可。比如,sim.creatPath(); 2,要么就是这个lua接口没有lua语…

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

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

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

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

汽车标定技术(二十一)--英飞凌TC3xx的OLDA怎么玩?(2)

目录 1.概述 2.Vector提出的OLDA概念 2.1 RAM Copy 2.2 Data Trace 3.小结 1.概述 上一篇汽车标定技术(二十一)--英飞凌TC3xx的OLDA怎么玩?(1)-CSDN博客,我们讲了TC3xx

Spring MVC/Web

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

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

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

CSS实现图片浮动在底层 div 之上,而不会影响底层 div 的布局和内容

前言&#xff1a;遇到个需求&#xff0c;需要图片显示在div之上&#xff0c;但是不占用div的空间布局&#xff0c;网上的答案五花八门&#xff0c;但其实使用css就可以简单实现&#xff0c;仅以此博客作为记录 举个栗子 <div class"container"><img src&qu…

Linux 网络编程基础——网络模型

网络模型 网络模型1. OSI七层模型1. 物理层&#xff08;Physical Layer&#xff09;2. 数据链路层&#xff08;Data Link Layer&#xff09;3. 网络层&#xff08;Network Layer&#xff09;4. 传输层&#xff08;Transport Layer&#xff09;5. 会话层&#xff08;Session Lay…

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

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

SQL的多表联查

这里我先附上两张表的数据&#xff1a; Orders 表: OrderIDCustomerID1321324NULL Customers 表: CustomerIDCustomerName1Alice2Bob3Charlie4David INNER JOIN &#x1f91d; 概念&#xff1a; INNER JOIN&#xff08;内连接&#xff09;返回两个表中匹配的记录。如果某条…

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

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

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

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

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 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址…

Python 造数据神器Faker

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

【驱动】ARM手册引脚寄存器地址(绝对物理地址)查找(以AM437x为例)

1、问题描述 在配置设备树时,经常遇到如下宏: XXX_IOPAD(pa, val)实际定义如下: DRA7XX_CORE_IOPAD(pa, val) AM33XX_IOPAD(pa, val) DM816X_IOPAD(pa, val) DM814X_IOPAD(pa, val) AM4372_IOPAD(pa, val)一般注释中的说明如下: 原文:Macro to allow using the absol…

md5和byte64字符串加密

说明&#xff1a;最近碰到一个需求&#xff0c;网络请求&#xff0c;传递json的时候&#xff0c;必须加密&#xff0c;对字符串加密&#xff0c;然后前端去解密字符串&#xff0c;然后解析json&#xff0c;展示数据&#xff0c;可逆 step1: Md5加密方式 package com.example.…

Java技术精粹:高级面试问题与解答指南(一)

Java 面试问题及答案 问题1&#xff1a;请解释Java中的多态性&#xff0c;并给出一个例子。 答案&#xff1a; 多态性是Java中的一个重要特性&#xff0c;它允许一个引用类型可以指向多种实际类型的对象&#xff0c;并且可以通过这个引用调用实际对象的方法。多态性主要通过继…

JAVA:常见的加密算法简介

一、前言 加密算法是指将明文信息转变为密文信息的过程&#xff0c;即将信息从可读形式&#xff08;明文&#xff09;转换为加密形式&#xff08;密文&#xff09;的过程。在加密过程中&#xff0c;信息通过加密算法和加密密钥被加密处理&#xff0c;加密后的信息&#xff08;密…

【代码随想录算法训练Day17】LeetCode 110. 平衡二叉树、LeetCode 257.二叉树的所有路径、LeetCode 404.左叶子之和

Day17 二叉树第四天 LeetCode 110. 平衡二叉树【后序遍历】 平衡二叉树仍是后序遍历&#xff0c;就是获取左右子树的高度然后作差&#xff0c;如果子树就不平衡&#xff0c;那么就直接将-1向上传给父节点&#xff0c;否则该数的高度为左右子树高度的最大值1。 class Solutio…

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

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