构建微服务时,我们用到的库

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 本文讲的是构建微服务时,我们用到的库【编者的话】构建微服务时,究竟该不该使用库,又有那些代码适合写作库?这里是作者的一些经验之谈。
本文讲的是构建微服务时,我们用到的库【编者的话】构建微服务时,究竟该不该使用库,又有那些代码适合写作库?这里是作者的一些经验之谈。

正如其他通用的解决方案一样,微服务架构也有自己的优劣;有些东西因它变的更简单,同时另一些东西却变的更复杂。当转换到微服务的时候,最常见的挑战就是在哪里使用共享代码的问题。

起初,把常见代码转换成独立库的这种做法听起来很不错。原因很简单,一般我们要在两个文件中用到相同代码的时候,就会把这段代码写成一个函数,而写成库则是在更高层次上达到相同的作用,何乐而不为呢?

但是并非我们想象中那么简单。共享库会造成微服务之间的强依赖,因此应该事先考虑清楚这些为服务在整个服务群中所扮演的角色后再做决定。我在加入Runnable之后亲身经历过这类问题。

举个例子,假设你把域模型抽象进了一个库中,一旦对该模型进行修改,你必须同时更新所有使用这个库的服务。这包括更新代码,通过review,测试,staging等等。这样一来,微服务构架就变成了一个死板的整体。

那么,是不是说微服务就不能和库共存了呢?并不是。Philipp Hauer在 他的文章 中曾解释过一些关于微服务和共享库的特例。

在技术问题(technical concerns)上,使用库是okay的(比如,日志和监控),因为业务需求往往对这些问题没什么影响。
这一点很重要。微服务一般可以分为两类代码:
  1. 域特定代码(Domain specific code)。这类代码针对服务需要处理的问题。比如,所有的业务逻辑和域模型都是这类代码。
  2. 支持代码(Support code),也就是Philipp Hauer所提到的技术问题。就我自己的经验来说,微服务代码中很大一部分都属于支持代码,所以我们应当花点时间来考虑如何更好的组织这些代码。

在Runnable,我们用到了一些库。其中一些是内部开发的,一些则是第三方代码。这些库是我们建立新的微服务的基石。

下面列出一些与我们的一些库相关的技术问题:
  • 监控(monitor dog)——以标准化方式向Datadog报告数据;例如,在每个时间前加上服务名作为前缀。
  • 错误处理(error cat)——提供错误层级结构,该结构由所有服务继承并向Rollbar报告错误。
  • 配置(loadenv)——保证每个微服务都以同种方式加载环境变量。
  • worker服务器(ponos)——包含标准监控和错误报告的常规worker服务器。
  • Docker/Swarm 客户端(loki)——包含标准监控的Docker/Swarm客户端库。
  • 正确性检查(joi)——针对邮箱地址、日期等的正确性检查库。

结论

要正确辨别你的代码中是否需要用到库,这很重要。

这里有几个一般性的经验法则:
  • 如果这段代码中包含业务逻辑或者域特定代码——那这段代码就不应转换为库。
  • 如果这段代码会因新的需求频繁变动——那它也不适合作为库。
  • 如果这段代码会造成消费者间的耦合——它也不适合作为库。

如果以上问题都没有,那就放心去做吧!将一般性的代码转换成独立的库可以加快新服务的开发,因为这样你可以将精力集中在服务需要解决的特定问题上。另外,使用库函数还可以让所有模块的监控、错误处理、和管理配置变得标准一致。

原文链接:Libraries We Use When Building Microservices(翻译:马远征)

原文发布时间为:2016-09-30

本文作者:马远征

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:构建微服务时,我们用到的库

相关文章
|
4天前
|
机器学习/深度学习 人工智能 Java
【Sping Boot与机器学习融合:构建赋能AI的微服务应用实战】
【Sping Boot与机器学习融合:构建赋能AI的微服务应用实战】
8 1
|
8天前
|
监控 API 数据库
构建高效后端:微服务架构的实战指南
【6月更文挑战第14天】在数字化浪潮下,后端开发面临着前所未有的挑战和机遇。本文将深入探讨微服务架构的设计理念、实现方式及其在现代软件开发中的重要性,为读者提供一份全面而实用的微服务实战手册。
18 2
|
10天前
|
消息中间件 监控 API
构建微服务架构:从理论到实践的全面指南
本文将深入探讨微服务架构的设计原则、实施步骤和面临的挑战。与传统的单体架构相比,微服务通过其独立性、可伸缩性和灵活性,为现代应用开发提供了新的视角。文章将介绍如何从零开始规划和部署一个微服务系统,包括选择合适的技术栈、处理数据一致性问题以及实现服务间通信。此外,我们还将讨论在迁移至微服务架构过程中可能遇到的技术和组织挑战,以及如何克服这些难题以实现顺利过渡。
|
18天前
|
运维 Kubernetes 持续交付
构建高效后端:微服务架构的设计与实践
本文深入探讨了微服务架构的设计原则和实践方法,旨在为读者提供一套完整的微服务开发指南。通过分析微服务的核心优势,如灵活性、可扩展性与独立部署能力,文章详细阐述了如何有效规划服务边界、选择合适的通信协议以及确保服务的高可用性和弹性。此外,还讨论了在微服务实施过程中可能遇到的挑战,包括数据一致性和服务发现机制,以及如何通过现代技术栈和最佳实践来克服这些挑战。
|
23天前
|
Kubernetes 负载均衡 开发者
构建高效后端服务:从微服务到容器化部署
【5月更文挑战第31天】本文深入探讨了现代后端开发中的关键概念,包括微服务的架构设计、容器化技术的运用以及它们如何共同提升应用的可扩展性、可靠性和性能。通过具体案例分析,我们将揭示这些技术是如何在实际开发中被实施的,并讨论它们对后端开发流程的影响。
|
23天前
|
消息中间件 数据库 网络架构
构建高效后端:微服务架构的优化策略
【5月更文挑战第31天】在这篇文章中,我们将深入探讨如何通过采用微服务架构来提升后端开发的效率和性能。我们将分析微服务架构的关键优势,并讨论如何克服实施过程中的挑战。通过具体的案例研究,我们将展示如何优化微服务架构以实现最佳的性能和可维护性。无论你是后端开发的新手还是经验丰富的专业人士,这篇文章都将为你提供有价值的见解和实用的技巧。
|
23天前
|
运维 监控 Docker
构建高效微服务架构:从理论到实践构建高效自动化运维体系:Ansible与Docker的完美融合
【5月更文挑战第31天】 在当今软件开发的世界中,微服务架构已经成为了实现可伸缩、灵活且容错的系统的关键策略。本文将深入探讨如何从零开始构建一个高效的微服务系统,涵盖从概念理解、设计原则到具体实施步骤。我们将重点讨论微服务设计的最佳实践、常用的技术栈选择、以及如何克服常见的挑战,包括服务划分、数据一致性、服务发现和网络通信等。通过实际案例分析,本文旨在为开发者提供一套实用的指南,帮助他们构建出既健壮又易于维护的微服务系统。
|
23天前
|
消息中间件 运维 监控
构建高效微服务架构:后端开发的新范式
【5月更文挑战第31天】在现代软件开发中,随着业务需求的多样化和系统复杂性的增加,传统的单体应用架构逐渐显得笨重且难以适应快速变化。微服务架构作为一种新兴的后端开发模式,以其灵活性、可扩展性和独立部署的特点,成为解决这一问题的关键。本文将探讨微服务架构的核心概念、设计原则以及如何在实际项目中实现一个高效的微服务系统。
|
23天前
|
Cloud Native 数据库 开发者
构建高效微服务架构:后端开发的新趋势
【5月更文挑战第31天】 在数字化转型的浪潮中,微服务架构已成为企业技术战略的核心组成部分。本文将深入探讨如何构建一个高效的微服务架构,包括关键的设计原则、技术选型、以及实践中的挑战与解决方案。通过对微服务架构的细致剖析,我们将提供一套实用的指南,帮助后端开发者优化系统结构,提升服务的可靠性、伸缩性和敏捷性。
|
23天前
|
敏捷开发 API 开发者
构建高效微服务架构:后端开发的新趋势
【5月更文挑战第31天】 在现代软件开发的浪潮中,微服务架构已经成为企业追求敏捷开发、持续交付和系统弹性的关键解决方案。本文将深入探讨微服务架构的概念、优势以及如何构建一个高效的微服务系统。通过实际案例分析,我们将展示如何利用容器化、服务网格、API网关等技术手段,实现服务的解耦、分布式管理和网络通信优化。