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

更新日期: 2019-11-09阅读: 1.8k标签: 架构

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


1.  映射服务

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

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

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

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


2. 静态内容的映射服务

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

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

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


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

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


4. 多个服务共享一个数据库

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

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

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


5. 结论

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

原文 http://news.51cto.com/art/201912/607501.htm

链接: https://www.fly63.com/article/detial/6783

微内核架构在大型前端系统中的应用

架构和框架是独立的,本文仅仅是提出一种架构思路,而且这个架构也在百度的某款用户量很大的复杂前端产品中得以应用。基于这一套弹性架构并结合Vue/React的现代化开发理念,可以很好的完成高复杂度的前端系统。

怎么判定web前端架构师的能力高低?

软件架构(software architecture)是一系列相关的抽象模式,用于指导大型软件系统各个方面的设计。传统软件架构描述的对象是直接构成系统的抽象组件,侧重于系统的抽象、拆分、组织方式等

成为一个顶尖架构师

架构师的一个重要职责是,确保团队有共同的技术愿景,以帮助我们向客户交付他们想要的系统。在某些场景下,架构师只需要和一个团队一起工作,这时他们等同于技术引领者。在其他情况下,他们要对整个项目的技术愿景负责,通常需要协调多个团队之间,甚至是整个组织内的工作。

C/S和B/S两种架构区别与优缺点分析

C/S 架构是一种典型的两层架构,其全程是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据

架构/构建高可用的网站

目的为保证服务器硬件故障时依然可用,数据依然保持并能够访问,手段:数据和服务的冗余备份以及失效转移机制,有状态 :在服务端保留之前的请求信息,用以处理当前请求(例如:session)无状态 :没有特殊状态的服务

大型web系统架构详解

动态应用,是相对于网站静态内容而言,是指以c/c++、php、Java、perl、.net等服务器端语言开发的网络应用软件,比如论坛、网络相册、交友、BLOG等常见应用。动态应用系统通常与数据库系统、缓存系统、分布式存储系统等密不可分。

讲讲亿级PV的负载均衡架构

本来没想写这个题材的,为了某某童鞋能够更好的茁壮成长,临时写一篇负载均衡的。负载均衡,大家可能听过什么3层负载均衡、4层负载均衡、7层负载均衡什么的?那这是怎么分的呢,ok,是根据osi七层网络模型来分的,例如nginx是工作在应用层

朱晔的互联网架构实践心得:品味Kubernetes的设计理念

Kubernetes(k8s)是一款开源的优秀的容器编排调度系统,其本身也是一款分布式应用程序。虽然本系列文章讨论的是互联网架构,但是k8s的一些设计理念非常值得深思和借鉴,本人并非运维专家,本文尝试从自己看到的一些k8s的架构理念结合自己的理解来分析 k8s在稳定性

大型网站核心架构要素

一般来说,除了当前的系统功能需求外,软件架构还需要关注性能、可用性、伸缩性、扩展性和安全性这5个架构要素。性能是网站的一个重要指标,任何软件架构设计档案都必须考虑可能会带来的性能问题。

大型网站技术架构 构建高可用的网站 高可用的服务

本章介绍如何去构建高可用的服务,关键词:服务分级,超时设置,异步调用,服务降级,幂等性设计,一些架构设计中的常用方案,但是需要结合实际业务场景进行设计,没有一套方案能解决所有问题

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!