第八章 跨语言服务治理方案 Service Mesh
8.1 Service Mesh 概述
新兴的下一代微服务架构,被称为下一代微服务,同时也是云原生技术栈的代表技术之一。
8.1.1 Service Mesh的由来
从2016年到2018年,service mesh经历了从无到有的过程
8.1.2 Service Mesh的定义
服务网格是一个基础设施层,用于处理服务间通信。现代云原生应用有着复杂的服务拓扑结构,服务网格负责在这些拓扑结构中实现请求的可靠传递。实践中,服务网格通常被实现为一组轻量级网络代理,它们与应用程序部署在一起,对应用程序透明。
8.1.3 Service Mesh详解
- 单个服务调用:应用实例和Service mesh 代理实例是两个独立的进程,它们之间的通信时远程调用,而不是代码层面的方法调用。客户端的请求会先到Service Mesh代理实例,代理实例表现为Sidecar,完成服务发现、负载均衡等基本功能,熔断、限流、重试等容错功能,路由功能,以及认证、授权、加密等,最后将请求发送给应用服务。
- 多个服务调用:Service mesh负责所有服务间请求转发,服务只负责发送和处理请求,不必再负责传递请求的具体逻辑。
- 大量服务调用:当系统存在大量服务时,服务间调用关系表现为网状。Sidecar之间的服务调用关系形成一个网络,这就是Service Mesh(服务网格)名字的由来。
- Service Mesh定义回顾:抽象:Service mesh是一个抽象层,负责王完成服务间通信。并且将这些功能从应用中剥离出来,形成一个单独的通信层,并将其下沉到基础设施层。 功能:请求的可靠传递。 部署:轻量级网络代理,以sidecar的模式和应用程序一对一部署,两者之间的通信时远程调用。 透明:Service mesh对应用程序是透明的。Service Mesh可以独立部署升级、扩展功能、修复缺陷,而不必改动应用程序。
8.2 Service Mesh演进历程
下面讲述Service Mesh技术的起源、发展、以及一步一步的演进历程。
8.2.1 远古时代的案例
在应用代码中处理网络通信细节,比如数据包顺序、流量控制等。后来TCP/IP协议栈负责这些功能。
8.2.2 微服务时代的现状
服务发现、负载均衡、熔断、重试。
8.2.3 侵入式框架的痛点
Spring Cloud和Dubbo这些传统的微服务治理框架都是侵入式的微服务框架。
痛点1:门槛高。
痛点2:功能不全。 Istio的路由功能比Spring Cloud强大。
痛点3: 无法跨语言。微服务有跨语言的优点。
痛点4:升级困难。
8.2.4 解决问题的思路
8.2.5 Proxy模式的探索
为了解决客户端和服务端直接耦合的问题,尝试使用Proxy模式来隔离客户端和服务端,典型的如Nginx、HAProxy、Apache等HTTP反向代理。Proxy转发所有流量,而Proxy需要为代理的流量实现基本功能,如负载均衡。
8.2.6 Sidecar模式的出现
SiderCar在Proxy上发展起来,功能更加全面。
8.2.7 第一代的service Mesh
Linkerd、Envoy
8.2.8 第二代的Service Mesh
Istio
Istio最大的创新在于,它为Service Mesh带来了前所未有的控制力:
- 以Sidecar方式部署的Service Mesh控制了服务间所有的流量
- Istio增加了控制面板来控制系统中所有的Sidecar
- Istio能够控制所有的流量,即控制系统中所有请求的发送。
8.3 Service Mesh市场竞争
8.3.1 Service Mesh的萌芽期
8.3.2 急转直下的Linkerd
8.3.3 波澜不惊的Envoy
8.3.4 背负使命的Istio
8.3.5 背水一战的Buoyant
8.3.6 其他参与者
8.3.7 Service Mesh的国内发展情况
8.4 Istio
8.4.1 Istio概述
一个连接,管理和保护微服务的开放平台。
功能:
连接:智能控制服务之间的流量和API调用。
保护:身份验证、授权和服务之间通信加密,保护服务。
控制:
观测:自动跟踪、监控和记录所有服务。
Istio设计目标:
最大化透明度:
增量
可移植性
策略一致性
8.4.2 架构和核心组件
Istio分为数据平面和控制平面两个部分:
数据平面:是以Sidecar方式部署的智能代理,Istio默认集成的是Envoy,控制微服务之间的网络通信,已经和Mixer模块的通信。
控制平面:管理和配置数据平面,控制数据平面的行为,如代理路由流量、实施策略、收集遥测数据、加密认证等。控制平面包含Pilot、Mixer、Citadel三个主要组件。
Envoy: 用于调节服务网格中所有的服务的入站、出站流量。具体如下HTTP、gRPC、TCP Proxy、Thrift
另外,Enovy还提供了和网络通信直接相关的各种功能:
服务发现: 从Pilot得到服务发现信息。
负载均衡:
健康检查:
熔断:
高级路由:
基于百分比的流量拆分:
加密和认证:
故障注入:
此外,Envoy还要完成对请求属性的提取,这些属性可以通过Istio Proxy的Mixer Filter发送给Mixer,用于执行策略决策、配额检查等行为。
Mixer:负责提供策略控制和遥测收集的组件,在istio中的职责如下三点:
Check: 前置条件检查。认证、黑白名单、ACL检查。
Quota: 比如限速。
Report: 遥测报告。
Citadel: 加密、访问控制、审计。
第八章 跨语言服务治理方案 Service Mesh的更多相关文章
- 微服务, 架构, 服务治理, 链路跟踪, 服务发现, 流量控制, Service Mesh
微服务, 架构, 服务治理, 链路跟踪, 服务发现, 流量控制, Service Mesh 微服务架构 本文将介绍微服务架构和相关的组件,介绍他们是什么以及为什么要使用微服务架构和这些组件.本文侧 ...
- Apache Thrift 跨语言服务开发框架
Apache Thrift 是一种支持多种编程语言的远程服务调用框架,由 Facebook 于 2007 年开发,并于 2008 年进入 Apache 开源项目管理.Apache Thrift 通过 ...
- Apache Thrift - 可伸缩的跨语言服务开发框架
To put it simply, Apache Thrift is a binary communication protocol 原文地址:http://www.ibm.com/developer ...
- thrift框架总结,可伸缩的跨语言服务开发框架
thrift框架总结,可伸缩的跨语言服务开发框架 前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等.其 ...
- 【转】Apache Thrift - 可伸缩的跨语言服务开发框架
Apache Thrift - 可伸缩的跨语言服务开发框架 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.本文将从 Java 开发人员角度详 ...
- 微服务(Microservices)和服务网格(Service Mesh)架构概念整理
注:文章内容为摘录性文字,自己阅读的一些笔记,方便日后查看. 微服务(Microservices) 在过去的 2016 年和 2017 年,微服务技术迅猛普及,和容器技术一起成为这两年中最吸引眼球的技 ...
- 蚂蚁金服 Service Mesh 渐进式迁移方案|Service Mesh Meetup 实录
小蚂蚁说: 本文是基于在 Service Mesher Meetup 上海站的主题分享<蚂蚁金服 Service Mesh 渐进式迁移方案>内容整理,完整的分享 PPT 获取方式见文章底部 ...
- 微服务(Microservices)和服务网格(Service Mesh)的架构概念
注:文章内容为摘录性文字,自己阅读的一些笔记,方便日后查看. 微服务(Microservices) 在过去的 2016 年和 2017 年,微服务技术迅猛普及,和容器技术一起成为这两年中最吸引眼球的技 ...
- 在微服务架构中service mesh是什么?
在微服务架构中service mesh是什么 什么是 service mesh ? 微服务架构将软件功能隔离为多个独立的服务,这些服务可独立部署,高度可维护和可测试,并围绕特定业务功能进行组织. 这些 ...
随机推荐
- UVA 11468 Substring (记忆化搜索 + AC自动鸡)
传送门 题意: 给你K个模式串, 然后,再给你 n 个字符, 和它们出现的概率 p[ i ], 模式串肯定由给定的字符组成. 且所有字符,要么是数字,要么是大小写字母. 问你生成一个长度为L的串,不包 ...
- HTML插入音频和视频:audio和video标签及其属性
一.上传到第三方网站,然后引入例如视频上传到优酷网,然后得到代码 <iframe height=498 width=510 src='http://player.youku.com/embed/ ...
- 请解释或描述一下Django的架构
对于Django框架遵循MVC设计,并且有一个专有名词:MVT M全拼为Model,与MVC中的M功能相同,负责数据处理,内嵌了ORM框架 V全拼为View,与MVC中的C功能相同,接收HttpReq ...
- MySQL数据库设置表名区分大小写
使用Mysql的朋友有时候会遇到表名称不区分大小写的情况,导致导入数据或者备份数据库很麻烦. 如何设置Mysql数据库表名区分大小写呢,配置如下: 一.修改Mysql的配置文件my.ini my.in ...
- FCS省选模拟赛 Day3
Description Solution T1 game 咕咕咕 T2 string fail树各个节点的深度之和怎么求? 我们考虑每个前缀的深度是什么 发现这个值就相当于有多少个前缀等于它的后缀 ...
- 常用spaceclaim脚本(三)
拉伸曲线 ptList=List[Point]() #定义一个点的列表 ptList.Add(Point.Create(MM(11),MM(-14),MM(0))) #创建点,并放入列表当中 ptLi ...
- 数据结构Java版之深度优先-图(十二)
这里用深度优先遍历存在矩阵里面的图. 深度优先利用的是栈的FIFO特性.为此遍历到底后,可以找到最相邻的节点继续遍历.实现深度优先,还需要在节点加上一个访问标识,来确定该节点是否已经被访问过了. 源码 ...
- Shell同步数据到oracle数据库
某数据库有几张表更新,本地数据库增量更新数据,用脚本定时执行实现. 由于无blob/clob字段,使用sqlldr导入数据:查询目的数据库,以"|"分割导出所有数据,保存在./da ...
- js 对象 toJSON 方法
浅谈 js 对象 toJSON 方法 前些天在<浅谈 JSON.stringify 方法>说了他的正确使用姿势,今天来说下 toJSON 方法吧.其实我觉得这货跟 toString 一 ...
- java 判断list是否为空
问题: 之前用 list!=null 来判断list是否为空,但发现,定义一个list后,即使里面并没有加入任何元素,返回的结果仍旧是 true, 其实,本意是希望在没有任何元素时,返回 false, ...