本心、输入输出、结果
文章目录
- 系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第四部分:微服务架构
- 前言
- 典型的微服务架构是什么样的
- 微服务的优势
- 微服务最佳实践
- 在开发微服务时,我们需要遵循以下最佳实践:
- 微服务通常使用什么技术堆栈
- ▶️预生产
- ▶️生产
- 为什么卡夫卡(Kafka)很快
- 步骤说明
- 弘扬爱国精神
系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第四部分:微服务架构
编辑:简简单单 Online zuozuo
地址:https://blog.csdn.net/qq_15071263
如果觉得本文对你有帮助,欢迎点赞、收藏、评论
前言
我们使用视觉效果和简单术语来解释复杂的系统是如何运转的,帮助我们理解技术细节
我们使用视觉效果和简单术语来解释复杂的系统是如何运转的,帮助我们理解技术细节
典型的微服务架构是什么样的
下图显示了典型的微服务体系结构。
- 负载均衡器:这会在多个后端服务之间分配传入流量。
- CDN(内容交付网络):CDN 是一组地理位置分散的服务器,用于保存静态内容以加快交付速度。客户端首先在 CDN 中查找内容,然后进行到后端服务。
- API 网关:处理传入请求并将其路由到相关服务。它与标识提供者和服务发现通信。
- 身份提供程序:用于处理用户的身份验证和授权。
- 服务注册和发现:微服务注册和发现发生在此组件中,API 网关在此组件中查找要与之通信的相关服务。
- 管理:此组件负责监视服务。
- 微服务:微服务在不同的域中设计和部署。每个域都有自己的数据库。API 网关通过 REST API 或其他协议与微服务通信,同一域中的微服务使用 RPC(远程过程调用)相互通信。
微服务的优势
- 它们可以快速设计、部署和水平扩展。
- 每个域都可以由专门的团队独立维护。
- 因此,可以在每个域中自定义业务需求并得到更好的支持。
微服务最佳实践
开发微服务的 9 个最佳实践
在开发微服务时,我们需要遵循以下最佳实践:
- 为每个微服务使用单独的数据存储
- 将代码保持在类似的成熟度级别
- 为每个微服务单独生成
- 为每个微服务分配一个职责
- 部署到容器中
- 设计无状态服务
- 采用领域驱动设计
- 设计微前端
- 编排微服务
微服务通常使用什么技术堆栈
下面将显示一个图表,显示开发阶段和生产的微服务技术堆栈
▶️预生产
- 定义 API - 这将在前端和后端之间建立协定。为此,我们可以使用 Postman 或 OpenAPI。
- 开发 - Node.js 或 react 在前端开发中很受欢迎,java/python/go 在后端开发中很受欢迎。此外,我们需要根据 API 定义更改 API 网关中的配置。
- 持续集成 - 用于自动化测试的 JUnit 和 Jenkins。代码打包到 Docker 映像中,并部署为微服务。
▶️生产
- Nginx 是负载均衡器的常见选择。Cloudflare提供CDN(内容交付网络)。
- API 网关 - 我们可以对网关使用 Spring boot,并使用 Eureka/Zookeeper 进行服务发现。
- 微服务部署在云上。我们有AWS,Microsoft Azure或Google GCP之间的选择。 缓存和全文搜索 - Redis 是缓存键值对的常见选择。ElasticSearch 用于全文搜索。
- 通信 - 为了使服务相互通信,我们可以使用消息传递下 Kafka 或 RPC。
- 持久性 - 我们可以将 MySQL 或 PostgreSQL 用于关系数据库,将 Amazon S3 用于对象存储。如有必要,我们还可以将Cassandra用于宽柱存储。
- 管理和监控 - 为了管理如此多的微服务,常见的Ops工具包括Prometheus,Elastic Stack和Kubernetes
为什么卡夫卡(Kafka)很快
有许多设计决策对Kafka的性能做出了贡献。在这篇文章中,我们将重点介绍两个。我们认为这两个人最有分量
- 第一个是 Kafka 对顺序 I/O 的依赖。
- 使 Kafka 具有性能优势的第二个设计选择是它对效率的关注:零拷贝原则。
步骤说明
该图说明了数据如何在生产者和消费者之间传输,以及零拷贝的含义。步骤 1.1 - 1.3:创建者将数据写入磁盘
步骤 2:使用者在没有零拷贝的情况下读取数据2.1 数据从磁盘加载到操作系统缓存2.2 数据从操作系统缓存复制到Kafka应用程序2.3 Kafka 应用程序将数据复制到套接字缓冲区2.4 数据从套接字缓冲区复制到网卡2.5 网卡向消费者发送数据
步骤 3:使用者使用零拷贝读取数据3.1:数据从磁盘加载到操作系统缓存 3.2 操作系统缓存通过 sendfile() 命令直接将数据复制到网卡 3.3 网卡向消费者发送数据零拷贝是在应用程序上下文和内核上下文之间保存多个数据副本的快捷方式