微服务路线图
为什么是微服务架构?
如今,随着社交媒体、高速互联网等的兴起,使用应用程序的趋势越来越明显。由于这些行为的变化,单体应用程序需要应对大量的变化。
大多数企业面临着需要在其应用程序中添加新功能的问题,另一方面,需要处理的数据量也越来越大。在很多情况下,单体应用程序由于其开发速度慢、部署速度慢等缺点,几乎无法支持敏捷方法,而敏捷方法正是应对软件行业快速变化的主要理念。
如果您想为大型或复杂的企业创建软件项目(初创项目或融资阶段的项目并非如此,因为它们必须遵循上市时间的限制),最好从微服务架构开始。
因此,提高应用程序灵活性、可扩展性以及其他诸多问题的解决方案之一是采用灵活的架构,例如基于微服务的架构。
为什么需要路线图?
我理解很多开发者都想知道如何开启这段学习之旅。显然,有成千上万的资源可供利用,但问题在于资源过于分散。我决定为这条学习曲线绘制路线图,让这段学习之旅更加清晰。
这个路线图如何运作?
基于微服务的架构包含多个独立的单元,它们协同工作,接收和处理来自不同来源的请求。该架构的某些部分可以作为插件单元,这意味着在需要时,您可以插入新单元或拔出现有单元,而不会干扰应用程序的整体工作。
例如,如果您决定实现微服务架构,您应该熟悉应用程序生命周期中的各种关注点,例如持久性、日志记录、监控、负载平衡、缓存等,此外您还应该知道哪些工具或哪个堆栈更适合您的应用程序。
好吧,这是我文章的主要方法,我将解释关注点,然后介绍一些满足需求的最佳工具。
我解释每个主题来回答这些问题:
- 它是什么?
- 我为什么要使用它?
- 哪些工具更好?
请注意,在工具部分,我只提到了两三种工具。当然,我们还有很多其他工具,选择这些工具的标准是受欢迎程度、性能、开源性以及更新频率。
再次提醒,我们还有一些基于云的服务,但这不在本文的讨论范围内。
我使用上面的图作为架构图示例,因为该图涵盖了大多数微服务架构组件,并且已被公认为标准模型。当然,我知道这张图并非非常全面,但我已尽力使本文尽可能简洁,或许将来我会修改文章并撰写新的版本。我认为解释每个概念的最佳思路应该始终遵循 KISS 模式。
本文解释的概念包括:
• Docker
• 容器编排
• Docker 容器管理
• API 网关
• 负载均衡
• 服务发现
• 事件总线
• 日志记录
• 监控和警报
• 分布式跟踪
• 数据持久性
• 缓存
• 云提供商
Docker
Docker
是一个开源平台,用于容器化您的应用程序,它包含应用程序在各种环境中运行所需的库和依赖项。借助 Docker,开发团队能够将应用程序打包到容器中。
为什么?
实际上,Docker 是容器化应用程序的工具之一,这意味着您无需使用 Docker 即可创建容器。Docker 的真正优势在于它使这个过程更轻松、更安全、更简单。
工具Docker Inc。
Container Orchestration
内容:
在将应用程序容器化后,您将需要一些工具来管理容器化应用程序,以便执行一些手动和自动化操作,例如水平扩展。
原因:
这些工具为您的应用程序管理提供一些服务,例如自动负载均衡,以确保高服务可用性。
此类服务通过定义多个管理器节点来实现,如果一个节点管理器发生故障,其他管理器可以保持应用程序服务的可用性。
工具Kubernetes or K8s,Docker Swarm
Docker Container Management
什么?
管理 Docker 环境、配置管理以及提供环境安全等。这些问题可以通过 Docker 容器管理工具集中化和自动化解决。
为什么? Docker 容器管理工具为用户提供基于 GUI 的工具,用户无需使用并非所有人都习惯的 CLI。这些工具为开发人员提供了丰富的 UI 来构建和发布镜像,
并通过提供简化的用户界面,使一些操作任务(例如服务水平扩展)更容易执行。
工具Portainer、、、DockStationKitematicRancher
API Gateway
API网关
可以被视为一种 API 管理工具,充当应用服务和不同客户端之间的中间件。API 网关可以管理许多功能,例如:
Routing:网关接收所有 API 请求并将其转发到目标服务。
Logging:您将能够在一个地方记录所有请求。
Authorization:检查您是否有资格访问该服务,如果没有,则可以短路该请求
Performance profiling:您可以估算每个请求的执行时间并检查应用程序的瓶颈。
Caching:通过在网关级别处理缓存,您可以消除服务上的大量流量。
事实上,它就像一个反向代理,客户端只需要知道你的网关,应用服务就可以对外部隐藏。
为什么?
如果没有 API 网关,你可能需要在每个服务中实现一些横切关注点,例如,如果你想记录服务的请求和响应。
此外,如果你的应用程序包含多个服务,你的客户端需要知道每个服务的地址,并且如果更改服务地址,则需要更新多个位置。
工具Kong,Ocelot
Load Balancing
我们选择微服务架构最重要的原因之一
是可扩展性,这意味着我们可以通过运行更多服务实例来处理更多请求。但问题是,哪个实例应该接收请求?或者客户端如何知道哪个服务实例应该处理请求?
这些问题的答案是负载均衡。负载均衡意味着在服务实例之间共享收入流量。
为什么?为了扩展独立服务,您需要运行多个服务实例。使用负载均衡器,客户端
无需知道哪个实例提供服务。
工具Traefik,,NGINXSeesaw
Service Discovery
什么?
随着应用服务数量的不断增加,服务需要彼此了解服务实例的地址。但在包含大量服务的大型应用程序中,这难以实现。因此,我们需要服务发现,它负责提供应用程序中所有组件的地址,以便它们能够轻松地向服务发现服务发送请求并获取可用的服务实例地址。
为什么?当您的应用程序中可以包含多个服务时,服务发现是您应用程序的
必备功能。
您的应用服务不需要知道每个服务实例的地址,这意味着服务发现为您铺平了道路。
工具Consul、、和ZookeeperEurekaetcdKeepalived
Event Bus
在微服务架构模式中,您将使用两种不同类型的通信。同步Sync通信Async是
指服务通过 HTTP 调用或 GRPC 调用相互调用。Async消息总线通信是指服务通过消息总线或事件总线相互交互,这意味着服务之间没有直接连接。
虽然您的架构可以同时使用这两种通信方式,例如,在一个在线商店的示例中,您可以在每次订单注册时发送消息,订阅了特定频道的服务将接收该消息。但有时您可能需要一些实时查询,例如,您需要知道某件商品的数量,您可以使用 GRPC 或 HTTP 调用在服务之间获取响应。
为什么?
如果您想要一个包含多个服务的可扩展应用程序,您需要遵循的原则之一是创建松耦合的服务,并通过事件总线相互交互。此外,如果您需要创建一个能够插入新服务以接收一系列特定消息的应用程序,则需要使用事件总线
工具RabbitMQ。Kafka
Logging
什么?
使用微服务架构模式时,最好集中管理服务日志。这些日志可用于调试问题,或根据日志类型聚合日志以供分析使用。
为什么?
如果您需要调试请求,而又没有将服务日志集中到一处,可能会遇到困难。您还可以将与特定请求相关的日志与唯一的关联 ID 关联起来。这意味着,与某个请求相关的不同服务中的所有日志都可以通过此关联 ID 访问。
工具Elastic Logstash
Monitoring And Alerting
微服务架构是什么?如果您想拥有一个可靠的应用程序或服务,就必须监控应用程序的功能、性能、通信以及其他所有方面,以确保应用程序的可靠性。
为什么?您需要监控整体功能和服务的健康状况,还需要监控性能瓶颈并制定修复计划。通过在关键节点为服务设置早期警报来减少服务停机
时间,从而优化用户体验。监控服务在高负载等情况下的整体资源消耗情况。
工具Prometheus、、KibanaGrafana
Distributed Tracing
调试
始终是开发人员关注的重点之一,正如你们一样,每个人都有跟踪或调试单片机的经验。这非常简单易行。但是,当涉及到微服务架构时,由于请求可能通过不同的服务传递,代码库不集中,这使得调试和跟踪变得困难,因此分布式跟踪工具可以提供帮助。
为什么?如果没有分布式跟踪工具,很难甚至无法通过不同的服务跟踪请求。借助这些工具,
您可以借助丰富的用户界面(用于演示请求流程)轻松地跟踪请求和事件。
工具OpenTelemetry,,JeagerZipkin
Data Persistence
在大多数系统中,我们需要持久化数据,因为我们需要这些数据来进行进一步的处理或生成报表等。为了持久化数据,我们需要一些工具将应用程序数据写入不同结构的物理文件。为什么
?
在单体应用中,我们通常使用一两种不同的持久化类型,并且大多数单体应用使用关系型数据库,例如 SQL Server、Oracel、MySQL。但在微服务架构中,我们应该遵循“每个服务一个数据库”模式,这意味着每个微服务的持久化数据对该服务来说是私有的,并且只能通过其 API 访问。
嗯,对于不同的用途和场景,你会使用不同的数据库。例如,报表服务可能会使用 NoSQL 数据库,例如 ElasticSearch 或 MongoDB,因为它们使用文档基础结构。这意味着这些数据库中持久化数据的结构与关系型数据库不同,关系型数据库适用于数据读取或获取频率较高的服务。
另一方面,在某些微服务中,你可能需要使用关系型数据库,例如 Oracle 或 SQL SERVER,或者你还需要一些支持图结构或键值结构的数据库。因此,在微服务架构中,根据服务任务,
您需要不同类型的数据库。工具
:
关系数据库或 RDBMS:PostgreSQL,,, NoSQL 数据库:,,MySQLSQL SERVREOracleMongoDBCassandraElasticsearch
Caching
缓存可以减少微服务架构中服务间通信的延迟。缓存是一个高速数据存储层,用于存储数据子集。当从缓存请求数据时,其传输速度比访问数据的主存储位置更快。为什么
?
在微服务架构中,有很多策略可以通过这些方式实现缓存。例如
1- 嵌入式缓存(分布式和非分布式)
2- 客户端-服务器缓存(分布式)
3- 反向代理缓存(Sidecar)
为了减少延迟,可以在不同的层级实现缓存。这意味着响应时间会更长。此外,你还可以实现分布式缓存,它可供多个微服务访问,有时也被视为共享资源的占位符,这些资源有不同的用途,例如速率限制:速率限制最常见的原因是通过避免资源匮乏来
提高基于 API 的服务的可用性。
工具Redis (REmote DIctionary Server)、、Apache IgniteHazelcast IMDG
Cloud Provider
什么是
云服务提供商?云服务提供商是提供基于云的平台、基础设施、应用程序或存储服务的第三方公司。就像房主支付电费或煤气费一样,公司通常只需根据业务需求支付其使用的云服务费用。微软
对于云提供商来说,最重要的类别是
1- 软件即服务 (SaaS)。2-
平台即服务 (PaaS)。3-
基础设施即服务 (IaaS)。
原因
使用云计算服务的一大优势是,企业可以避免拥有和维护自有 IT 基础设施的前期成本和复杂性,只需在使用时按实际使用量付费即可。如今,企业无需拥有自己的计算基础设施或数据中心,而是可以租用从应用程序到存储的一切资源。
工具Amazon Web Services (AWS)、、、Microsoft AzureGoogle CloudAlibaba Cloud
结论
在本文中,我尝试演示与微服务架构模式相关的路线图。如果您想从头开始实现微服务架构,或者将单体架构迁移到微服务架构,则需要了解这些概念。
除了这些概念之外,还有其他概念,例如服务网格、缓存和持久化,它们也可以包含在这份路线图中,但为了简洁起见,我特意没有提及它们。
欢迎您提出您的意见,并为这份路线图提供其他概念。
在Medium上关注我
文章来源:https://dev.to/mattqafouri/microservice-roadmap-4mci
后端开发教程 - Java、Spring Boot 实战 - msg200.com

