PCon全球产品创新大会最新日程上线,这里直达 了解详情
写点什么

微服务架构陷阱:过渡设计和设计不足

  • 2019 年 12 月 10 日
  • 本文字数:1347 字

    阅读完需:约 4 分钟

微服务架构陷阱:过渡设计和设计不足

在这篇文章里,我将简要地介绍在设计微服务架构时需要注意的问题。如果实施得当,就会获得自治能力和灵活性,但同时也会带来通信延迟和部署及托管成本。这篇文章并不是一个高级指南,我只是希望能够在你们决定采用微服务架构时帮你们做出更好的判断。


映射服务

在我看来,映射服务是一种很糟糕的想法。


如果你走到了这一步,很可能是因为你需要在服务 A 和服务 B 之间映射 DTO,因为服务 A 和服务 B 需要不同的 DTO,但它们之间又相互依赖。出于对微服务的“热爱”,你尝试着解耦这两个服务,于是你创建了服务 C。服务 C 接收 JSON 数据,并把稍微处理后的数据返回,其他什么事也不做。


现在,你的三个服务都耦合在一起了。DTO 到 DTO 的映射应该发生在进程内部,否则的话,可能会有人创建出新的服务来映射服务 A 和服务 C 之间的 DTO。除非服务 C 不会往实体中添加新数据,否则它的存在就不是必要的。一个服务应该只返回它所拥有的数据。


同样,你会为了给一组数字排序而专门创建一个服务吗?


静态内容的映射服务

并不是所有东西都需要被包装成微服务,网站的静态资源,比如脚本、样式表或图像,要么把它们放在主服务器上,要么放在 CDN 上。


对于后端服务,如果需要在初始化的时候读取一些简单的字符串,而这些字符串很少发生变化,可能几个月或者几天才会修改一次,那么可以考虑使用冷存储,比如亚马逊的 S3 或者微软的 BlogStorage。需要访问控制?可以考虑基于 IP 或域名的访问限制。所以,在考虑是否需要创建新的微服务时,要十分谨慎,因为它可能会给你带来巨大的维护和托管成本。


另外请注意,持久存储必须是分布式可伸缩的。出于简单起见,数据应该采用键值对的形式,否则就会遇到与“多个服务共享一个数据库”一样的问题。


将应用程序的配置托管在远程服务上

线程池该配置多少个线程?重试策略该怎么配?本地内存缓存的有效时间设置多久合适?需要通过一个远程服务来配置这些东西吗?在很多情况下,把这些东西放在配置文件或者环境变量里是完全可以的,所以可以先考虑这种方式。如果不行,可以尝试一些已有的配置工具,比如 Consul,尽量避免自己开发浪费时间和精力。


多个服务共享一个数据库

如果架构过于简单,很快也会遇到问题。如果多个服务共享一个数据库,数据库的连接、存储空间和计算能力很快就会不够用。接下来就会出现一些不太好的局面——一些服务使用的表被删掉了。或者,有两个客户端使用了同一张表,其中一个客户单要求对表结构做出修改,这个时候就需要做一些适配才能不影响另一个客户端。在我看来,现在的系统变成了一个分布式单体。


这样做有悖微服务架构的原则,因为微服务应该是独立且自包含的。它们应该拥有自己的数据,并可以完全自由决定该怎么持久化数据。它们存在的目的是为了解耦,为了获得这种灵活性,需要付出一定的代价,但追求灵活性应该成为你的目标。


微服务之间应该通过公开暴露的 API 进行交互。基于 HTTP 的通信可以选择 REST、GraphQL、gRPC,或者也可以使用消息队列,比如 RabbitMQ、Apache Kafka。


结论

希望你们大部分人都很清楚上述的这些问题,不过肯定会有一些人犯下这些错误,也许看了本文后你能学到一些。不管怎样,在微服务这个新奇和多变的世界里犯点错误是在所难免的。


原文链接

Microservices: 3 slips into over-engineering and 1 into under-engineering


2019 年 12 月 10 日 14:292645
用户头像
小智 前 InfoQ 主编

发布了 405 篇内容, 共 335.3 次阅读, 收获喜欢 1833 次。

关注

评论 1 条评论

发布
用户头像
过度设计
2019 年 12 月 17 日 18:44
回复
没有更多了
发现更多内容

100个自媒体运营工具推荐

资源君

运营 工具软件 自媒体 资源分享 工具分享

HarmonyOS学习路之HarmonyOS 概述

爱吃土豆丝的打工人

操作系统 HarmonyOS 鸿蒙系统

有人融资超6亿,有人营收20亿…这届90后创业者有点猛! | 创业邦2021年30位30岁以下创业新贵重磅发布

创业邦

全新升级IoT Stack 2.0和度能2.0,百度持续加码为产业智能化安全护航

百度大脑

百度智能云

击破行业痛点,区块链赋能智慧物流高速发展

旺链科技

区块链 智慧物流

英特尔推出全新的基础设施处理器(IPU)

新闻科技资讯

技术+商业,能否让网易智企一鸣惊人?

ToB行业头条

网易 tob

HarmonyOS学习路之开发基础知识——资源文件

爱吃土豆丝的打工人

鸿蒙 HarmonyOS DevEco资源文件 创建资源文件

【融云视角】沉浸式音频与通讯技术未来趋势

融云 RongCloud

区块链 | 让付费的知识真正“物超所值”

旺链科技

区块链 知识付费

你真的了解 equals 方法吗?

若尘

java编程 equals 6月日更

30家企业单笔融资1亿以上,如何让投资人倒追你的项目

创业邦

重启心智解锁,重新获得一份能力精进指南,面对不确定性的未来,我们可以和世界的变化做好友。

叶小鍵

100个开箱即用的shell脚本,CV大法好,工作不费脑!

北游学Java

Java Shell

HarmonyOS学习路之开发基础——快速入门(编写第一个页面)

爱吃土豆丝的打工人

HarmonyOS 鸿蒙应用开发 DevEco Studio 创建页面 鸿蒙开发第一个页面

HarmonyOS学习路之开发篇——Ability

爱吃土豆丝的打工人

HarmonyOS Ability Ability概述 鸿蒙 Ability

啃完这7套Java面试题,面试阿里P7稳了

Crud的程序员

Java spring 程序员 架构

让宝妈宝爸告别安全顾虑,区块链构建母婴行业新生态

旺链科技

区块链 母婴

政治局会议再提工业互联网产业数字化|区块链如何协同发力?

旺链科技

区块链 工业互联网

GIT基本概念与核心命令

IT视界

git 版本管理

一群不想鸡娃的直男程序员,决定对一支笔下手了

脑极体

JAVA笔记(二)--Java初始

加百利

Java 后端 6月日更

HarmonyOS学习路之开发基础——快速入门(创建另一个页面)

爱吃土豆丝的打工人

HarmonyOS 鸿蒙开发 DevEco Studio 创建新页面 创建另一个页面

HarmonyOS学习路之开发基础——快速入门(实现页面跳转)

爱吃土豆丝的打工人

HarmonyOS DevEco 页面跳转 鸿蒙页面跳转

HarmonyOS 分布式多端应用一站式开发平台(DevEco Studio 安装)

爱吃土豆丝的打工人

操作系统 HarmonyOS 环境变量 DevEco Studio 鸿蒙开发

HarmonyOS学习路之开发基础知识——应用基础知识

爱吃土豆丝的打工人

鸿蒙 HarmonyOS 鸿蒙开发 鸿蒙系统

HarmonyOS学习路之开发基础知识——应用配置文件

爱吃土豆丝的打工人

HarmonyOS 鸿蒙开发 鸿蒙系统 鸿蒙配置文件 deviceConfig

HarmonyOS学习路之开发篇——Page Ability

爱吃土豆丝的打工人

HarmonyOS AbilitySlice路由 AbilitySlice生命周期 AbilitySlice间导航 跨设备迁移

Flink Metric

Alex🐒

flink 翻译 flink1.13

更好链接资金需求 | 区块链如何赋能“链”金融

旺链科技

金融

以互联网行业为背景下的数据分析通识(上)

小飞象@木木自由

数据分析 数据分析体系 数据思维

ShadowRealm 与微前端沙箱

ShadowRealm 与微前端沙箱

微服务架构陷阱:过渡设计和设计不足-InfoQ