过去的单体应用程序已经无法满足日益增进的技术需求。因此人们迫切地需要一种技术架构来解决这些问题,于是,微服务架构诞生了。
通过采用微服务架构,人们可以显著地提高应用程序的灵活性、可扩展性。
微服务总览
基于微服务的架构有几个独立的单元,它们通过彼此的协同工作来接收和处理来自各种来源的请求。
这些独立的单元也叫作插件单元,你可以在需要的时候对它们进行替换和修改,而这些操作不会影响程序的整体工作。
如果你决定实现一个微服务架构,你应该熟悉应用程序生命周期中的各种关注点,如持久化、日志记录、监控、负载均衡、缓存等,此外你应该知道哪些工具或哪些技术栈更适合您的应用程序。
微服务构成
Docker
Docker 是一个开源平台,用于应用程序进行打包分发,其中包含应用程序在各种环境中运行所需的库和依赖项。在Docker的帮助下,开发团队可以将应用程序打包成容器。实际上,Docker是容器化应用程序的工具之一,这意味着你也可以不使用Docker来创建容器,Docker的真正好处是使这个过程更轻松、更安全、更简单。
在你容器化你的应用之后,你需要一些工具来管理容器化的应用来做一些手动和自动化的操作,比如水平扩展。这些工具为你的应用管理提供一些服务,比如自动负载均衡,保证高服务可用性。
这种服务通过定义多个管理器节点来完成,如果一个节点管理器出现任何故障,其他管理器可以保持应用程序服务可用。
管理 Docker 环境、配置管理、提供环境安全等,这些问题可以通过 docker 容器管理工具集中自动化。
API 网关
API 网关可以被视为一种 API 管理工具,它充当您的应用程序服务和不同客户端之间的中间件。
API 网关可以管理下面这些事情:
- 路由:网关接收所有 API 请求并将它们转发到目标服务。
- 日志记录:统一记录所有请求。
- 授权:检查用户是否有权限访问该服务。
- 性能分析:估计每个请求的执行时间并检查您的应用程序瓶颈。
- 缓存:通过在网关级别处理缓存,可以消除服务上的大量流量。
负载均衡
实际上,它是作为反向代理工作的,客户端只需要知道你的网关,应用服务就可以实现对外隐藏。例如,如果您想记录服务的请求和响应。如果您的应用程序由多个服务组成,您的客户端需要知道每个服务地址,并且在更改服务地址的情况下,应该更新多个地方。
将能够通过运行更多的服务实例来处理更多的请求,但问题是,哪个实例应该接收请求或者客户端如何知道哪个服务实例应该处理请求吗?这些问题的答案是负载平衡。负载均衡意味着在一个服务实例之间共享收入流量。为了扩展独立服务,需要运行多个服务实例。
使用负载均衡器,客户端不需要知道服务的正确实例。
服务发现
随着你的应用服务数量越来越多,服务需要知道彼此的服务实例地址,但是这在很多的大型应用程序中,这是无法处理的。所以我们需要引入服务发现,它负责提供应用中所有组件的实际地址,它们可以轻松地向服务发现服务发送请求并获取可用的服务实例地址。当你的应用中可以有多个服务时,服务发现是一个您的应用程序的必备工具。您的应用程序服务不需要知道每个服务实例地址,这意味着服务发现为您铺平了道路。
事件总线
在微服务架构模式中,您将使用两种不同类型的通信,同步和异步通信。
同步通信意味着服务通过 HTTP 调用或 GRPC 调用相互调用。
异步通信意味着服务通过消息总线或事件总线相互交互,这意味着服务之间没有直接连接。
虽然架构可以同时使用两种通信方式,但同时我们也需要服务之间使用 GRPC 或 HTTP 调用来获取响应。这些服务通过事件总线相互交互。此外,如果您需要创建一个能够插入新服务以接收一系列特定消息的应用程序,则需要使用事件总线。在事件总线中,常用的工具有 RabbitMQ、Kafka。
日志采集
当使用微服务架构模式时,最好集中你的服务日志。这些日志将用于调试问题或根据其类型聚合日志以供分析用途。任何需要调试请求的情况下,如果您不在一个地方收集服务日志,您可能会遇到困难。您还可以将与特定请求相关的日志与唯一的相关 ID 相关联。这意味着与请求相关的不同服务中的所有日志都可以通过此关联 Id.ToolsElastic Logstash 访问
监控和警报
在微服务架构中,如果你想拥有一个可靠的应用程序或服务,你必须监控应用程序的功能、性能、通信和任何其他方面,以实现一个负责任的应用程序。为什么你需要监控整体功能和服务健康,还需要监控性能瓶颈并准备解决它们的计划。通过在关键点定义服务的早期警报来减少服务的停机时间,从而优化用户体验。监控服务的整体资源消耗,当负载过重时等。
分布式跟踪
调试始终是开发人员最关注的问题之一,单体调试很简单,但是在微服务架构上,因为一个请求可能会通过不同的服务,这使得调试和跟踪变得困难,因为代码库不在一个地方,所以这里使用分布式跟踪工具会很有帮助。
如果没有分布式跟踪工具,通过不同的服务跟踪您的请求是几乎不可能。借助OpenTelemetry、Jeager、Zipkin这些工具,您可以借助丰富的 UI 来演示请求的流程,轻松跟踪请求和事件。
结论
微服务是一个非常庞大的技术,它要求你懂得很多技术栈,一开始你可能摸不清头绪,不过这都不要紧,当你完整接触或者使用过一个微服务的架构之后,你就会对它慢慢有所了解,并且能够知道为什么微服务需要那些技术,因为每一个技术都是为了解决某个技术出现的,没有过多的设计,一切都是刚刚好。