QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

微服务开发过程中的反模式

  • 2016-03-18
  • 本文字数:1453 字

    阅读完需:约 5 分钟

在近期举办的 QCon 伦敦大会上, Tammer Saleh 在一场演讲中描述了他在微服务方面遇到的一些常见的反模式以及对应的解决方案。他表示,一体性应用的主要问题在于应用难以扩展,但更重要的问题在于团队也难以扩展。因此,选择微服务的主要原因是团队方面的因素。

对于小型应用和小型团队来说,一体性的应用没有任何问题,但随着应用的规模不断增长,以及开发者团队的膨胀,他们已无法在同一个代码库中进行合作。选择微服务能够让我们以适合自己的方式应用康威定律

Saleh 表示,微服务的构建是一项非常复杂的工作,只要在某个方面没做好,就有可能走到错误的方向上。在他看来,最常见的错误就是在起初阶段就企图实现微服务。他强调说,对于任何一种系统,起初都应该尽可能选择简单的方式,只有当团队或业务有需要时,再开始逐步地迁移至更复杂的解决方案上。他提到,对于一个公司来说,最重要的是快速进入市场赚钱,而不是去探索有趣的架构模式。他给出的方案是在起初阶段选择一体性方式,等到有必要时再进行提炼。他还指出,微服务为开发过程施加了持续的负担。

当访问量达到高峰时,必须维护足够数量的服务器,以应对峰值时的负载。但随着访问量与服务器数量的提高,数据库最终会达到过载状态。一种方案是通过队列分担这种负载,队列基本上就是一种缓冲,以缓解过高的访问量。为此,通信需要转变为异步方式,而这样一来,由于请求与响应的生命周期被打破,客户端将不得不处理异步的响应,使得整个应用的复杂度再度提高。但在 Saleh 看来,这一步是必不可少的,否则组织将不得不在计算资源上投入过多的金钱。

从运维的角度来说,如果某些服务尝试连接某个特定的服务,而后者又无法响应,这将成为一个严重的问题。由于大量的请求不断涌入,因此很难对已产生故障的服务进行故障诊断与修复工作。如果成百上千的其他服务仍然在向该服务发送请求,就可能会导致各种各样的问题。有一种解决方案是使用断路器,它能够使请求无法达到发生故障的服务。在正常工作情况下,断路器允许所有的访问通过,而一旦它发现了某个故障,就会阻止对它继续访问。等到出故障的服务能够再次响应,访问才能够继续通过断路器。

随着微服务的兴起,也出现了一系列新的测试模式。一种常见的模式是模拟某个待测试服务所调用的各种服务,测试某个服务的团队将不再与所调用的服务进行通信,而是为这些服务编写模拟对象。这最终意味着每个团队都需要为其所调用的服务编写自己的模拟对象,由此可能会产生大量的额外工作。按Saleh 的经验来看,一种通用的解决方案是让每个团队为其负责的服务编写一个通用的模拟对象,这样一来,每个服务都只对应一个模拟对象。作为对这种方案的一种改进,他进一步提议让每个团队为服务编写特定于语言的客户端,让调用该服务的其他服务使用这个客户端。客户端将处理与服务之间的实际通信,它本身也可以提供模拟对象。在Saleh 看来,这种方式的优点在于每个服务对于所用的协议具有完整的控制,并且能够在必要时进行改动。他同时相信,这种方式是一种更易用的接口。

在2015 年的一篇博客文章中,Stefan Tilkov反对在起初阶段总是以一体性方式设计应用的思想。他认为对于足够复杂的系统来说,从一开始就应该考虑将其设计为多个独立的子系统。

在今年早些时候,Ben Christensen 在一场报告中谈到了使用由服务团队编写的客户端库,并将其作为访问该服务唯一的正式途径的风险

QCon 的参会者已经可以下载 Saleh 的报告内容了。而不久之后, InfoQ 的读者也可以欣赏到 Saleh 的讲座内容。

查看英文原文 Anti-Patterns Working with Microservices

2016-03-18 19:001423
用户头像

发布了 428 篇内容, 共 180.9 次阅读, 收获喜欢 39 次。

关注

评论

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

实战 | 巴啦巴啦SpringBoot变装SpringCloud大佬~

写程序的小王叔叔

架构 微服务 Spring Cloud springboot 6月月更

web前端培训50 个高效编程的前端轮子

@零度

前端开发

等个有“源”人|OpenHarmony 成长计划学生挑战赛报名启动

OpenHarmony开发者

OpenHarmony

区块链哈希竞猜游戏系统开发(开发方案)

开发微hkkf5566

关于 SAP Spartacus CmsService.getComponentData 可能的优化思路

汪子熙

前端开发 SAP Hybris commerce 6月月更

实战 | Win10安装ELK

写程序的小王叔叔

ELK ELK Stack 6月月更

深入剖析 | 应用层Protocol的标准设计

九叔(高翔龙)

架构 协议 TCP/IP dubbo源码 粘包/拆包

龙蜥社区 5 月技术委员会会议顺利召开,新一代操作系统研发路线图发布

OpenAnolis小助手

开源 操作系统 龙蜥社区 技术委员会 新版本

【sql语句基础】——查(select)(单表查询顺序补充)

写代码两年半

数据库 sql MySQL 数据库 6月月更

17张图:读懂国内首个《主机安全能力建设指南》

青藤云安全

网络安全 主机安全 深度网络

什么是Minio?如何搭建Minio集群?

wljslmz

存储 Minio 集群 6月月更

InfoQ 极客传媒 15 周年庆征文|ZooKeeper进阶(一):Zookeeper简介

No Silver Bullet

zookeeper 运维 6月月更 InfoQ极客传媒15周年庆

vivo大规模 Kubernetes 集群自动化运维实践

vivo互联网技术

Kubernetes operator ansible kubeadm Kubevirt

OpenHarmony 开源开发者成长计划解决方案学生挑战赛,等你来参加!

InfoQ写作社区官方

OpenHarmony 热门活动

实战 |SpringBoot增加Swagger

写程序的小王叔叔

架构 springboot swagger 6月月更

C#/VB.NET 在Word转PDF时生成目录书签

在下毛毛雨

C# .net PDF word文档 书签

设计师导航网站合集

小炮

Django 项目 MVT 结构

海拥(haiyong.site)

6月月更

Springboot 升级到 2.6.1 的坑

Damon

微服务 微服务架构 Spring Cloud 6月月更

【Python技能树共建】selenium入手篇

梦想橡皮擦

Python 6月月更

转:基于Springcloud的服务治理落地实践

小江

Spring Cloud 微服务治理

【LeetCode】高度检查器Java题解

Albert

LeetCode 6月月更

实战模拟│企业微信机器人实时报错预警

机器人 企业微信 监控告警 预警 6月月更

C#入门系列(十三) -- 初识结构体

陈言必行

C# 6月月更

5月月更开奖!还不来领取?

InfoQ写作社区官方

热门活动 5月月更

一起架构-某实时分析项目云原生 serverless 架构的设计思路和poc代码实现

明哥的IT随笔

云原生 架构设计

5个聚合导航网站,资源、工具、素材应有尽有

小炮

Linux开发_介绍BMP图片上下翻转、添加水印

DS小龙哥

6月月更

JavaScrip模块模式

大熊G

JavaScript 前端 6月月更

中国SaaS产业全景图谱

小炮

大数据培训算法面试题分享

@零度

算法 大数据开发

微服务开发过程中的反模式_语言 & 开发_Jan Stenberg_InfoQ精选文章