生产环境最佳实践
我们将探讨的微服务架构的最后一个方面是 部署和发布时的一些最佳实践。正如我们之前提到的,发布流水线应该是自动化的,以便团队能够每天多次发布服务。在本节中,我们将简要探讨一些在迁移到微服务架构时需要考虑的常见模式和解决方案。
监控与可观测性
在微服务世界中,了解数据如何在系统中流动以及系统的健康状况可能会很困难。监控和可观测性解决方案 可以缓解这一问题,它们为我们提供了所需的可见性。
可观测性与监控
可观测性和监控经常被互换使用,但它们有不同的目的:可观测性旨在为团队提供调试问题所需的数据,而监控旨在跟踪性能并识别服务异常。这意味着监控是可观测性的一部分。观察需要从对业务有意义的价值角度来审视,以便提供对属性(如可用性、性能和容量)的可靠监控。 |
在本章前面的 Go 中的性能测试 部分中,我们介绍了一些重要的性能指标。除了这些重要指标外,通常还会添加*结构化日志记录*来跟踪应用程序日志。可以通过分析这种类型的日志来了解微服务架构中发生的事件。一些流行的开源结构化日志库包括:
-
logrus( https://github.com/sirupsen/logrus )
-
apex/log( https://github.com/apex/log )。
部署模式
虽然一个坚实的测试策略可以验证系统中的错误和性能问题,但没有任何代码更改或测试策略是完美的。部署模式 将使我们能够逐步发布更改,从而更容易防止中断。以下是两种常见的模式:
-
金丝雀部署(Canary Deployments):将更改发布到一小部分流量中。如果金丝雀版本运行正常,则将更改逐步推广到更大比例的流量中。然而,如果金丝雀部署中记录的指标不理想,我们可以将流量回滚到旧版本的应用程序,该版本仍在运行。这最大限度地减少了处理负面更改影响所需的工作量。
-
蓝绿部署(Blue-Green Deployments):涉及维护两个版本的微服务。蓝色版本运行当前版本的服务,而绿色版本运行更新后的版本。一旦绿色版本通过测试,用户流量将被路由到绿色环境。如果出现错误,流量可以回滚到蓝色版本。当团队确信绿色版本运行正常后,蓝色版本可以从运行环境中移除,或用于下一次迭代。
这两种流行的部署策略可以更容易地在发布新版本的微服务时避免中断,使我们能够在错误率增加时快速回滚到以前的版本。Kubernetes
和服务网格等工具很好地支持了这些策略。
断路器模式
断路器模式(Circuit Breaker Pattern) 是一种开发模式,它可以帮助我们避免级联故障,即一个服务的故障增加其他服务故障的概率。断路器通常封装了对其他微服务的远程调用。一旦对远程服务的调用错误率达到设定的阈值,断路器将立即使其他请求失败,从而为其他服务提供恢复的空间,并向用户提供清晰及时的响应来解释情况,而不是让许多请求处于挂起状态。打开的断路器会在延迟后重试,如果远程服务可用,则关闭并能够传递进一步的请求;如果问题持续存在,则再次打开。
一个流行的开源断路器实现是 hystrix-go( https://github.com/afex/hystrix-go )库,它实现了错误监控和重试。这种模式很简单,但也要求我们为所有远程调用考虑默认值和回退行为。显式实现依赖服务中断的错误情况,为我们的微服务架构带来了更强的弹性。
至此,我们结束了关于微服务架构实现和测试的探讨。正如我们在本章中所看到的,一个全面的测试策略将使我们能够充分利用微服务的力量,但我们必须意识到开发过程中的差异,以便能够高效地使用微服务架构。