Service Mesh微服务架构的崛起

Stella981
• 阅读 545

SAMIR BEHARA

本文将解释Service Mesh相关概念,为什么云原生应用需要它,以及这项技术被社区热烈拥抱、积极采用的原因。

毫不夸张地说,微服务已经席卷了整个软件行业。从Monolith过渡到微服务架构,可以让我们频繁、独立而可靠地部署应用。

然而,在微服务架构中,一切都不是绿色的,它必须处理在设计分布式系统时遇到的相同问题。

然而,微服务架构不是万能的,在设计分布式系统时会遇到很多有待解决的问题。说到这里,我们不妨首先回顾一下关于分布式计算的8大谬误——

  • 网络是可靠的(The Network is Reliable)
  • 延迟为零(Latency is Zero)
  • 带宽是无限的(Bandwidth is Infinite)
  • 网络是安全的(The Network is Secure)
  • 拓扑不会改变(Topology does not Change)
  • 有一名管理员(There is one Administrator)
  • 传输成本为零(Transport Cost is Zero)
  • 网络是同质的(The Network is Homogenous)

在微服务体系结构中,对于网络的依赖带来了可靠性问题。随着服务数量的增加,我们必须处理它们之间的交互,监视整个系统的健康状况,处理容错、日志记录,处理多个故障点等等。每个微服务都需要有这些共同的功能,以便服务通信是平滑和可靠的。但是,如果你要处理几十上百个微服务,操作难度光是听起来就有些吓人。

什么是服务网格?

Service Mesh可以定义为在微服务体系结构中处理服务间通信的基础结构层,它减少了与微服务体系结构相关的复杂性,并提供了许多治理功能,如 -

  • 负载均衡(Load Balancing)
  • 服务发现(Service Discovery)
  • 健康检查(Health Check)
  • 身份验证(Authentication)
  • 流量管理和路由(Traffic Management & Routing)
  • 断路和故障转移(Circuit Breaking and Failover Policy)
  • 安全(Security)
  • 监控(Metrics & Telemetry)
  • 故障注入(Fault Injection)

为什么需要Service Mesh?

在微服务架构中,处理服务到服务的通信是企业IT的一大挑战。大多数时候,我们需要依赖第三方库或者组件来提供服务发现、负载均衡、断路器、监控等功能。像Netflix这样的公司,他们开发了自己的库,比如Hystrix for Circuit Breaker、Eureka for Service Discovery、Ribbon for Load balanced等,在其组织中得到了广泛的使用。

然而,这些组件需要在应用代码中进行配置,而且语言不同,实现方式策略也会有所不同。在升级这些外部组件时,我们需要更新应用、验证并部署所有改动。如此便产生了一个问题,我们的应用代码编程了业务和这些附加配置混合体。这种紧密耦合增加了整个应用的复杂性——开发人员现在还需要了解这些组件是如何配置的,以便在遇到任何问题时能够排除故障。

Service Mesh适时出现,将复杂性从应用中分离了出来,并将其放入服务代理(service proxy)代为处理。这些服务代理提供了如流量控制、断路、服务发现、身份验证、监控、安全性等等功能特性。那么对于应用来说,只需要关心业务功能的实现即可。

假设在我们的微服务体系结构中,您有5个服务相互通信。与其在每个微服务中构建配置、路由、遥测、日志记录、断路等常见的必要功能,不如将其抽象为一个单独的组件——这里称为“服务代理”(service proxy)。

随着Service Mesh的引入,责任的划分变得清晰,开发人员的生活也更加轻松——如果存在问题,开发人员可以根据应用程序或网络相关的原因,轻松地确定根源。

Service Mesh是如何实现的?

要实现Service Mesh,可以将代理与服务一起部署,该模式被称为sidecar。

Sidecars抽象了应用程序的复杂性,处理了诸如服务发现、流量管理、负载平衡、线路中断等功能。

Lyft的Envoy是目前非常流行的云原生应用开源代理。特使在每个服务旁运行,并以平台无关的方式提供必要的特性。所有到我们的服务的流量都通过特使代理。

而Istio是一个连接、管理和保护微服务的开放平台。它在Kubernetes社区非常流行,并被广泛采用。

在这一点上,Istio是服务网格的最佳实现之一,它使我们能够在不深入了解底层基础设施的情况下部署微服务。

开源PaaS Rainbond在v3.6.0版本中加入了Service Mesh开箱即用的特性,主要特点包括业务代码无入侵、跨语言&跨协议、支持主流微服务架构、通过插件式扩展来实现治理功能等。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Stella981 Stella981
3年前
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法参考文章:(1)Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.codeprj.com%2Fblo
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这