写点什么

面向服务的开发:Rafael Schloming 关于构建微服务的经验分享

  • 2017-11-27
  • 本文字数:2538 字

    阅读完需:约 8 分钟

San Francisco QCon 大会上,Rafael Schloming 提出了“面向服务的开发”,他认为,想迁移到微服务的组织必须要寻求一种方法来打破单一的开发过程,而不仅仅是试图打破传统的系统架构。将新成立的微服务团队看作是内部的“衍生品(spinoffs)”,他们具有团队边界,并且鼓励他们自给自足和自我管理,除此之外,这些团队必须得到有效工具的支持,以便在生产中调试、部署和监测服务。

Schloming 是 Datawire 的 CTO 和首席架构师,演讲开始时,他问了听众一个问题,将一个庞大的系统迁移到基于微服务的应用程序时,他们遇到的第一个难题是什么。常见的回答有:“如何分解一个大型系统?”、“如何用微服务构建我的应用程序?”以及“我需要怎么样的基础架构才能使我在微服务中受益?”。根据他 2013 年在 Datawire 开发微服务应用程序的经验,Schloming 说,最重要的问题也是通常最容易被忽略的问题是“如何分解一个大型系统?”,因为开发过程对于建立和保持开发速度来说至关重要。

在开发应用程序或服务时,应用程序的交付生命周期可以划分为三个阶段:原型(prototyping)阶段、生产(production)阶段以及关键任务(mission critical)阶段。在原型阶段,维护高速的功能交付通常要容易得多,因为在这个阶段产品稳定性不那么重要。当产品交付从生产阶段转移到关键任务阶段时,为了提高稳定性往往会牺牲速度。对于应用程序中的所有组件来说,使用单一交付过程是十分低效的,因为这样做往往会导致在单一稳定性与速度间侧重点的不同(总是要牺牲其中的一项)。

以基于微服务的系统开发一个应用程序时可以使用多个流程:每个微服务产品团队都可以根据当前该过程在交付生命周期中的阶段而选择合适的流程。微服务可能是一个分布式的开发架构,但是它们也可以使用分布式的开发工作流,该工作流由各种的同步开发过程组成,并且具有不同的速度与稳定性间的侧重程度。然而,采用这种工作方式需要组织的变革以及技术的改变。

站在组织的角度来看,创建一个围绕产品开发自给自足、自治的软件团队是颇有裨益的。然而,从单一过程到微过程的转变需要训练、交流和代理(delegation)。微服务产品团队中的每个人都将经历完整的开发生命周期(从本地编码到通过持续交付将代码部署到生产,再到监测应用程序),这个过程需要额外的训练。最终,这种变化意味着专家有机会成为多面手,从而使得整体系统以及各项操作的实现更加完善。

在产品团队中,人们可能不会使用同一种语言,但是如果这种冲突处理得当的话,它会成为协作的来源。组织内的一个小团队可能把握着整个系统的重要部分,自治是一个组织在快节奏的市场环境中有效规模化的唯一方法。团队应该努力确保他们不需要依赖其他团队来实现自己的目标,这其中包括消除对中心化架构和运营团队的依赖(即使依赖一个提供自助访问架构的“平台团队”通常情况下是有好处的)。

Schloming 认为,要想实现微服务的组织变革,最好的方法是把每一个产品团队都看作是一个商业衍生品。就像现有的开发团队可能会使用诸如 Twilio Stripe 这样的第三方服务一样,产品团队也应该使用同样的方式与内部服务进行集成。

关于微服务的技术实现,Schloming 概述了产品交付生命每个周期阶段的目标。原型阶段的目标:工具以及用户的快速反馈;生产用户以及增长(production users and growth)阶段的目标:不影响用户的前提下增加新功能;以及关键任务阶段的目标:保证稳定性。这样通常会形成一个并行的单一平台(基于微服务的)工作流,该工作流可以随着产品的成熟而转换。可以使用 Docker Kubernetes Envoy 服务代理作为底层平台组件,这个实例就展示了产品生命周期中每个阶段的技术挑战。

在原型阶段,要在生产过程中获得组织对实验性项目的投资是很有挑战性的(例如,进行 A/B 测试或者 canarying 的试验)。除此之外,从技术上来说,在本地运行微服务也是具有挑战性的。克服这一问题的策略是提供自助服务供应(provisioning)和开发容器,这些容器可以通过连续的交付流水线部署到远程环境中。Schloming 给出了一个使用 Datawire 创建的开源工具( forge.sh telepresence )的例子。forge.sh 用于创建一个轻量级的开发环境,它是产品构建和相关依赖关系的单一数据源。telepresence 用于代理远程的 Kubernetes 集群。通过这种方式可以使本地开发的应用程序 (以及相关的调试工具) 与远程服务进行交互,就好像它在集群中运行一样。

对于交付生命周期的生产用户和增长阶段,核心挑战是度量用户对实验性功能的影响 (并认识到在速度和稳定性之间的侧重点),以及测试新特性和降低软件缺陷的影响。使用多版本部署可以克服这些问题,通过 canarying 添加新特性(将其部署为新服务),并随着所观测的用户指标的升高,逐渐增加流量。Envoy,是一个第7 层(应用层)代理,它是由Matt Klein 和Lyft 工程团队构建并运行的,它可以用于解决上述问题,因为所有的流量都可以通过这个代理进行路由和控制。在过去的6 个月里,由于 Istio (它使用 Envoy 作为服务网格数据平面)和其它“服务网格(meshes)”的出现,人们对这个概念越来越感兴趣了。

最后一个阶段,关键任务软件阶段围绕防止软件功能和应用程序可观察性的倒退而进行。克服这一问题的策略包括定义服务水平目标(SLOs)和实现第7 层(应用层)的可观察性。SLOs 的创建和执行需要通过契约型服务级协议(Service Level Agreements,SLAs),并且需要在整个组织范围内进行应用。第7 层的可观测性可以通过 Envoy (或者类似的代理)进行实现,因为这个代理在网络堆栈层中运行,并且可以访问网络中的所有服务端到服务端的流量。

Schloming 在演讲的最后阶段总结道,当一个组织开始进行微服务迁移时,需要注意的是,除了分解整体架构之外,还应该优先对整体流程进行分解。将微服务产品团队组织为自给自足和自治的“衍生品”是有好处的。除此之外,组织必须创建相关工具来实现有效的面向服务的开发。

Rafael Schloming 主题演讲“面向服务的开发”(PDF,2MB)中的演示文稿可以在QCon SF 网站上进行访问。这个演讲的视频以及所有的演讲视频会由InfoQ 在接下来的几个月内整理出来,届时可以在相关网站进行访问。

查看英文原文: Service-Oriented Development: Rafael Schloming Shares Lessons Learned with Building Microservice

2017-11-27 18:001363

评论

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

Java程序员都要懂得知识点:反射

华为云开发者联盟

Java 对象 反射 class 函数

“广度”和“深度”,是我最终选择蚂蚁的理由

DT极客

区块链溯源服务平台,区块链商品防伪溯源解决方案

13828808769

区块链+ #区块链#

百度飞桨中国行南京站开启!共研AI赋能产业新模式

百度大脑

百度 AI 飞桨

科技赋能城市建设,英特尔正式发布智慧社区解决方案参考架构

E科讯

一个魔幻的框架,3分钟纯 Java 注解搭个管理系统

程序员小富

Java 大前端 后端

智慧公安警务系统搭建,警务大数据可视化分析平台解决方案

13828808769

智慧城市

Elasticsearch详细剖析

大数据技术指南

ES 3月日更

【技术面对面】基于场景图的多物体图像生成技术

京东科技开发者

云计算

Python+OpenCV检测灯光亮点

不脱发的程序猿

Python OpenCV 28天写作 3月日更 检测灯光亮点

企业利用边缘计算的10种方式

边缘计算

区块链溯源,茶叶溯源平台的搭建

13828808769

#区块链#

一次客户需求引发的K8s网络探究

京东科技开发者

云计算

在开源的公链上实现隐私保护?静看NA公链 NAC公链创新之路应如何蜕变

区块链第一资讯

银四30天,苦心啃透java高级工程师面试1000题,涨薪10K很难吗?

Java 编程 程序员 架构 面试

开源项目月刊《HelloGitHub》第 60 期

HelloGitHub

GitHub 开源

区块链溯源,茶叶溯源平台的搭建

13828808769

区块链+ #区块链#

Rust从0到1-基础概念-注释

rust 代码注释

首站重庆聚焦智慧物流、呈现最新AI能力

百度大脑

AI 百度大脑

如何学习数据结构与算法

C语言与CPP编程

c c++ 数据结构 程序人生 算法

Python OpenCV setMouseCallback 回调函数,取经之旅第 13 天

梦想橡皮擦

3月日更

python中find_element()和find_elements()的区别

Geek_6370d5

Python

Python基础之:Python中的异常和错误

程序那些事

Python Python3 程序那些事

实战案例丨分布式系统中如何用python实现Paxos

华为云开发者联盟

Python 算法 分布式系统 PAXOS 集群库

华为云自研PB级分布式时序数据库揭秘第一期初识GaussDB(for Influx)

华为云开发者联盟

云原生 时序数据库 华为云 分布式时序数据库 GaussDB(for Influx)

Java 并发系列(二):DCL — Double Check Lock

TroyLiu

Java volatile 多线程 synchronized DCL

【签约计划】技术编辑能力考核成绩公布

InfoQ写作社区官方

签约计划 热门活动

云图说|一张图带你了解华为云分布式数据库中间件

华为云开发者联盟

数据库中间件 DDM 分布式数据库中间件 华为分布式数据库中间件

实现一个“能中断”的ajax

云小梦

JavaScript ajax Promise axios 请求拦截

LDO和DC-DC有什么不同?如何选型?

不脱发的程序猿

28天写作 3月日更 LDO DC-DC 电源转换

Mongodb特定场景性能数十倍提升优化实践(记一次十亿级mongodb核心集群雪崩故障)

杨亚洲(专注MongoDB及高性能中间件)

MySQL 数据库 mongodb 架构 分布式数据库mongodb

面向服务的开发:Rafael Schloming关于构建微服务的经验分享_架构_Daniel Bryant_InfoQ精选文章