生成式AI领域的最新成果都在这里!抢 QCon 展区门票 了解详情
写点什么

微服务部署面临的挑战

  • 2016-04-20
  • 本文字数:2005 字

    阅读完需:约 7 分钟

以前,我们邀请几位嘉宾讨论了他们在开发微服务时遇到的挑战,比如 Fred George Dustin Huptas 和 Andreas Schmidt 。近日,Usman Ismail 参加了一场小组会议,讨论了微服务持续交付面临的挑战,并决定随后详述其中的部分重点内容。他首先讨论了微服务其中一个基本原则的缺点,那允许大型团队通过快速原型和迭代以一种更加敏捷的方式推进(软件)开发:

不过,微服务显著增加了开发团队的运维和工具负担。每个服务都需要一个部署管道、一个监控系统、自动报警、轮流电话值班,等等。对于大型团队,所有这些负担都可以视为提升特性开发效率的合理代价,是创建这些系统值得付出的努力。不过,在小型团队中,如果同一批人负责所有的服务,那么无论如何,为多个项目复制管道都是开销上的浪费。

接下来考虑的是运维负担。在 Usman 看来,使用微服务或单体架构,如果推出了一个服务或组件的不良版本,就需要回滚系统,而且如果遇到资源限制,则(常常)可以横向扩展。不过,使用微服务,你需要更多的监控和自动化才能检测出哪些服务需要回滚,并确定回滚一个服务对其他依赖它的服务产生什么影响,等等。

如果你有自动报警系统(你真应该有一个),那么你需要把报警信息发给服务所有者,并为多个服务维护一个电话值班时间表。在小型组织中,负责不同服务的人群之间会有很大的重叠。这就是说,我们必须针对这些服务协调时间表,以确保同一个人不会被许多服务钩住,让人们在轮流电话值班之外得到一些喘息。由于这些以及上一节中提到的原因,最好是开始引入多个微服务的开销之前有一个单体架构,并把所有的运维工作安排妥当。

然后当然是微服务一个基本特点——一个在传统单体应用中可能不会提到或者很少提到的特点:分布式。这引发了一个古老的问题,就是在分布式环境中调试,我们过去已经提到过许多次,在微服务这个术语被创造出来以前。原先,Joyent 首席技术官 Bryan Cantrill 探讨过在生产环境中调试微服务。Usman 认为,没有一个集中式的微服务日志是一种致命的缺陷:

而且,在规模比较大的情况下,有一个单独的监控系统(比如 datadog、grahite)和一个单独的日志聚合系统(比如 ELK、loggly 或 Splunk)是不可行的。在这种规模下,可视化指标和日志数据是一个大数据问题,最好在一个地方解决。

对于小组会议的最后一个重点,Usman 提到了部署协调和版本管理。文章认为,微服务和单体应用的其中一个重大差别是前者是一棵服务依赖树,而后者是一个图:

例如,在单体模型中,一个典型的服务栈可能包含一个“Web 组件组合(web array)”,它调用一个缓存层、数据库层,可能还有一些独立服务,比如身份验证,等等。在微服务模型中,你会有一个连通图或者服务网络,每个服务都依赖于几个其他的服务。有一点很重要,就是要确保这个图是一个有向无环图(DAG),否则你会陷入依赖地狱,可能还会遇到分布式堆栈溢出错误。

有趣的是,Usman 的文章接下来总结了嘉宾们提出的一些指导原则:

参加小组会议的嘉宾,没有哪个人对他们的微服务系统十分满意,也就无法为如何构建这样一个系统提出任何类似指南的东西,不过,我们确实提出了一些经验法则或者一般的指导原则,包括下列这些。

这些原则可以总结为:

  • 微服务需要大量的基础设施用于开发和部署,因此要使用一个平台。“ Kubernetes Swarm Mesos 以及其他类似产品可以提供很大的帮助,但你仍然需要使监控、调试、“连续管道(continuous pipeline)”和服务发现机制一体化。”
  • 为了实现可再现、可靠的自动化,不要通过人工过程定义系统的任何东西。“任何东西都必须通过代码定义,可测试,可再现。例如,服务器 / 虚拟机的配置应该使用 docker-machine、puppet、ansible 等进行编排。
  • 开发或使用集中式监控、日志和报警。“单体服务就像一个深受喜爱的宠物,你知道它所有的怪癖和习惯,而微服务就像牲畜;你要它们全部都差不多一样,并作为一个普通的畜群进行管理,而不是一个个体。”
  • 务必确保向后向前兼容。
  • 将大型微服务部署可视化为一个网络。“监控和管理一个大型微服务部署同管理一个网络系统十分类似。”

所有的建议都是基于来自各类公司的嘉宾们的集体经验。那些建议一直随着时间演变,将来可能会随着经验的日益丰富而继续演变。在某种程度上,Usman 最后的评论附和了 Vijay Alagarasan 去年在演讲“7 种微服务反模式”中所讲的内容:

[微服务] 并不是解决构建和运行大规模分布式软件基本问题的魔弹。微服务架构迫使你更谨慎地遵循最佳实践和自动化工作流。本次讨论的一个重要结论是,除非你愿意将大量的时间和资源从特性开发工作转到构建和维护一个服务框架上,否则最好避免进入微服务的世界。不过,如果你能够投入时间构建一个很棒的服务框架和工作流,那么你将完成重大转变,成为一个更敏捷、更有生产力的组织。

我们总是在寻求更深入的微服务经验,有好的经验,也有不好的经验,因此,或许你想自己对 Usman 的工作或讨论作出评判。

查看英文原文: Challenges of Microservices Deployments

2016-04-20 19:003355
用户头像

发布了 1008 篇内容, 共 373.4 次阅读, 收获喜欢 340 次。

关注

评论

发布
暂无评论
发现更多内容

Spring(三)

爱好编程进阶

Java 面试 后端开发

Choreographer全解析

爱好编程进阶

Java 面试 后端开发

MySQL-InnoDB-事务

爱好编程进阶

Java 面试 后端开发

Spring框架JDBC Template使用教程

爱好编程进阶

Java 面试 后端开发

UML项目实例——抖音的UML图描述

爱好编程进阶

Java 面试 后端开发

Java语言特点

爱好编程进阶

Java 面试 后端开发

Spring Data ElasticSearch基本使用

爱好编程进阶

Java 面试 后端开发

Spring-Data-Jpa动态查询(Specification)

爱好编程进阶

Java 面试 后端开发

【Java面试题】关于String

爱好编程进阶

Java 面试 后端开发

krpano全景之vtour文件夹和tour

爱好编程进阶

Java 面试 后端开发

OpenFaaS实战之四:模板操作(template)

爱好编程进阶

Java 面试 后端开发

RabbitMQ的高级特性和消息补偿机制

爱好编程进阶

Java 面试 后端开发

自己动手写Docker系列 -- 6.3 手动配置容器网络(上)

Go Docker 4月月更

《JVM系列》 第七章 -- 字节码执行引擎

爱好编程进阶

Java 面试 后端开发

Java 结合实例学会使用 静态代理、JDK动态代理、CGLIB动态代理

爱好编程进阶

Java 面试 后端开发

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day39

爱好编程进阶

Java 面试 后端开发

Java泛型机制详解;这些你都知道吗?

爱好编程进阶

Java 面试 后端开发

【Java从0到架构师】SQL 多表查询

爱好编程进阶

Java 面试 后端开发

Netty 核心源码解读 —— ServerBootstrap 篇

爱好编程进阶

Java 面试 后端开发

22年了你还不知道文件包含漏洞?

喀拉峻

网络安全 漏洞

Shiro认证源码图文解析

爱好编程进阶

Java 面试 后端开发

SpringCloud-分布式配置中心【动态刷新】

爱好编程进阶

Java 面试 后端开发

【SpringBoot搭建个人博客】- 实体类构建

爱好编程进阶

Java 面试 后端开发

SpringCloud Alibaba Nacos 使用详解

牧小农

nacos SpringCloud Alibaba

AtomicIntegerArray源码分析与感悟

爱好编程进阶

Java 面试 后端开发

Java 线程池原理分析

爱好编程进阶

Java 面试 后端开发

redis的五种数据类型

爱好编程进阶

Java 面试 后端开发

Netty学习之旅------高仿Dubbo服务调用模型、私有协议实现、编码解码器使用实践

爱好编程进阶

Java 面试 后端开发

Java单例模式实现,一次性学完整,面试加分项

爱好编程进阶

Java 面试 后端开发

JVM+分布式+算法

爱好编程进阶

Java 面试 后端开发

kotlin 如何解决 java 开发痛点,让程序员 happier

爱好编程进阶

Java 面试 后端开发

微服务部署面临的挑战_语言 & 开发_Mark Little_InfoQ精选文章