微服务+云原生:打造高效、灵活的分布式系统

🐇明明跟你说过:个人主页

🏅个人专栏:《未来已来:云原生之旅》🏅

🔖行路有良友,便是天堂🔖

目录

一、引言

1、云原生概述

2、微服务概述

二、微服务架构基础

1、微服务架构的定义与特点

2、微服务与单体应用的对比

3、微服务架构的核心组件

3.1 服务注册与发现 

3.2 API网关

3.3 服务间通信

3.4 负载均衡

4、微服务架构的设计原则


一、引言

1、云原生概述

云原生是一种利用云计算平台及其服务来构建和运行应用程序的方法。云原生应用旨在充分利用云环境的灵活性、可扩展性和弹性。其核心理念是通过微服务架构、容器化、持续集成/持续交付(CI/CD)、无服务器架构等技术,使得应用能够更快速地开发、部署和运行。

2、微服务概述

微服务(Microservices)是一种软件架构风格,它将一个复杂的大型应用程序拆分成多个小的、独立部署的服务。每个服务只负责单一的功能或业务能力,通过轻量级的通信机制(通常是 HTTP/REST 或消息队列)进行交互。微服务架构强调服务的松耦合和高内聚,使得应用程序更加灵活、可维护和可扩展。

二、微服务架构基础

1、微服务架构的定义与特点

微服务架构是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。它围绕业务领域组件来创建应用,这些应用可独立地进行开发、管理和迭代。在分散的组件中使用云架构和平台式部署、管理和服务功能,使产品交付变得更加简单。

微服务架构的特点
1. 独立部署

  • 每个微服务可以独立开发、测试、部署和扩展,不需要停止或重启整个系统。


2. 单一职责

  • 每个微服务专注于一个特定的业务功能,确保代码的高内聚和低耦合,符合单一职责原则(SRP)。


3. 轻量级通信

  • 微服务之间通过轻量级的通信协议(如HTTP/REST、gRPC、消息队列等)进行交互,保持服务的松耦合。


4. 自治性

  • 每个微服务拥有自己的数据存储和业务逻辑,能够独立运行和演进,不依赖其他服务。


5. 多技术栈

  • 各个微服务可以使用不同的编程语言、框架和技术栈,根据具体的业务需求和团队技术专长进行选择。


6. 去中心化治理

  • 微服务架构鼓励去中心化的管理和治理,团队可以自主选择适合的技术工具和开发方法。


7. 容错性和弹性

  • 微服务架构支持服务的隔离和容错设计,一个服务的故障不会影响整个系统的可用性,同时支持服务的自动扩展和恢复。


8. 持续交付与持续部署(CI/CD)

  • 微服务架构支持持续集成和持续交付,使得新功能和修复能够快速上线,缩短开发周期和反馈时间。

2、微服务与单体应用的对比

单体应用(Monolithic Application):

  • 单体应用将所有功能模块和组件集成在一个单一的代码库和部署单元中。整个应用程序作为一个整体进行开发、测试、部署和扩展。


微服务架构(Microservices Architecture):

  • 微服务架构将应用程序拆分为一组独立的小服务,每个服务负责一个特定的业务功能。这些服务可以独立开发、测试、部署和扩展,通过轻量级的通信机制(如HTTP/REST或消息队列)进行交互。


单体应用的优点:

1. 简单性:

  • 初始开发和部署较为简单,所有代码在一个项目中,方便管理。


2. 性能:

  • 在同一进程内调用方法,性能较好,没有网络通信的开销。


3. 一致性:

  • 所有组件共享同一个数据库,数据一致性管理较为简单。


单体应用的缺点:

1. 可维护性差:

  • 随着代码库的增大,代码的复杂度也增加,维护变得困难。


2. 部署困难:

  • 任何一个小改动都需要重新部署整个应用,风险和成本较高。


3. 扩展性差:

  • 无法针对某个模块单独扩展,所有模块必须一起扩展,资源浪费严重。


4. 灵活性低:

  • 技术栈难以更换,某个模块需要新技术时,整个应用都要受影响。

微服务架构的优点:

1. 独立部署:

  • 各个服务可以独立开发、测试、部署和扩展,不影响其他服务。


2. 技术多样性:

  • 每个服务可以使用最适合的技术栈,满足不同的业务需求。


3. 可维护性高:

  • 每个服务职责单一,代码量小,维护和理解起来更容易。


4. 弹性和容错:

  • 一个服务的故障不会影响整个系统,易于实现高可用和容错设计。


5. 独立扩展:

  • 可以根据业务需求单独扩展某个服务,提高资源利用率。


微服务架构的缺点:

1. 分布式系统复杂性:

  • 服务间通信、数据一致性、服务发现、负载均衡等分布式系统的复杂性增加。


2. 运维复杂性:

  • 多个服务的部署、监控、日志管理变得更加复杂,需要完善的运维工具。


3. 网络延迟:

  • 服务间通过网络通信,引入网络延迟和可靠性问题,需要优化通信机制。


4. 数据管理复杂性:

  • 数据去中心化,跨服务的数据一致性和事务管理变得复杂。

3、微服务架构的核心组件

3.1 服务注册与发现 

什么是服务注册与发现?


服务注册与发现是微服务架构中的一种机制,用于让分布式服务自动找到彼此。想象一下,有很多小商店(微服务)分布在城市的各个角落,每个商店提供不同的商品或服务。为了方便顾客(其他服务或客户端)找到这些商店,我们需要一个“服务登记处”(服务注册中心),顾客可以通过它找到并访问商店。

服务注册与发现的工作流程


1. 服务注册:

  • 每个商店(服务)开业时都会到“服务登记处”(服务注册中心)登记自己的信息,比如地址、电话、提供的服务等。
  • 例如,一个提供用户认证的服务启动后,会告诉服务注册中心:“我在这里,我的地址是这个,我提供用户认证服务”。


2. 服务发现:

  • 当顾客(其他服务或客户端)需要某项服务时,他们会到服务登记处询问这项服务的具体位置。
  • 例如,一个订单处理服务需要验证用户身份时,它会问服务注册中心:“用户认证服务在哪里?” 服务注册中心就会告诉它:“在这个地址,你可以联系它”。


服务注册中心就像是一个“电话簿”或“黄页”。

  • 电话簿中登记了所有商店的联系信息(服务地址)。
  • 任何人(服务或客户端)都可以通过电话簿找到需要的商店(服务)。


服务注册就像是商店在开业时向电话簿公司登记自己的信息。

  • 每个商店(服务)开业时都会打电话给电话簿公司(服务注册中心),说:“请把我的信息登上去,让大家知道我在哪里”。


服务发现就像是顾客通过电话簿找商店。

  • 当顾客需要某种服务时,他们会翻开电话簿(查询服务注册中心),找到提供这种服务的商店(服务)的地址和电话。

3.2 API网关

什么是API网关?
API网关(API Gateway)是微服务架构中的重要组件,充当客户端和微服务之间的中介。它接收所有客户端请求,将这些请求路由到适当的微服务,并把微服务的响应返回给客户端。API网关可以处理各种任务,如请求路由、负载均衡、缓存、鉴权和监控等。


可以把API网关想象成一个餐厅的前台。顾客(客户端)到餐厅(系统)来点菜(请求),前台(API网关)接待顾客,并把订单分发给后厨的不同厨师(微服务)来准备不同的菜品(处理请求)。然后,前台再把准备好的菜品送到顾客桌上(返回响应)。

API网关的核心功能
1. 请求路由:

  • 将客户端请求路由到对应的微服务。例如,用户服务请求被路由到用户微服务,订单服务请求被路由到订单微服务。


2. 负载均衡:

  • 将请求分发到多个服务实例,以均衡负载,提升系统的可用性和性能。


3. 认证与鉴权:

  • 处理用户认证和权限检查,确保只有经过授权的请求才能访问相应的服务。


4. 聚合请求:

  • 将多个微服务的请求聚合为一个请求,减少客户端的请求次数。例如,客户端需要用户信息和订单信息,可以通过一次请求获取。


5. 缓存:

  • 对常用数据进行缓存,以减少微服务的负载和响应时间。


6. 日志和监控:

  • 记录请求日志和监控请求流量,以便进行故障排除和性能优化。


7. 速率限制:

  • 限制每个客户端在一定时间内的请求次数,防止服务过载。


8. 安全:

  • 提供统一的安全策略,如SSL终止,防止恶意攻击和数据泄露。

为什么需要API网关?
1. 简化客户端开发:

  • 客户端只需与API网关交互,而不需要了解各个微服务的具体地址和接口,简化了客户端开发和维护。

2. 集中管理:

  • 安全、认证、日志、监控等功能集中在API网关上,简化了各微服务的实现,使它们专注于自身业务逻辑。

3. 提升性能:

  • 通过缓存和负载均衡,API网关可以提升系统的性能和响应速度。

4. 增强安全性:

  • API网关可以提供统一的安全策略和认证机制,提升系统的整体安全性。


举个简单的例子
假设你有一个电商平台,有三个微服务:用户服务、订单服务和商品服务。

  • 用户服务:处理用户的注册、登录、信息更新等操作。
  • 订单服务:处理用户的下单、支付、订单查询等操作。
  • 商品服务:处理商品的展示、查询、库存管理等操作。


当用户在客户端进行下单操作时,客户端会通过API网关发送请求。API网关根据请求内容,将请求路由到相应的微服务。具体流程如下:

  1. 用户登录:客户端发送登录请求到API网关,API网关将请求转发到用户服务进行身份验证。
  2. 商品查询:客户端发送商品查询请求到API网关,API网关将请求转发到商品服务获取商品信息。
  3. 下订单:客户端发送下订单请求到API网关,API网关将请求转发到订单服务处理订单。


API网关在这个过程中,还可以对请求进行鉴权、限流和日志记录,确保系统的安全和稳定。通过API网关,客户端可以简化与微服务的交互,而微服务可以专注于各自的业务逻辑,提升了系统的可维护性和扩展性。

3.3 服务间通信


在微服务架构中,应用被拆分为多个小而独立的服务,每个服务负责特定的业务功能。这些服务需要相互协作才能完成复杂的业务逻辑,因此服务间通信成为微服务架构的核心组件之一。服务间通信指的是这些独立的服务如何相互传递数据和指令,以实现系统的整体功能。

服务间通信的两种主要方式
1. 同步通信:

  • REST(Representational State Transfer):
    • 基于HTTP协议的同步通信方式,使用标准的HTTP方法(如GET、POST、PUT、DELETE)进行数据交换。REST API是最常用的同步通信方式。
  • gRPC(Google Remote Procedure Call):
    • 基于HTTP/2协议的高性能RPC框架,使用Protocol Buffers作为接口定义语言(IDL)。gRPC支持双向流、负载均衡、认证和多语言开发。


2. 异步通信:

  • 消息队列(Message Queue):
    • 使用消息中间件(如RabbitMQ、Kafka)进行异步通信。服务发送消息到消息队列,接收方服务从消息队列中消费消息。消息队列保证消息的可靠传输和顺序处理。
  • 事件驱动(Event-Driven):
    • 使用事件总线(如Kafka、EventBridge)进行异步事件传播。服务发布事件到事件总线,订阅者服务接收和处理事件。事件驱动架构解耦了服务间的依赖关系。


同步通信:像是打电话。一个服务(A)打电话给另一个服务(B),双方需要同时在线,A提出请求,B即时响应。
异步通信:像是发邮件。服务A发送邮件给服务B,B可以在任何时间接收并处理邮件,双方不需要同时在线。


为什么需要服务间通信
1. 分布式架构:

  • 微服务架构将单体应用拆分为多个独立服务,这些服务需要通过通信协作完成复杂业务。


2. 解耦和独立部署:

  • 服务间通信使得各个服务可以独立开发、测试、部署和扩展,而无需担心其他服务的实现细节。


3. 提高系统的可扩展性和容错性:

  • 服务间通信支持水平扩展,消息队列和事件驱动方式还提供了天然的容错机制,可以提高系统的可用性和可靠性。

3.4 负载均衡

负载均衡(Load Balancing)是一种技术,用于将网络流量或请求均匀分配到多个服务器上,以确保系统的高可用性和高性能。它是微服务架构中的关键组件之一,能够有效避免单点故障,提高系统的响应速度和处理能力。

负载均衡的工作原理
负载均衡器位于客户端和后端服务之间,接受客户端请求并将其分配给后端的一台或多台服务器。负载均衡器通常基于某些算法或策略来决定如何分配请求,例如轮询、最少连接、加权轮询等。

负载均衡的类型
1. 硬件负载均衡:

  • 使用专用的硬件设备进行负载均衡,如F5、Citrix NetScaler。硬件负载均衡器通常具有高性能和高可靠性,但成本较高。


2. 软件负载均衡:

  • 使用软件解决方案进行负载均衡,如HAProxy、Nginx、Apache Traffic Server。这些软件可以部署在通用服务器上,成本较低且易于配置和扩展。


3. DNS负载均衡:

  • 基于DNS(域名系统)的负载均衡,通过返回不同的IP地址将流量分配到不同的服务器。适用于分布在不同地理位置的服务器之间的流量分配。


负载均衡的算法
1. 轮询(Round Robin):

  • 按顺序将请求依次分配给后端服务器,简单且常用。


2. 最少连接(Least Connections):

  • 将请求分配给当前处理连接最少的服务器,适用于长连接的场景。


3. 加权轮询(Weighted Round Robin):

  • 根据服务器的性能分配权重,将请求按权重比例分配给服务器。


4. 源地址哈希(Source IP Hash):

  • 基于客户端IP地址的哈希值进行分配,确保同一IP地址的请求分配到同一台服务器上,适用于需要会话保持的场景。


想象一个繁忙的餐厅,有多个服务员为顾客提供服务。负载均衡就像餐厅的经理,他负责将到来的顾客分配给空闲的服务员,以确保每个顾客都能尽快得到服务,而不会有某个服务员过于忙碌或闲置。

4、微服务架构的设计原则

1. 单一职责原则(Single Responsibility Principle)

  • 每个微服务应只负责一个特定的业务功能。这样,服务的职责清晰,代码简单,易于理解和维护。单一职责原则有助于在变更时减少影响范围,从而提高系统的稳定性和可维护性。

2. 独立部署(Independent Deployment)

  • 微服务应独立部署,独立更新。这样可以实现快速迭代和发布,而不会影响其他服务。独立部署要求服务之间的依赖性尽量减少,避免紧耦合。

3. 去中心化治理(Decentralized Governance)

  • 微服务架构提倡去中心化治理,每个服务可以使用最适合其功能和团队的技术栈和工具。这样可以避免单一技术的局限性,发挥团队的技术特长。

4. 去中心化数据管理(Decentralized Data Management)

  • 每个微服务应拥有自己的数据存储,避免共享数据库。这样可以使服务独立,降低耦合度,提高系统的弹性和扩展性。

5. 接口契约(API Contracts)

  • 微服务之间的通信应通过明确的API契约来定义。这些API契约应稳定且明确,避免随意变更接口,从而保证服务之间的互操作性和可靠性。

6. 弹性设计(Resilience Design)

  • 微服务应设计为在故障情况下能够自动恢复,确保系统的高可用性。使用熔断器、重试机制、超时设置等技术来增强服务的弹性。

7. 服务发现(Service Discovery)

  • 微服务架构中,服务实例的数量和位置是动态变化的,因此需要服务发现机制。服务发现可以自动注册和查找服务实例,实现服务的动态扩展和负载均衡。

  💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于云原生的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/744885.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二、反应式集成-spring

一、Spring WebFlux what 1、简介 - Spring WebFlux 包含一个用于执行 HTTP 请求的客户端。 有一个 基于 Reactor 的功能性、流畅的 API,请参阅 Reactive Libraries, 它支持异步逻辑的声明性组合,而无需处理 线程或并发。它是完全无阻塞的…

Talking Web

1. curl 1.1 http curl http://127.0.0.1:80 向目标主机端口发送http请求 1.2 httphead curl -H “Host: 18ed3df584cd48328b5839443aa7b42b” http://127.0.0.1:80 1.3 httppath curl http://127.0.0.1:80/853c64cd218f80d0a59665666fb2ab80 1.4 URL编码路径 &#xff0…

Python学习笔记21:进阶篇(十)常见标准库使用之math模块,random模块和statistics模块

前言 本文是根据python官方教程中标准库模块的介绍,自己查询资料并整理,编写代码示例做出的学习笔记。 根据模块知识,一次讲解单个或者多个模块的内容。 教程链接:https://docs.python.org/zh-cn/3/tutorial/index.html 数学 P…

微软结束将数据中心置于海底的实验

2016 年,微软 宣布了一项名为"纳蒂克项目"(Project Natick)的实验。基本而言,该项目旨在了解数据中心能否在海洋水下安装和运行。经过多次较小规模的测试运行后,该公司于 2018 年春季在苏格兰海岸外 117 英尺…

从0开始C++(八):多态的实现

相关文章: 从0开始C(一):从C到C 从0开始C(二):类、对象、封装 从0开始C(三):构造函数与析构函数详解 从0开始C(四):作…

React+TS前台项目实战(十九)-- 全局Input组件封装:加载状态和清除功能的实现

文章目录 前言Input组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天我们来封装一个input输入框组件,并提供一些常用的功能,你可以选择不同的 尺寸、添加前缀、显示加载状态、触发回调函数、自定义样式 等等。这些功能在这个项目中…

vite+vue3+ts项目搭建流程 (pnpm, eslint, prettier, stylint, husky,commitlint )

vitevue3ts项目搭建 项目搭建项目目录结构 项目配置自动打开项目eslint①vue3环境代码校验插件②修改.eslintrc.cjs配置文件③.eslintignore忽略文件④运行脚本 prettier①安装依赖包②.prettierrc添加规则③.prettierignore忽略文件④运行脚本 stylint①.stylelintrc.cjs配置文…

【云原生】Kubernetes网络知识

Kubernetes网络管理 文章目录 Kubernetes网络管理一、案例概述二、案例前置知识点2.1、Kubernetes网络模型2.2、Docker网络基础2.3、Kubernetes网络通信2.3.1、Pod内容器与内容之间的通信2.3.2、Pod与Pod之间的通信 2.4、Flannel网络插件2.5、Calico网络插件2.5.1、Calico网络模…

免费下载电子书的网站

在如今的数字化时代,电子书已成为许多人书籍阅读的首选。下面小编就和大家分享一些提供免费查找下载电子书服务的网站,这些网站不仅资源丰富,而且操作简便。 免费下载电子书的网站:https://www.bgrdh.com/favorites/1355.html 1…

数据可视化期末考试(编程)

1.KNN 1.新增数据的分类 import pandas as pd # 您的原始数据字典 data { 电影名称: [电影1, 电影2, 电影3, 电影4, 电影5], 打斗镜头: [10, 5, 108, 115, 20], 接吻镜头: [110, 89, 5, 8, 200], 电影类型: [爱情片, 爱情片, 动作片, 动作片, 爱情片] } …

昇思25天学习打卡营第8天 | 模型的保存与加载

内容介绍:在训练网络模型的过程中,实际上我们希望保存中间和最后的结果,用于微调(fine-tune)和后续的模型推理与部署,本章节我们将介绍如何保存与加载模型。 具体内容: 1. 导包 import numpy…

1.1 MySQL用户管理

1.1.1 用户的定义 用户名主机域 mysql> select user,host,password from mysql.user; --------------------------------------------------------------- | user | host | password | -----------------------------------------…

el-form重置后input无法输入问题

新增用户遇到的问题: 如果你没有为 formData 设置默认值,而只是将其初始化为空对象 {},则在打开dialog时,正常输入, formdata会变成如下 但是,打开后,直接使用 resetFields 或直接清空表单&…

LLDB 详解

LLDB 详解 LLDB 详解编译器集成优势LLDB 的主要功能命令格式原始(raw)命令选项终止符: -- LLDB 中的变量唯一匹配原则helpexpressionprint、call、po控制流程:continue、next、step、finishregister read / writethread backtracethread retu…

基于weixin小程序新生报到系统的设计

管理员账户功能包括:系统首页,个人中心,学生管理,班级信息管理,师资力量管理,宿舍信息管理,宿舍安排管理,签到信息管理,论坛管理 小程序功能包括:系统首页&am…

考研数学一有多难?130+背后的残酷真相

考研数学一很难 大家平时在网上上看到很多人说自己考了130,其实这些人只占参加考研数学人数的极少部分,有个数据可以展示出来考研数学到底有多难: 在几百万考研大军中,能考到120分以上的考生只有2%。绝大多数人的分数集中在30到…

【MySQL进阶之路 | 高级篇】MySQL8.0索引新特性->降序索引与隐藏索引

1. 支持降序索引 降序索引以降序存储键值.虽然在语法上,从MySQL4版本已经支持降序索引的语法了,但实际上该DESC定义是被忽略的.知道MySQL8.x版本才开始真正支持降序索引.(仅限于InnoDB存储引擎). MySQL在8.0版本前创建的仍然是升序索引,使用…

【C++11(二)】lambda表达式和可变参数模板

一、可变参数模板 C11的新特性可变参数模板 能够让您创建可以接受 可变参数的函数模板和类模板 // Args是一个模板参数包&#xff0c;args是一个函数形参参数包 // 声明一个参数包Args...args&#xff0c;这个参数包中可以包含0到任意个模板参数。 template <class ...Arg…

vue3 使用JsMind的方法,以及引入提示报错,无法找到模块“jsmind”的声明文件

最终结果&#xff1a; 一、使用&#xff1a;使用yarn或者npm 安装 yarn add jsmind npm install vue-jsmind 二、引入 两种方法&#xff1a;&#xff08;如果这样引入没问题按照这样引入&#xff09; import "jsmind/style/jsmind.css"; import JsMind from &quo…

【SSM】医疗健康平台-用户端-体检预约

知识目标 了解FreeMarker&#xff0c;能够简述FreeMarker的作用和生成文件的原理 熟悉FreeMarker的常用指令&#xff0c;能够在FTL标签中正确使用assign指令、include指令、if指令和list指令 掌握显示套餐列表功能的实现 掌握显示套餐详情功能的实现 掌握体检预约功能的实现…