微服务架构ServiceMesh

公司用的架构,在此找了资料作为记录复看所用:

什么是Service Mesh?

Service Mesh的概念最早是由Buoyant公司的CEO William Morgan在一篇文章里提出,他给出的服务网格的定义是:

A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application. In practice, the service mesh is typically implemented as an array of lightweight network proxies that are deployed alongside application code, without the application needing to be aware.

Service Mesh是一种新型的用于处理服务与服务之间通信的技术,尤其适用以云原生应用形式部署的服务,能够保证服务与服务之间调用的可靠性。在实际部署时,Service Mesh通常以轻量级的网络代理的方式跟应用的代码部署在一起,从而以应用无感知的方式实现服务治理。

Service Mesh以轻量级的网络代理的方式与应用的代码部署在一起,用于保证服务与服务之间调用的可靠性,这与传统的微服务架构有着本质的区别,这么做主要是出于两个原因。

1.跨语言服务调用的需要。在大多数公司内通常都存在多个业务团队,每个团队业务所采用的开发语言一般都不相同,以微博的业务为例,移动服务端的业务主要采用的是PHP语言开发,API平台的业务主要采用的是Java语言开发,移动服务端调用API平台使用的是HTTP请求,如果要进行服务化,改成RPC调用,就需要一种既支持PHP语言又支持支持Java语言的的服务化框架。

2.云原生应用服务治理的需要。在微服务越来越多开始容器化,并使用Kubernetes类似的容器平台对服务进行管理,逐步朝云原生应用的方向进化。而传统的服务治理要求在业务代码里集成服务框架的SDK,这显然与云原生应用的理念相悖,因此迫切需要一种对业务代码无侵入的适合云原生应用的服务治理方式。

在这种背景下,Buoyant公司开发的第一代Service Mesh产品Linkerd应运而生。从下图中可以看到,服务A要调用服务B,经过Linkerd来代理转发,服务A和服务B的业务代码不需要关心服务框架功能的实现。为此Linkerd需要具备负载均衡、熔断、超时重试、监控统计以及服务路由等功能。这样的话,对于跨语言服务调用来说,即使服务消费者和服务提供者采用的语言不同,也不需要集成各自语言的SDK。


(图片来源:https://linkerd.io/images/[email protected]

而对于云原生应用来说,可以在每个服务部署的实例上,都同等的部署一个Linkerd实例。比如下面这张图,服务A要想调用服务B,首先调用本地的Linkerd实例,经过本地的Linked实例转发给服务B所在节点上的Linkerd实例,最后再由服务B本地的Linkerd实例把请求转发给服务B。这样的话,所有的服务调用都得经过Linkerd进行代理转发,所有的Linkerd组合起来就像一个网格一样,这也是为什么我们把这项技术称为Service Mesh,也就是“服务网格”的原因。


(图片来源:https://buoyant.io/wp-content/uploads/2017/04/linkerd-service-mesh-diagram-1024x587.png

Service Mesh的实现原理

Service Mesh实现的关键就在于两点:一个是上面提到的轻量级的网络代理也叫SideCar,它的作用就是转发服务之间的调用;一个是基于SideCar的服务治理也被叫作Control Plane,它的作用是向SideCar发送各种指令,以完成各种服务治理功能。下面我就来详细讲解这两点是如何实现的。

1.SideCar

我们首先来看一下,在传统的微服务架构下服务调用的原理。你可以看下面这张图,服务消费者这边除了自身的业务逻辑实现外,还需要集成部分服务框架的逻辑,比如服务发现、负载均衡、熔断降级、封装调用等,而服务提供者这边除了实现服务的业务逻辑外,也要集成部分服务框架的逻辑,比如线程池、限流降级、服务注册等。

而在Service Mesh架构中,服务框架的功能都集中实现在SideCar里,并在每一个服务消费者和服务提供者的本地都部署一个SideCar,服务消费者和服务提供者只管自己的业务实现,服务消费者向本地的SideCar发起请求,本地的SideCar根据请求的路径向注册中心查询,得到服务提供者的可用节点列表后,再根据负载均衡策略选择一个服务提供者节点,并向这个节点上的SideCar转发请求,服务提供者节点上的SideCar完成流量统计、限流等功能后,再把请求转发给本地部署的服务提供者进程,从而完成一次服务请求。整个流程你可以参考下面这张图。

我们可以把服务消费者节点上的SideCar叫作正向代理,服务提供者节点上的SideCar叫作反向代理,那么Service Mesh架构的关键点就在于服务消费者发出的请求如何通过正向代理转发以及服务提供者收到的请求如何通过反向代理转发。从我的经验来看,主要有两种实现方案。

  • 基于iptables的网络拦截。这种方案请见下图,节点A上服务消费者发出的TCP请求都会被拦截,然后发送给正向代理监听的端口15001,正向代理处理完成后再把请求转发到节点B的端口9080。节点B端口9080上的所有请求都会被拦截发送给反向代理监听的端口15001,反向代理处理完后再转发给本机上服务提供者监听的端口9080。

  • 采用协议转换的方式。这种方案请见下图,节点A上的服务消费者请求直接发给正向代理监听的端口15001,正向代理处理完成后,再把请求转发到节点B上反向代理监听的端口15001,反向代理处理完成后再发送给本机上的服务提供者监听的端口9080。

可见,这两种方案最大的不同之处在于,一个是通过iptables网络拦截实现代理转发的,一个是靠直接把请求发送给代理来转发的。基于iptables网络拦截的方式,理论上会有一定的性能损耗,但它的优点是从网络层实现调用拦截,能做到完全的业务无感知,所以适合云原生应用。而直接把请求发送给代理的方式,要求代理层加入业务逻辑,才能把请求转发给对应的服务提供者监听的端口。

2.Control Plane

既然SideCar能实现服务之间的调用拦截功能,那么服务之间的所有流量都可以通过SideCar来转发,这样的话所有的SideCar就组成了一个服务网格,再通过一个统一的地方与各个SideCar交互,就能控制网格中流量的运转了,这个统一的地方就在Sevice Mesh中就被称为Control Plane。如下图所示,Control Plane的主要作用包括以下几个方面:

  • 服务发现。服务提供者会通过SideCar注册到Control Plane的注册中心,这样的话服务消费者把请求发送给SideCar后,SideCar就会查询Control Plane的注册中心来获取服务提供者节点列表。
  • 负载均衡。SideCar从Control Plane获取到服务提供者节点列表信息后,就需要按照一定的负载均衡算法从可用的节点列表中选取一个节点发起调用,可以通过Control Plane动态修改SideCar中的负载均衡配置。
  • 请求路由。SideCar从Control Plane获取的服务提供者节点列表,也可以通过Control Plane来动态改变,比如需要进行A/B测试、灰度发布或者流量切换时,就可以动态地改变请求路由。
  • 故障处理。服务之间的调用如果出现故障,就需要加以控制,通常的手段有超时重试、熔断等,这些都可以在SideCar转发请求时,通过Control Plane动态配置。
  • 安全认证。可以通过Control Plane控制一个服务可以被谁访问,以及访问哪些信息。
  • 监控上报。所有SideCar转发的请求信息,都会发送到Control Plane,再由Control Plane发送给监控系统,比如Prometheus等。
  • 日志记录。所有SideCar转发的日志信息,也会发送到Control Plane,再由Control Plane发送给日志系统,比如Stackdriver等。
  • 配额控制。可以在Control Plane里给服务的每个调用方配置最大调用次数,在SideCar转发请求给某个服务时,会审计调用是否超出服务对应的次数限制。

原文地址:https://www.cnblogs.com/zhenghongxin/p/10800849.html

时间: 2024-08-30 17:57:23

微服务架构ServiceMesh的相关文章

微服务架构技术栈选型手册¶

微服务架构技术栈选型手册 2014~2018,微服务经过三年的发展,现状如何?这是一份为让你更好使用微服务的技术站选型手册.除此之外,你还可以按需选用配套的微服务架构视频内容. 一.前言 2014 年可以认为是微服务 1.0 的元年,当年有几个标志性事件,一是 Martin Fowler 在其博客上发表了"Microservices"一文,正式提出微服务架构风格:二是 Netflix 微服务架构经过多年大规模生产验证,最终抽象落地形成一整套开源的微服务基础组件,统称 NetflixOS

用友iuap云运维平台支持基于K8s的微服务架构

什么是微服务架构? 微服务(MicroServices)架构是当前互联网业界的一个技术热点,业内各公司也都纷纷开展微服务化体系建设.微服务架构的本质,是用一些功能比较明确.业务比较精练的服务去解决更大.更实际的问题.该架构强调的一些准则:单一职责.协议轻量.进程隔离.数据分离.独立部署.按需伸缩. 什么是Kubernetes? Kubernetes是Google开源的容器集群管理系统,其提供应用部署.维护. 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能:

微服务架构

互联网保险O2O平台微服务架构设计 关于架构,笔者认为并不是越复杂越好,而是相反,简单就是硬道理也提现在这里.这也是微服务能够流行的原因,看看市场上曾经出现的服务架构:EJB.SCA.Dubbo等等,都比微服务先进,都比微服务功能完善,但它们都没有微服务这么深入民心,就是因为他们过于复杂.简单就是高科技,苹果手机据说专门有个团队研究如何能让用户更加简单的操作.大公司都是由小公司发展起来的,如果小公司在开始技术选型时感觉某个框架费时费力就不会选择,而小公司发展到大公司的过程,一般也伴随着系统不断优

深解微服务架构:从过去,到未来|架构(2015-07-15)

随着用户需求个性化.产品生命周期变短,微服务架构是未来软件软件架构朝着灵活性.扩展性.伸缩性以及高可用性发展的必然方向.同时,以Docker为代表的容器虚拟化技术的盛行,将大大降低微服务实施的成本,为微服务落地以及大规模使用提供了坚实的基础和保障. 微服务的诞生   微服务架构(Microservice Architect)是一种架构模式,它提倡将单块架构的应用划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟

.NET Core 实践:微服务架构的优点

微服务现在已经是各种互联网应用首选的云架构组件,无论是 BAT 还是 滴滴.美团 ,微服务都是重要的一环. 相对于微服务,传统应用架构有以下缺点: 1. 业务代码混杂,团队成员职责边界不清,团队协作体验不佳,开发效率低下. 传统应用架构中,各个业务模块代码都存在于同一个应用当中,各个业务模块之间交互逻辑复杂,代码统统混在一起,难免出现要去别人代码里改代码的情况 2. 代码耦合度高,日趋臃肿,难以重构,维护成本越来越高. 感受过被F12支配的恐惧吗? 3. 容错能力弱,单点故障引发全局崩溃. 4.

Spring Cloud微服务架构在互联网中应用

夜行侠老师录制的:Spring Cloud微服务架构在互联网中应用 由大象分享网出版:http://www.itjoin.org/course/detail/5934a58c0cf2159b39641f80夜行侠课程集合:http://www.xuetuwuyou.com/user/29 第1节.Springcloud介绍第2节.Eureka的使用第3节.Eureka集群第4节.restful请求第5节.restful请求负载均衡第6节.配置中心第7节.获取配置中心数据第8节.配置中心高可用第9

微服务架构(Microservice Architecture)

之前一段时间,有听部门架构说起接下来公司要使用微服务架构来研发系统,当时没怎么在意,因为是第一次听说微服务这个名词(果然无知者无畏啊):正好赶上五一假, 我自告奋勇的,接了编写微服务架构培训文档这个任务(也许因为我是文科生,文笔稍微好点).五一假期三天,基本都是在看资料,梳理思路以及编写接下来的培训文档中度过. 下面,就说说我这几天的一些收获吧:先说说资料来源吧:有架构给我的一些资料,以及自己百度和论坛.社区找来的一些资料,权当做一个总结式的简介... 目录如下: 一.微服务架构介绍 二.出现和

微服务架构——不是免费的午餐

当我開始了解<微服务架构>的时候,我发现里面的中文文章是相当的少,于是開始试着翻译一些文章,比方这一篇<微服务--不是免费的午餐>.这篇文章是在某次讨论结束后听到的,和之前相似的是这样的差别有点相似于之前说的微内核与宏内核的差别. 译文例如以下: 文章是由Contino公司的CTO,Benjamin Wootton写的.Contino是一家在伦敦的咨询公司,专注于DevOps和持续支付. Microservices are a style of software architect

微服务架构的设计和实践-培训感悟

这两天(4月8号,9号)我有幸参加了极客邦的培训课程-微服务架构的设计和实践,能够面对面倾听58架构师-孙玄的亲身授课,个人也是感到非常的荣幸.两天的时间,来回于广州和深圳,虽然不能说自己的技术有了一个质的提升,但至少也是一次很好的交流体现,这一趟不白走! 身为一个技术小白(虽然个人也有四年的开发经验,但大多的技术只是知其然而不知其所以然,而且接触面太狭隘),此次学习最明显的感受是,如果你只会写软件代码,了解与某种语言相关的语法,框架以及架构包括技术,那你肯定会"死的很惨".作为软件行