Service Mesh 在华为公有云的实践

640?wx_fmt=gif


我们在构建微服务而构建微服务是困难的


微服务是一个很大的概念,从团队组织到最佳实践似乎都有实施微服务的一些指导。我们这里只提构建微服务的架构模式,也就是关乎到你用什么样的方式来构建你以微服务架构来组织的应用系统。


近些年随着微服务的火热,越来越多的团队开始进行实践,将微服务纷纷落地,也许你是从0开始,一步步地完成了单体应用向微服务的转型,让我们来看看,你解决了多少问题。


640?wx_fmt=png


我相信最难的部分之一就是调用你的服务。


微服务将原本内存中函数的调用转换为网络中的调用后,就牵扯到这些问题,而任何一个分支展开,都会涉及一系列的问题。业务开发者也许真的有精力去学习架构相关的复杂问题,然而对于公司来说,真正有价值的是业务本身,让业务开发者解决这些问题需要花费浪费大量的时间精力,导致业务上线受到影响。那我们来看看是否有便捷的方式来解决业务开发者的痛点。


Chassis模式


一句话来概括:一种语言开发框架来作为微服务开发的底座,封装掉复杂性,帮助你解决跨网络带来的问题,让用户聚焦在上层业务逻辑的开发。通常情况下会实现以下功能:

  • 日志、Metrics、分布式追踪数据上报

  • 健康检查

  • 对接统一的配置中心实现动态配置

  • 对接注册中心

  • 实现负载均衡、熔断降级、容错、限流等保证高可靠运行的功能


现在我们来看看业界有哪些可用的Chassis框架:

  • Spring Cloud

  • ServiceComb

  • Dubbo

  • Go-Micro

  • Go-Kit


先不细去纠结微服务的严格定义,也先暂且搁置诸如“某些老旧框架是否是真的微服务框架”这类争议,从实现方式来看,上述服务化框架都是将分布式系统开发的复杂性进行了一定程度的封装然后提供了简便的开发接口供使用者调用。


但是,用这种方式构建微服务还有一些问题:


  • 多语言SDK支持:微服务提倡不同组件使用最适合它的语言开发,但是这需要每种语言都有开发框架,不断实现相同的功能。上面可以看到只有go语言和Java语言出现了微服务开发框架,其他语言呢?

  • 不论代码侵入程度,都需要开发者思考如何与SDK结合,并从代码层面做出改变,对于大部分开发者来说都是一个高曲线的学习过程。

  • 绑定了特定技术栈,不容易改造。

  • 老旧单体应用由于无人维护,耦合程度高等问题无法进行改造,在进行微服务拆分的过程中重用遗留代码变得无比困难。而且微服务的拆分难以分步进行,需要一个相对较长的周期将系统整体拆分后才能上线。


我们知道技术演进来自于在实践中不断地将功能抽象,解耦,封装,服务化。


  • 云计算技术出现前是数据中心虚拟化,不断地实践使技术发展形成理论和新的实践。IaaS是一种封装,如今开发者与大部分技术团队不需要再学习虚拟化等技术以及如何维护数据中心。

  • 没有TCP/IP的时代,开发人员需要自己考虑网络间数据包的传输,以及网络传输代码与业务代码完全耦合的问题,如今,开发者已经不需要关心,操作系统和开发语言已经封装好网络传输过程。


是否也可以把语言框架提供的能力抽象,成为服务?很多问题是开放性的解法,上学时大家体会很深一道难题会有很多解法。


在引入后面内容前,我先介绍下SideCar模式。


SideCar模式


  • 在近些年受到Kubernetes对容器调度方式的启示而日渐受到关注的一种功能部署模式,也是一种微服务的设计模式。

  • 主要利用了容器可以共享存储与网络的能力,或者说在一个Host中,这个模式也同样适用。

  • 一般分为应用容器和工具容器,工具容器可以重用。


一个典型的场景如下:


640?wx_fmt=png


应用容器与日志同步工具在同一个Pod下,共享存储卷,应用程序生成的日志文件会由日志同步工具收集并发送到类似kafka,elasticsearch这样服务中。


在这样的架构下我们获得了什么呢?

  • 以容器作为基础打包单元,那么就可以分给不同的团队进行开发测试

  • Sidecar容器可重用,可以与不同的容器结合

  • 以容器作为错误边界,使服务能够独立开发和测试,比如应用服务在没有日志保存功能的情况下也可以独立运行

  • 独立回滚与更新,但需要考虑复杂的版本组合,建议使用语义版本管理对版本进行控制


我们知道侵入式框架是在L7去解决微服务调用,管理,监控的问题,那么是否我们可以将这部分抽象出来,在L5层解决呢。


640?wx_fmt=png


在这个模式的基础和思路之下,我们引入了Service mesh。


Service Mesh


什么是Service Mesh。


Service mesh最早是由Linkerd给出的定义,我们来看看英文版。


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. (But there are variations to this idea, as we’ll see.) The concept of the service mesh as a separate layer is tied to the rise of the cloud native application. In the cloud native model, a single application might consist of hundreds of services; each service might have thousands of instances; and each of those instances might be in a constantly-changing state as they are dynamically scheduled by an orchestrator like Kubernetes. Not only is service communication in this world incredibly complex, it’s a pervasive and fundamental part of runtime behavior. Managing it is vital to ensuring end-to-end performance and reliability.


大致的意思如下:

  • 一种基础设施层,服务间的通信通过service mesh进行

  • 可靠地传输复杂拓扑中服务的请求,将它们变成现代的云原生服务

  • 一种网络代理的实现,通常与业务服务部署在一起,业务服务不感知

  • 一种网络模型,在TCP/IP之上的抽象层,TCP/IP负责将字节码可靠地在网络节点间传递,Service mesh则复杂将服务间的协议请求可靠地在服务间进行传输。它们不关心传输的内容

  • TCP/IP仅仅负责传输,但Service mesh可对运行时进行控制,使服务变得可监控,可管理。



640?wx_fmt=png


为什么使用Service Mesh

  • 无需考虑每种语言都要解决的问题

  • 对业务代码0侵入,开发者无需关心分布式架构带来的复杂性以及引入的技术问题

  • 对于不适合改造的老旧单体应用,提供了一种接入分布式环境的方式

  • 微服务化的进程通常不是一蹴而就的,很多应用选择了演进的方式,就是将单体应用一部分一部分地进行拆分。而在这个过程中,使用Service Mesh就可以很好地保证未拆分的应用与已经拆分出来的微服务之间的互通和统一治理

  • 开发出的应用既是云原生的又具有独立性,不将业务代码与任何框架,平台或者服务绑定


依然没有银弹,我们来看看Service mesh解决不了的问题:

  • Service Mesh组件代理请求转发,会在一定程度上降低系统通信性能

  • 侵入式框架以源码和业务代码结合,有较强定制和扩展能力,Service mesh相对不易定制扩展

  • 在运行时,依赖单独的Service Mesh代理,多了一个故障点。整个系统的运行和运维也强依赖于Service Mesh组件的能力

Service Mesh的实践历程和设计思路


Service Mesh在华为公司内部的发展历程


第一代: 基于NGINX的微服务代理


该平台是华为公司内部使用的微服务开发部署运行平台,开发于2013年,用于公司内部某电信业务。在这个业务系统中有大概400多个左右的微服务,实例数量根据局点大小不一样,一个典型的部署为800多个左右实例的规模。


整体架构如下:


640?wx_fmt=png


其中的Internal Router组件用来给开发者解决分布式架构中的可靠传输问题:

  • 使用高性能nginx及其相应的lua扩展作为Internal Router,将Http服务接入

  • 使用RouteAgent负责注册/注销实例,更新IR的实例信息

  • 使用zookeeper作为注册中心

  • 以Per-Host的方式部署在微服务所运行的环境中


用这种方式构建的微服务环境已经在超过200个局点的生产环境下得到使用,整体运行情况良好。但是随着时间的推移,当业务对敏捷的要求越来越大,而且容器的使用也越来越广泛,这种方式带来了一些问题:

  • 使用lua脚本扩展注册发现,负载均衡,熔断,降级,容错,限流,但lua的扩展性有一定的局限

  • 用RouteAgent负责服务的注册以及每个NGINX上服务实例路由的刷新,RA需清楚地感知本节点上的微服务都有哪些,但是使用Kubernetes做容器调度后微服务和实例的分布信息在K8S里面集中记录

  • 容器的IP更多,变化更频繁,使用RouteAgent刷新NGINX路由的方式会导致NGINX服务受到影响,频繁的路由刷新导致业务运行收到影响

  • 当IR服务失败后,整个Host中的服务都会丢失,无法与外界建立联系


为了解决这些问题,出现了第二代的解决方案: HSA Sidecar。


640?wx_fmt=png


HSA是华为内部的一套微服务开发框架,它提供了注册中心,配置中心,java开发框架,以及SideCar等组件。


  • 基于Java 微服务框架开发,非侵入式通信方式,支持RPC与Http,提供SOAP协议转换,但会导致性能下降

  • 与微服务部署在一个Pod中即Sidecar模式

  • 作为代理服务,使微服务自动获得注册发现,负载均衡,熔断,降级,容错限流等功能

  • 占用资源很高,一个应用实例一个Sidecar实例的部署方式,会占用过高资源


虽然第一代的问题解决了,但是第二代的Sidecar在性能和资源占用上有很大的问题,在少量的技术项目中试用后,因为资源占用过高的问题无法在大规模环境中推广使用。


阅读全文请扫描

下方二维码,

还可以加入读者圈与作者聊天~:


640?wx_fmt=png



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式NewSQL数据库实践——民生银行经典案例

前言此前,金融信息化建设主要依托原有集中型 IT 架构进行维护扩展,系统规模及复杂程度呈指数级增长,各类瓶颈逐渐暴露,日益增长的数字金融需求同旧式的系统架构缺陷之间的矛盾愈加凸显。中国人民银行、中国银行保险监督管理委员会…

「拨云见日」英特尔揭秘短视频背后的二三事

“像一棵海草海草,随风飘摇,海草海草,浪花里舞蹈……”看到这样魔性的歌词,你是不是有立刻跟着唱的冲动,甚至还很想起来跳一段呢?去火锅店点餐,你会掏出手机告诉服务员按照视频内容操作吗&#…

英特尔助力金山云带你畅游云端的游戏世界

科技的发展让人们可以在任意时间、任意地点与不同的玩家一同畅游游戏世界。不论是拥挤的通勤路上,还是热闹的餐厅,都少不了痴迷于手游的玩家。来自《2017年中国游戏产业报告(摘要版)》的数据表明,去年中国游戏市场全年…

数据洪流时代,企业转型需要修建自己的“都江堰”

科技的进步推动着人类文明的进化,从农业采集社会到如今的网络智能社会,文明的进化也同样带动了企业的“进化”。今天,人工智能、云计算、大数据等技术的不断突破,让网络产生的数据量呈爆发式增长,数据洪流汹涌奔来&…

时代变了

阅读文本大概需要 2.6 分钟。最近一段时间,经常有人问我这么一个问题,说,张哥,现在市面上有各种付费网课和付费专栏,但我总觉得只有看书学习才是正途,不知道张哥怎么看?到底哪种学习方式最好呢&…

终于有人把什么是云计算、大数据和人工智能讲明白了!云计算是什么?

今天跟大家讲讲云计算、大数据和人工智能。为什么讲这三个东西呢?因为这三个东西现在非常火,并且它们之间好像互相有关系,可是很多人却不知道什么是云计算或者云计算应用在哪:一般谈云计算的时候会提到大数据、谈人工智能的时候会…

数据洪流来袭,企业转型势不可挡,如何四两拨千斤?

在漫长的历史里,文明的进步都是伴随着科技的发展,企业也在不断进化,无论是商业战略还是商业模式,在科技的推动下与时俱进,不断更迭创新。历史的长河流入数据洪流的时代,人工智能、大数据、云计算等新技术掀…

福利 | 2018 OpenInfra Days China限量版免费票任性放出

号外号外!福利来袭,手速up up up~春困夏乏秋盹冬眠暑气炎炎,OpenInfra帮你提神醒脑——特别好礼限量放送Ready?Go!2018 年 6 月 21-22 日,OpenInfra Days China将于国家会议中心北京升级回归,汇…

开源不止,前进不息:2018 OpenInfra Days China来了!

OpenStack Days China是由一群热衷并专注于开源的中国志愿者为中国开源社区组织和举办的年度社区活动。近两年来,志愿者团队成功激起广泛关注,获得了中国各行各业和来自全球开源开发者社区的巨大支持。会议注册人数共计超过 1 万人,参与人数逾…

短暂相逢却回味无穷,全球最具影响力的以太坊技术会议视频,你保存了吗!...

关注我们,了解更多精彩内容自2008年中本聪发表的那篇仅短短9页的比特币白皮书后,毁誉参半的比特币对当今互联网及物联网的世界格局产生了重大的影响,其后延伸出来的区块链技术成为了全球最时髦的名词。相比比特币,以太坊是区块链技…

互联网+2.0:技术有多强 梦想才有多近

在过去不到十年的时间里,互联网行业高速发展。先是以手机、pad等智能终端为主的移动互联网打破了PC端互联网商业发展瓶颈,实体经济也依托互联网进行改造升级,“互联网”成为行业图腾和符号。后是随着人工智能、大数据、云计算等技术的融入&am…

java定时器 并发_【java多线程与并发库】— 定时器的应用 | 学步园

定时器的应用1、 定时器主要涉及到两个类(java.util包中)-》public class Timer extendsObject(一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。 )-->public abstract class TimerTask extendsObjectimple…

效率提升,英特尔助力企业驶入“快车道”

随着越来越多的企业加入数字化转型大军,每个企业都在期待着数字化带来的业务创新及优化。从云平台的应用、大数据的决策分析,再到工作流程自动化,企业的IT部门不再仅仅是维护企业本身的业务运作以及数据处理,而是需要接入整个生态…

java怎么写事件listener_java 事件监听器ActionListener

/** 功能:java事件监听器ActionListener*/package com.events;import java.awt.BorderLayout;import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;public class changebgcolor extends JFrame implements Ac…

Spring AOP 使用介绍,从前世到今生

前面写过 Spring IOC 的源码分析,很多读者希望可以出一个 Spring AOP 的源码分析,不过 Spring AOP 的源码还是比较多的,写出来不免篇幅会大些。本文不介绍源码分析,而是介绍 Spring AOP 中的一些概念,以及它的各种配置…

java怎么用doss窗口_GitHub - doss128/symphony: 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台。...

下一代的社区系统,为未来而构建💡 简介Symphony([ˈsɪmfəni],n.交响乐)是一个现代化的社区平台,因为它:实现了面向内容讨论的论坛实现了面向知识问答的社区包含了面向用户分享、交友、游戏的社交网络100% 开源⚡ 动机…

机器学习算法比较

本文主要回顾下几个常用算法的适应场景及其优缺点!(提示:部分内容摘自网络)。机器学习算法太多了,分类、回归、聚类、推荐、图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中…

还在用 Python 2.x?Python 3.7.0 正式发布!

6 月 27 日,期待已久的 Python 3.7.0 正式发布,与之同行的还有 3.6.6 版本的更新。此次,最新版的 Python 3.7.0 带来了诸多的新功能和优化,接下来,让我们一睹为快。Python 3.7.0 主要更新新的语法特性:PEP …

2018 年你需要知道的 11 个 JavaScript 库

译者按:你可能已经用到Underscore或者Lodash。本文列举了11个常用的库来提高开发效率。为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。JavaScript依然是2018年最受欢迎、最流行的编程语言&…

云化要求下,数据库架构的演进

如今,大型企业如金融企业和银行等,在下一代的微服务架构转型要求下,需要基础软件和数据平台能够实现原生的云化,以满足微服务架构的需求。微服务,也就是一种面向服务的,有特定边界的松散耦合的架构。主要特…