浅谈服务治理、微服务与Service Mesh(三) Service Mesh与Serverless
作为本系列文章的第三篇(前两篇《浅谈服务治理、微服务与Service Mesh(一)Dubbo的前世今生》,《浅谈服务治理、微服务与Service Mesh(二) Spring Cloud从入门到精通到放弃》),本文主要为大家介绍一下当前非常火热的Service Mesh概念,最后也会简单介绍一下目前同样热门的Serverless概念。Service Mesh目前比较多的翻译为“服务网格”,也有翻译为“服务啮合”。很多人将之称为下一代微服务,或直接称之为微服务2.0。前两篇文章中介绍的Dubbo和Spring Cloud实际上距离真正意义上的微服务还有一定的距离,本文将带你了解在微服务2.0时代,Service Mesh方式是如何实现下一代微服务标准的,并介绍当前比较常见的几种Service Mesh实现方案。
微服务1.0时代
Dubbo本质上只能算是一个服务治理框架,而不能算是一个微服务框架。虽然在未来的Dubbo 3.0中会提供对Spring Cloud,以及对Service Mesh的支持,但是单凭Dubbo仍然是无法搭建一个完整的微服务体系结构。
Spring Cloud则是通过集成众多的组件的形式实现了相对完整的微服务技术栈,但是Spring Cloud的实现方式代码侵入性较强,而且只支持Java语言,无法支持其他语言开发的系统。Spring Cloud全家桶包括的内容较多,学习成本也相对较高,对老系统而言,框架升级或者替换的成本较高,导致一些开发团队不愿意担负技术和时间上的风险与成本,使得微服务方案在落地时遇到了诸多的困难。
总结一下,微服务1.0时代的主要问题主要包括如下三方面:
- 技术门槛高:开发团队在实施微服务的过程中,除了基础的服务发现、配置中心和鉴权管理之外,团队在服务治理层面面临了诸多的挑战,包括负载均衡、熔断降级、灰度发布、故障切换、分布式跟踪等,这对开发团队提出了非常高的技术要求。
- 多语言支持不足:对于互联网公司,尤其是快速发展的互联网创业公司,多语言的技术栈、跨语言的服务调用也是常态,但目前开源社区上并没有一套统一的、跨语言的微服务技术栈,而跨语言调用恰恰是微服务概念诞生之初的要实现的一个重要特性之一。
- 代码侵入性强:Spring Cloud、Dubbo等主流的微服务框架都对业务代码有一定的侵入性,技术升级替换成本高,导致开发团队配合意愿低,微服务落地困难。
微服务2.0时代
为了解决微服务1.0时代的诸多问题,Service Mesh概念开始走入了开发者的视线中。
在介绍Service Mesh概念之前,我们先来了解一下Sidecar。Sidecar是以第一次世界大战时活跃在战场上的军用边斗车命名(也是我们在抗日神剧中最常见的道具之一)。Sidecar是Service Mesh中的重要组成部分,Sidecar在软件系统架构中特指边斗车模式,这个模式的精髓在于实现了数据面(业务逻辑)和控制面的解耦。
在Service Mesh架构中,给每一个微服务实例部署一个Sidecar Proxy。该Sidecar Proxy负责接管对应服务的入流量和出流量,并将微服务架构中的服务订阅、服务发现、熔断、限流、降级、分布式跟踪等功能从服务中抽离到该Proxy中。
Sidecar以一个独立的进程启动,可以每台宿主机共用同一个Sidecar进程,也可以每个应用独占一个Sidecar进程。所有的服务治理功能,都由Sidecar接管,应用的对外访问仅需要访问Sidecar即可。当该Sidecar在微服务中大量部署时,这些Sidecar节点自然就形成了一个服务网格。
微服务的概念在2014年3月由Martin Fowler首次提出,而Service Mesh的概念则是在2016年左右提出,Service Mesh至今也经历了第二代的发展。
第一代Service Mesh的代表为Linkerd和Envoy。Linkerd基于Twitter的Fingle,使用Scala编写,是业界第一个开源的Service Mesh方案,在长期的实际生产环境中获得验证。Envoy底层基于C++,性能上优于使用Scala的Linkerd。同时,Envoy社区成熟度较高,商用稳定版本面世时间也较长。这两个开源实现都是以Sidecar为核心,绝大部分关注点都是如何做好Proxy,并完成一些通用控制面的功能。但是当你在容器中大量部署Sidecar以后,如何管理和控制这些Sidecar本身就是一个不小的挑战。
第二代Service Mesh主要改进集中在更加强大的控制面功能(与之对应的Sidecar Proxy被称之为数据面),典型代表有Istio和Conduit。Istio是Google、IBM和Lyft合作的开源项目,是目前最主流的Service Mesh方案,也是事实上的第二代Service Mesh标准。在Istio中,直接把Envoy作为Sidecar。除了Sidecar,Istio中的控制面组件都是使用Go语言编写。
Istio简介
根据Istio官方文档的介绍,Istio在服务网络中主要提供了以下关键功能:
- 流量管理:控制服务之间的流量和API调用的流向,使得调用更可靠,并使网络在恶劣情况下更加健壮。
- 可观察性:了解服务之间的依赖关系,以及它们之间流量的本质和流向,从而提供快速识别问题的能力。
- 策略执行:将组织策略应用于服务之间的互动,确保访问策略得以执行,资源在消费者之间良好分配。策略的更改是通过配置网格而不是修改应用程序代码。
- 服务身份和安全:为网格中的服务提供可验证身份,并提供保护服务流量的能力,使其可以在不同可信度的网络上流转。
- 平台支持:Istio旨在在各种环境中运行,包括跨云、Kubernetes、Mesos等。最初专注于Kubernetes,但很快将支持其他环境。
- 集成和定制:策略执行组件可以扩展和定制,以便与现有的ACL、日志、监控、配额、审核等解决方案集成。
Istio针对可扩展性进行了设计,以满足不同的部署需要。这些功能极大的减少了应用程序代码、底层平台和策略之间的耦合,使得微服务更加容易实现。
下图为Istio的架构设计图,主要包括了Envoy、Pilot、Mixer和Istio-Auth等。
Envoy: 扮演Sidecar的功能,协调服务网格中所有服务的出入站流量,并提供服务发现、负载均衡、限流熔断等能力,还可以收集与流量相关的性能指标。
Pilot: 负责部署在Service Mesh中的Envoy实例的生命周期管理。本质上是负责流量管理和控制,将流量和基础设施扩展解耦,这是Istio的核心。可以把Pilot看做是管理Sidecar的Sidecar, 但是这个特殊的Sidacar并不承载任何业务流量。Pilot让运维人员通过Pilot指定它们希望流量遵循什么规则,而不是哪些特定的pod/VM应该接收流量。有了Pilot这个组件,我们可以非常容易的实现 A/B 测试和金丝雀Canary测试。
Mixer: Mixer在应用程序代码和基础架构后端之间提供通用中介层。它的设计将策略决策移出应用层,用运维人员能够控制的配置取而代之。应用程序代码不再将应用程序代码与特定后端集成在一起,而是与Mixer进行相当简单的集成,然后Mixer负责与后端系统连接。Mixer可以认为是其他后端基础设施(如数据库、监控、日志、配额等)的Sidecar Proxy。
Istio-Auth: 提供强大的服务间认证和终端用户认证,使用交互TLS,内置身份和证书管理。可以升级服务网格中的未加密流量,并为运维人员提供基于服务身份而不是网络控制来执行策略的能力。Istio的未来版本将增加细粒度的访问控制和审计,以使用各种访问控制机制(包括基于属性和角色的访问控制以及授权钩子)来控制和监视访问服务、API或资源的访问者。
Istio的设计理念先进,功能也比较强大,加之Google、IBM的影响力让Istio迅速传播,让广大开发者认识到了Istio项目在Service Mesh领域的重要性。但是Istio目前版本也存在了一些不足:
- 目前的Istio大部分能力与Kubernetes是强关联的。而我们在构建微服务的时候往往是希望服务层与容器层是解耦的,服务层在设计上需要能够对接多种容器层平台。
- Istio至今未有稳定版本,截至本文编写时为止,Istio的最新版本为0.8版本,预计在2018年内会发布1.0版本。
Conduit简介
我们再来看一下Conduit的实现,下图是Conduit的架构设计图,其中重点由Conduit Data Plane和Conduit Control Plane两部分组成:
Conduit各方面的设计理念与Istio非常类似,作者使用Rust语言重新编写了Sidecar, 叫做Conduit Data Plane, 控制面则由Go语言编写的Conduit Control Plane接管。从Conduit的架构看,作者号称Conduit吸取了很多Linkerd的教训,比Linkerd更快、更轻、更简单,控制面功能更强。与Istio比较,Conduit的架构一方面比较简单,另一方面对于要解决的问题足够聚焦。
Serverless简介
Serverless被翻译为“无服务器架构”,这个概念在2012年时便已经存在,比微服务和Service Mesh的概念出现都要早,但是直到微服务概念大红大紫之后,Serverless才重新又被人们所关注。
Serverless(无服务器架构)并不意味着没有任何服务器去运行代码,Serverless是无需管理服务器,只需要关注代码,而提供者将处理其余部分工作。“无服务器架构”也可以指部分服务器端逻辑依然由应用程序开发者来编写的应用程序,但与传统架构的不同之处在于,这些逻辑运行在完全由第三方管理,由事件触发的无状态(Stateless)暂存于计算容器内。
对于开发者来说,Serverless架构可以将其服务器端应用程序分解成多个执行不同任务的函数,整个应用分为几个独立、松散耦合的组件,这些组件可以在任何规模上运行。
下图为一种常见的Serverless架构图,所有的服务都以FaaS(函数即服务)的方式对外进行提供。在语言和环境方面,FaaS 函数就是常规的应用程序,例如使用JavaScript、Python以及 Java等语言实现。
Serverless架构优势
缩短交付时间:Serverless架构允许开发人员在极短时间内(几小时、几天)交付新的应用程序,而不是像以前一样需要几个星期或几个月。在新的应用程序中,依赖于第三方API提供服务的例子很多,如认证(OAuth)、社交、地图、人工智能等。
增强可伸缩性:所有人都希望自己开发的应用能够快速获取大量的新增用户,但是当活跃用户快速增长的时候,服务器的压力也会激增。使用Serverless架构的体系不再有上述担忧,可以及时、灵活进行扩展来应对快速增长的活跃用户带来的访问压力。
降低成本:Serverless架构模式可以降低计算能力和人力资源方面的成本,如果不需要服务器,就不用花费时间重新造轮子、风险监测、图像处理,以及基础设施管理,操作成本会直线下降。
改善用户体验:用户通常不太关心基础设施,而更注重于功能和用户体验。Serverless架构允许团队将资源集中在用户体验上。
减少延迟及优化地理位置信息:应用规模能力取决于三个方面:用户数量、所在位置及网络延迟。当应用要面向全国甚至全球用户的时候,通常会产生较高的延迟,从而降低用户体验。在Serverless架构下,供应商在每个用户附近都有节点,大幅度降低了访问延迟,因此所有用户的体验都可以得到提升。
总结
对于大规模部署微服务,内部服务异构程度高的场景,使用Service Mesh方案是一个不错的选择。Service Mesh实现了业务逻辑和控制的解耦,但是也带来了额外的开销,由于网络中多了一跳,增加了性能的损耗和访问的延迟。同时,由于每个服务都需要部署Sidecar, 这也会使本来就具有一定复杂度的分布式系统变得更加复杂。尤其是在实施初期,对Service Mesh的管理和运维会是一个棘手的问题。因此,当我们选择使用Service Mesh架构的时候,需要对具体的Service Mesh实现方案(例如:Istio)做好充分的技术准备和经验积累工作,方能确保方案的顺利实施。
在微服务与容器技术火热之后,Serverless(无服务器架构)成为新的热点,无服务器云函数可以让用户无需关心服务器的部署运营,只需开发最核心的业务逻辑,即可实现上线运营,具备分布容灾能力,可以依据负载自动扩缩容,并按照实际调用次数与时长计费。
使用Serverless架构可以免除所有运维性操作,开发人员可以更加专注于核心业务的开发,实现快速上线和迭代,把握业务发展的节奏。Serverless架构可以认为是对微服务和容器化的一种补充,为用户提供了一种新的选择,来应对复杂多变的需求,尤其适合快速发展的初创型公司。
参考链接
http://www.servicemesh.cn/
https://istio.io/docs/
https://mp.weixin.qq.com/s/ANoLMEqCPkj9rhWKCmcT7Q
https://mp.weixin.qq.com/s/-lMngtcqkS5CrfVuDLjfZA
https://mp.weixin.qq.com/s/WHdbBjlLf6QMCODyqB_FvQ
https://mp.weixin.qq.com/s/0mjjjtpxv8mm0raqsbAekA
https://mp.weixin.qq.com/s/WaBnj69tqSWASvzvcVJBRQ
转载自 易商阜极 微信公众号。
浅谈服务治理、微服务与Service Mesh(三) Service Mesh与Serverless的更多相关文章
- [转]系统架构演变--集中式架构-垂直拆分-分布式服务-SOA(服务治理)-微服务
一.系统架构演变 1.1. 集中式架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本.此时,用于简化增删改查工作量的数据访问框架(ORM)是影响项目开发的关键. 存在的 ...
- 腾讯高性能RPC开发框架Tars实现服务治理(微服务)
Github:https://github.com/Tencent/Tars 1. 介绍 Tars是基于名字服务使用Tars协议的高性能RPC开发框架,同时配套一体化的服务治理平台,帮助个人或者企业快 ...
- 使用Istio治理微服务入门
近两年微服务架构流行,主流互联网厂商内部都已经微服务化,初创企业虽然技术积淀不行,但也通过各种开源工具拥抱微服务.再加上容器技术赋能,Kubernetes又添了一把火,微服务架构已然成为当前软件架构设 ...
- 浅谈Eclipse调用Tomcat服务的原理
浅谈Eclipse调用Tomcat服务的原理 转:http://www.thinksaas.cn/group/topic/341645/ 转:http://www.173it.cn/Html/?581 ...
- 5.如何基于 dubbo 进行服务治理、服务降级、失败重试以及超时重试?
作者:中华石杉 面试题 如何基于 dubbo 进行服务治理.服务降级.失败重试以及超时重试? 面试官心理分析 服务治理,这个问题如果问你,其实就是看看你有没有服务治理的思想,因为这个是做过复杂微服务的 ...
- SpringCloud学习笔记(二):微服务概述、微服务和微服务架构、微服务优缺点、微服务技术栈有哪些、SpringCloud是什么
从技术维度理解: 微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底 地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事, 从技术角度看就是一种小而独立的处理过程,类 ...
- CODING DevOps 系列第五课:微服务测试——微服务下展开体系化的微服务测试
微服务测试的痛点与挑战 这张图可以形象地展示单体服务和微服务的对比,单体应用就像左边巨大的集装箱,软件模块和应用都包括其中:而微服务就像是由一个小集装箱组成,微小的服务组成一个庞大.完整的系统.单体服 ...
- Chris Richardson微服务翻译:重构单体服务为微服务
Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服务部署 ...
- Chris Richardson微服务翻译:构建微服务之微服务架构的进程通讯
Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯(本文) 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服 ...
- 浅谈SpringCloud (二) Eureka服务发现组件
上面学习到了如何由一个程序访问另一个程序,那么如果使用SpringCloud来进行访问,该如何访问呐? 可以借助Eureka服务发现组件进行访问. 可以借助官方文档:https://spring.io ...
随机推荐
- 初步了解Windows7下部署Sonar
1.准备工具: (1)Sonar 8.3版本. (2)PostgresSql 11版本. (3)Java 11. 详细获取地址可参考文章https://www.pianshen.com/article ...
- Appium 概括与环境安装
Appium 是什么, 有什么用 Appium 用途和特点 appium 是一个移动 app 自动化工具 手机APP自动化有什么用? 自动化完成一些重要性的任务 比如微信客服机器人 爬虫 就是通过自动 ...
- JavaWeb网上图书商城完整项目--day02-5.ajax校验功能之服务器端三层实现
regist.jsp页面中有异步请求服务器来对表单进行校验: l 校验登录名是否已注册过: l 校验Email是否已注册过: l 校验验证码是否正确. 这说明在UserServlet中需要提供相 ...
- java android 序列号serializable和parcelable
why 为什么要了解序列化?—— 进行Android开发的时候,无法将对象的引用传给Activities或者Fragments,我们需要将这些对象放到一个Intent或者Bundle里面,然后再传递. ...
- vue-cli按装 和vue创建项目
安装 创建
- 一条update SQL语句是如何执行的
一条更新语句的执行过程和查询语句类似,更新的流程涉及两个日志:redo log(重做日志)和binlog(归档日志).比如我们要将ID(主键)=2这一行的值加(c:字段)1,SQL语句如下: upda ...
- Java笔试面试总结—try、catch、finally语句中有return 的各类情况
前言 之前在刷笔试题和面试的时候经常会遇到或者被问到 try-catch-finally 语法块的执行顺序等问题,今天就抽空整理了一下这个知识点,然后记录下来. 正文 本篇文章主要是通过举例的方式来阐 ...
- 小白—职场之Java基础篇
java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...
- Python实用笔记 (3)条件判断
可以执行多条语句,靠的是缩进原则,看起来也更板扎(注意冒号) age = 3 if age >= 18: print('adult') elif age >= 6: print('teen ...
- python字符串与文本操作(一)
1.一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定的 #string 对象的split()方法只适应于非常简单的字符串分割情形,它并不允许有 多个分隔符或者是分隔符周围不确定的空 ...