微服务

91次阅读

共计 1856 个字符,预计需要花费 5 分钟才能阅读完成。

概述

优点

第一,它解决了复杂问题。它把可能会变得庞大的单体应用程序分解成一套服务。虽然功能数量不变,但是应用程序已经被分解成可管理的块或者服务。每个服务都有一个明确定义边界的方式,如远程过程调用(RPC)驱动或消息驱动 API。微服务架构模式强制一定程度的模块化,实际上,使用单体代码来实现是极其困难的。因此,使用微服务架构模式,个体服务能被更快地开发,并更容易理解与维护。

第二,这种架构使得每个服务都可以由一个团队独立专注开发。开发者可以自由选择任何符合服务 API 契约的技术。当然,更多的组织是希望通过技术选型限制来避免完全混乱的状态。然而,这种自由意味着开发人员不再有可能在这种自由的新项目开始时使用过时的技术。当编写一个新服务时,他们可以选择当前的技术。此外,由于服务较小,使用当前技术重写旧服务将变得更加可行。

第三,微服务架构模式可以实现每个微服务独立部署。开发人员根本不需要去协调部署本地变更到服务。这些变更一经测试即可立即部署。比如,UI 团队可以执行 A|B 测试,并快速迭代 UI 变更。微服务架构模式使得持续部署成为可能。

最后,微服务架构模式使得每个服务能够独立扩展。您可以仅部署满足每个服务的容量和可用性约束的实例数目。此外,您可以使用与服务资源要求最匹配的硬件。例如,您可以在 EC2 Compute Optimized 实例上部署一个 CPU 密集型图像处理服务,并且在 EC2 Memory-optimized 实例上部署一个内存数据库服务。

缺点

微服务另一个主要缺点是由于微服务是一个分布式系统,其使得 整体变得复杂。开发者需要选择和实现基于消息或者 RPC 的进程间通信机制。此外,由于目标请求可能很慢或者不可用,他们必须要编写代码来处理局部故障。虽然这些并不是很复杂、高深,但模块间通过语言级方法 / 过程调用相互调用,这比单体应用要复杂得多。

微服务的另一个挑战是 分区数据库架构。更新多个业务实体的业务事务是相当普遍的。这些事务在单体应用中的实现显得微不足道,因为单体只存在一个单独的数据库。在基于微服务的应用程序中,您需要更新不同服务所用的数据库。通常不会选择分布式事务,不仅仅是因为 CAP 定理。他们根本不支持如今高度可扩展的 NoSQL 数据库和消息代理。您最后不得不使用基于最终一致性的方法,这对于开发人员来说更具挑战性。

测试微服务应用程序复杂。例如,使用现代框架如 Spring Boot,只需要编写一个测试类来启动一个单体 web 应用程序并测试其 REST API。相比之下,一个类似的测试类对于微服务来说需要启动该服务及其所依赖的所有服务,或者至少为这些服务配置存根。再次声明,虽然这不是一件高深的事情,但不要低估了这样做的复杂性。

微服务架构模式的另一个主要挑战是实现了 跨越多服务变更。例如,我们假设您正在实现一个变更服务 A、服务 B 和 服务 C 的需求,其中 A 依赖于 B,且 B 依赖于 C。在单体应用程序中,您可以简单地修改相应的模块、整合变更并一次性部署他们。相反,在微服务中您需要仔细规划和协调出现的变更至每个服务。例如,您需要更新服务 C,然后更新服务 B,最后更新服务 A。幸运的是,大多数变更只会影响一个服务,需要协调的多服务变更相对较少。

部署基于微服务的应用程序 也是相当复杂的。一个单体应用可以很容易地部署到基于传统负载均衡器的一组相同服务器上。每个应用程序实例都配置有基础设施服务的位置(主机和端口),比如数据库和消息代理。相比之下,微服务应用程序通常由大量的服务组成。例如,据 Adrian Cockcroft 了解到,Hailo 拥有 160 个不同的服务,Netflix 拥有的服务超过 600 个。

每个服务都有多个运行时实例。还有更多的移动部件需要配置、部署、扩展和监控。此外,您还需要实现服务发现机制,使得服务能够发现需要与之通信的任何其他服务的位置(主机和端口)。比较传统麻烦的基于票据(ticket-based)和手动的操作方式无法扩展到如此复杂程度。因此,要成功部署微服务应用程序,需要求开发人员能高度控制部署方式和高度自动化。

一种自动化方式是使用现成的平台即服务(PaaS),如 Cloud Foundry。PaaS 为开发人员提供了一种简单的方式来部署和管理他们的微服务。它让开发人员避开了诸如采购和配置 IT 资源等烦恼。同时,配置 PaaS 的系统人员和网络专业人员可以确保达到最佳实践以落实公司策略。

自动化微服务部署的另一个方式是开发自己的 PaaS。一个普遍的起点是使用集群方案,如 Kubernetes,与 Docker 等容器技术相结合。

正文完
 0

微服务

93次阅读

共计 1483 个字符,预计需要花费 4 分钟才能阅读完成。

微服务架构提供了将大型应用拆分为多个可相互作用的更小服务的一种手段. 每个服务独立交付, 因此每个服务可以脱离主体, 独立部署升级拓展替换. 服务间通信通常依赖 HTTP 调用网络连接.Web sockets, message queuespub/subRPC 也可以用于连接独立组件.
每个独立服务专注单一任务, 通常按内务单元区分, 受 RESTful 规范制约.
课程目标是详述在微服务潮流下开发一款应用. 这里侧重怎么做而较少讨论为什么这么做. 微服务很难. 他们有很多挑战和问题难以解决. 开始拆分你的大块应用前牢记这一点.

Separation of concerns 关注分离
服务间清晰的分离, 开发可以更容易专注他们的专长领域, 比如 语言, 框架, 依赖, 工具, 还有 构建管道. 例如, 一个 前端 JavaScript 工程师可以开发面向客户的视图, 不需要理解后端 API 之下的代码. 他可以自由选择语言框架, 只需要和后端交流通过异步请求消费 RESTful API. 换句话说, 鉴于服务凭借 APIs 通讯开发可以将服务看做一个黑盒, 将实现和复杂隐藏. 也就是说, 这是一个很好的理念来创建全机构的标准来确保每一团队可以一起工作运行 – 比如代码质检和风格检查, 代码检查, API 设计.
清晰的分离意味着错误最大限度的锁定在开发工作的服务内. 因此, 你可以分配给初级程序员非关键服务, 即使服务挂掉, 整个应用也不受影响.
因为每个服务独立部署, 更少的耦合也是的扩展更容易. 对消除团队等待另一个所依赖的团队完成工作现象有一定帮助.
更小的代码库
更少代码库对更容易理解有益, 因为不需要掌握整个系统. 只需要 固化 API 设计, 这意味着微服务栈中通常可以更快开发更容易测试重构和拓展. 记住, 在所有服务站维护一致的代码标准很重要, 因此对于开发中从一个服务转到另一个服务很容易.
加速反馈闭环
微服务中, 开发掌握应用的整个生命周期, 从立项到交付. 替换团队调整使用特定的技术集 – 比如客户端 UI, 服务端, 等等. 因为这样他们可以更清晰的看到应用在真是环境中如何使用. 这加速了反馈闭环, 更容易修复 bugs 和迭代.

设计复杂
决定分离你应用的一块到微服务不是一个容易的任务. 通常重构为一个独立的模块在全部大块中更容易, 而不是分出去. 一旦你分出去没有回头路.
网络复杂
在一个大块应用, 通常所有事在一个单独的线程, 所以不需要很多次调用其它服务. 由于你拆分你的应用为微服务, 你会发现你现在不得不将函数调用改为网络调用. 这会导致很多问题特别是如果多个应用需要和其他服务通信, 结果在网络请求方面产生乒乓效应. 你也不得不考虑服务的整体下降.
基础设施 infrastructure
多服务下, 复杂转化从数据库到平台和基础设施. 消耗很大. 而且, 不得不使用正确的工具和适当的人力资源来管理.
数据持久化
多数应用有类似状态层, 像数据库任务队列. 微服务栈也需要跟踪服务在哪里销毁和全部被摧毁的实例, 这样,当一个特定服务的新实例启动时, 通信量可以适当的调整. 这通常称为服务发现.
由于我们将处理容器, 我们需要特别关注如何处理状态容器因为他们不应下降.
隔离一个特定服务的状态使得他不被分享或复制是一个难以描述的困难. 你不得不经常处理各种不同来源的事实, 不得不频繁的调解. 再说一次, 归结为设计.
集成测试
通常, 开发微服务架构, 你不能完整测试所有服务直到你部署到预发或生产服务器. 获取反馈的时间花费太长. 幸运的是, docker 通过更容易的连接小的独立的本地服务有助于加速这一过程.
日志, 监听, 和调试同样困难.
跟多微服务测试, 参考 Testing Strategies in a Microservice Architecture

正文完
 0