01_初识微服务

文章目录

  • 一、微服务概述
    • 1.1 什么是微服务
    • 1.2 对比微服务架构与单体架构
    • 1.3 微服务设计原则
    • 1.4 微服务开发框架
    • 1.5 简单理解分布式部署与集群部署
  • 二、微服务的核心概念
    • 2.1 服务注册与发现
    • 2.2 微服调用(通信)
    • 2.3 服务网关
    • 2.4 服务容错
    • 2.5 链路追踪
    • 参考链接

一、微服务概述

1.1 什么是微服务

微服务架构是一种软件架构风格。它将一个大型的、复杂的应用程序拆分成一组小型、独立的服务,每个服务都围绕着具体业务功能进行构建,并独立地开发、测试、部署和运维,服务之间通过一些轻量级的通信机制进行通信。

1.2 对比微服务架构与单体架构

  • 单体架构所有模块全耦合在一起,代码量大,复杂度高。而微服务将应用程序拆分为多个独立的服务,每个服务相当于一个独立的项目,代码量和复杂度都明显减小了。
  • 单体架构一般使用同一个数据库(多数据库可以实现,比较麻烦),存储方式单一。而微服务中不同服务可以使用不同的数据库,存储方式也可以不一样(如redis,mysql,sqlserver)。
  • 单体架构只有一个应用程序,该程序内的所有模块使用的开发技术都一样。采用微服务架构后,各个服务都可以灵活地选择合适的开发技术,开发模式灵活。
  • 单体架构因为代码庞大,部署就会非常慢。而采用微服务架构后,各个微服务可以独立地部署,这些微服务的部署要快得多。

1.3 微服务设计原则

  • 单一职责:每个微服务只需要实现自己的业务逻辑。
  • 服务自治原则:每个微服务的开发、测试、运维、部署都是独立的,可以当成一个独立的项目来对待。
  • 轻量级通信原则:通信的语言要非常的轻量,且需要是跨语言、跨平台的。
  • 接口明确原则:由于微服务之间可能存在着调用关系,为了尽量避免以后由于某个微服务的接口变化而导致其它微服务都做调整,在设计之初就要考虑到所有情况,让接口尽量做的更通用,更灵活。

1.4 微服务开发框架

  • SpringCloud:一系列框架的集合,用于帮助开发者在Spring Boot应用中快速实现常见的微服务模式。
  • Kubernetes(K8s):一个容器编排平台,用于自动化、容器化应用的部署、扩展和管理。对于微服务架构,Kubernetes 提供了服务发现、负载均衡、自动扩缩容等功能,是大规模部署和管理微服务的理想选择。
  • Apache Dubbo:阿里巴巴开源的一款高性能、轻量级的Java RPC框架,专为高性能和分布式系统设计。它提供了服务注册与发现、负载均衡、监控等功能,特别适合构建高性能的微服务系统。
  • gRPC:一个高性能、开源和通用的RPC框架,支持多种语言,非常适合构建跨语言的微服务架构。

1.5 简单理解分布式部署与集群部署

如果一个系统用到了多个服务器,如应用程序、数据库、消息队列分别使用一个服务器部署,或者应用程序部署到了多个服务器上,这种情形就是分布式部署。分布式部署可以有效提高系统性能,还能实现高可用性。

集群部署是分布式部署的一种。在微服务架构中,通常将一个服务运行在多个服务器上,这些服务实例组成了一个集群。集群中的一个服务实例称为一个节点,单个节点故障时仍能通过其他节点提供服务,实现了高可用性。多个节点来分摊请求,可以降低单个节点的负荷,提高了系统的整体性能。

二、微服务的核心概念

在这里插入图片描述

2.1 服务注册与发现

服务注册指服务提供者在启动时将其自身的信息(如服务名称、地址、端口等元数据)注册到一个中心化的注册中心的过程。这个注册中心可以是Eureka、Consul、Zookeeper、Etcd等专门的服务发现与配置管理组件。

服务发现指服务消费者在需要调用某个服务时,能够从服务注册中心查询到该服务的实际地址(包括IP地址和端口号),然后根据这些信息建立连接并进行通信的过程。

服务的注册与发现带来了如下好处:

  • 解耦合:服务之间通过注册中心间接通信,而不是硬编码对方地址,实现了服务间的松耦合。
  • 负载均衡:服务发现机制通常与负载均衡策略结合使用。
  • 故障容错:及时发现并移除故障或不可达的服务实例。
  • 集中监控:作为集中监控服务状态的入口,收集服务实例的健康状况、性能指标等信息。
  • 动态配置:服务实例可以在运行时动态地注册和注销,无需手动配置服务地址。
  • 易于扩展:水平扩展时只需启动新的服务实例并自动注册到注册中心即可。

2.2 微服调用(通信)

同步调用:Restful API(基于HTTP,性能低但灵活度高),RPC(基于TCP,性能高但灵活度低)
异步调用:MQ

2.3 服务网关

在微服务架构中,一个系统会被拆分为多个微服务,这样就带来了一些问题:

  • 前端需要维护大量微服务的地址。随着项目的迭代,后端可能需要重新划分微服务,此时前端需要进行相应的调整。
  • 每个微服务都需要进行一些重复的工作,如认证、鉴权、处理跨域问题。

为了解决上述问题,微服务引入了网关的概念。网关作为客户端的统一入口,负责将请求路由到具体的微服务。网关还可以实现一些业务无关的公用逻辑,如认证、鉴权、处理跨域、路由转发、安全策略(SQL注入,Web攻击,黑白名单)、流量控制、日志监控,证书/加密解密等处理等。

2.4 服务容错

微服务架构中的服务容错是一个至关重要的设计原则,旨在确保系统在部分服务出现故障时仍能继续提供服务,保持整体的稳定性和可靠性。以下是一些常用的服务容错策略:

  • 服务降级:当某个服务因故障无法正常响应时,服务降级机制允许系统以一种简化的形式继续提供服务,即使这意味着牺牲部分功能或性能。例如,可以返回默认数据、缓存数据或者一个友好的错误信息,而不是完全失败,以此来保证基本的用户体验。
  • 服务熔断:受电路断路器启发,服务熔断机制用于防止服务链路中的故障传播。当调用某个服务的错误率超过预设阈值时,熔断器会“跳闸”,后续对该服务的调用将不再执行,而是直接返回一个错误或者默认结果。这样可以防止持续尝试访问有问题的服务导致资源耗尽。熔断器通常还会有一个自我恢复机制,即在一段时间后尝试重新建立连接,判断服务是否已恢复正常。
  • 限流:为了保证核心服务的稳定性,随着访问量的不断增加,需要为系统能够处理的服务数量设置一个极限阀值,超过这个阀值的请求则直接拒绝。
  • 超时设置:为服务调用设定超时限制,以防因个别服务响应慢而导致整个请求链路阻塞。一旦超时,调用方将立即得到反馈,可以选择进行重试、降级或其他补偿措施。
  • 重试机制:自动对失败的操作进行重试,通常结合退避策略(如指数退避)以减少短时间内对同一故障服务的重复冲击。合理设置重试次数和间隔可以有效提高请求的成功率。
  • 负载均衡:将请求分发到不同实例上,避免单个服务实例成为瓶颈或故障点,同时也可以确保系统的整体可用性和响应时间。
  • 异步通信与消息队列:采用异步处理和消息队列解耦服务间直接调用,提高系统的响应速度和容错能力。即使某个服务暂时不可用,消息也能暂存并在服务恢复后处理。
  • 隔离:使用容器、虚拟机或线程池等技术隔离服务,防止一个服务的问题波及到其他服务。例如,线程池隔离可以限制服务内部特定操作的资源使用,防止资源耗尽。
  • 健康检查与自我修复:定期对服务实例进行健康检查,及时发现并隔离不健康的服务实例。结合自动化部署工具,实现故障服务的自动重启或替换,加快系统恢复速度。
  • 监控与警告:实时监控服务的健康状况和性能指标,及时发现并响应问题。配合告警系统,可以在问题发生初期通知(短信,邮件,电话)运维人员介入处理。

2.5 链路追踪

在微服务架构中,一个请求经常需要调用多个服务,此时需要对一次请求涉及的服务链路进行日志记录,即链路追踪。该功能可以通过使用ELK实现。

参考链接

什么是微服务
微服务介绍(史上最全)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端科举八股文-VUE篇

前端科举八股文-VUE篇 Vue响应式的基本原理?computed和watch的区别computed和methods的区别Slot是什么 ? 作用域插槽是什么?组件缓冲keep-alive是什么? 讲讲原理v-if,v-show的区别v-modal如何实现双向绑定组件中的data属性为什么是一个函数而不是对象…

python SciPy 和 NumPy 版本冲突

UserWarning: A NumPy version >1.19.5 and <1.23.0 is required for this version of SciPy (detected version 1.17.2) warnings.warn(f"A NumPy version >{np_minversion} and <{np_maxversion}"在使用 Python 的科学计算库时&#xff0c;经常会遇到各…

CSAPP Lab04——Cache Lab大师手笔,匠心制作

浮沉浪似人潮 哪会没有思念 你我伤心到 讲不出再见 ——讲不出再见 完整代码见&#xff1a;CSAPP/cachelab-handout at main SnowLegend-star/CSAPP (github.com) Part A: Cache Simulator 这个lab描述背大锅&#xff0c;开始我是真有点没看懂题目的描述。特别是“M 20,1”“…

基于Nodejs的简易邮件SMTP服务器

仅用于内部开发环境无法访问邮件服务器的情况下&#xff0c;测试SMTP邮件发送有没有成功。收到邮件发送请求后仅打印内容和保存附件用于测试验证。 安装库 实验环境使用了Nodejs版本16。 npm install smtp-server mailparser JS版SMTP服务器代码 没有使用TSL/SSL&#xff0c…

构建大型语言模型(LLM)产品的实战指南

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

双击bat文件查看ip地址

echo off echo Running batch file as administrator...:: 下面这行是以管理员身份运行 ipconfig 命令&#xff0c;并将结果输出到控制台 cmd /c "ipconfig"echo Batch file execution completed. pause注意文件名不能为 ipconfig.bat 可以是 ipconfigs.bat 另一种…

【JavaScript】JS 的 btoa 和 atob 全局函数

在 JavaScript 中&#xff0c;btoa 和 atob 是两个处理 Base64 编码的全局函数&#xff0c;它们通常用于在浏览器环境中对二进制数据进行编码和解码。 不过&#xff0c;需要注意的是&#xff0c;这两个函数并非 JavaScript 标准规范&#xff08;ECMAScript&#xff09;的一部分…

MATLAB .m文件的命名规则

matlab的.m文件的命名规则&#xff1a; 文件名命名要用英文字符&#xff0c;首字符不能是数字或下划线。 文件名不能与matlab的内部函数名相同。 .m文件名的命名尽量不要是简单的英文单词&#xff0c;最好是由大小写英文/数字/下划线等组成。 原因是简单的单词命名容易与mat…

基于多尺度相关小波分解的单幅图像去雾和去噪方法(MATLAB)

小波变换具有优美的数学背景和强大的多分辨率分析能力。它集成和发展了短时傅里叶变换的思想并克服了其时间窗口不可变的缺点。小波变换通过使用具有局部感受野和多尺度的基函数。形成了同时具有局部和全局性质的信号表征。与DCT等全局变换相比&#xff0c;小波变换可以防止局部…

58、试除法求约数

试除法求约数 题目描述 给定n个正整数ai&#xff0c;对于每个整数ai,请你按照从小到大的顺序输出它的所有约数。 输入格式 第一行包含整数n。 接下来n行&#xff0c;每行包含一个整数ai。 输出格式 输出共n行&#xff0c;其中第 i 行输出第 i 个整数ai的所有约数。 数据…

oracle查看序列

在Oracle数据库中&#xff0c;查看序列的方式主要有以下几种&#xff1a; 查看当前用户下的所有序列名称&#xff1a; sql复制代码 SELECT sequence_name FROM user_sequences; 查看所有用户的序列&#xff1a; sql复制代码 SELECT sequence_name FROM all_sequences; 查看…

Java面试八股之Executors可以创建哪几种类型的线程池

Executors可以创建哪几种类型的线程池 newSingleThreadExecutor&#xff1a; 创建一个单线程的线程池&#xff0c;此线程池确保所有的任务都在同一个线程中按顺序执行。适用于需要保证任务顺序执行&#xff0c;或者在单线程中运行的任务。 newFixedThreadPool&#xff1a; …

知识蒸馏——讨论区

更多内容请了解&#xff1a; 知识蒸馏——基础知识 知识蒸馏——学生模型 知识蒸馏——代码实现 知识蒸馏——讨论区 知识蒸馏——讨论区 一、教师模型的预测结果&#xff08;软标签&#xff09;与传统标签的区别&#xff1f;二、教师模型的软标签与真实标签的关系三、为什么学…

YOLOv5改进 | Conv篇 | 利用YOLOv10提出的UIB模块二次创新C3(附代码 + 完整修改教程)

一、本文介绍 本文给大家带来的改进机制是利用利用YOLOv10提出的UIB模块二次创新C3助力YOLOv5进行有效涨点,其中C2fUIB模块所用到的CIB模块是一种紧凑的倒置块结构,它采用廉价的深度卷积进行空间混合,并采用成本效益高的点卷积进行通道混合。本文针对该方法给出多种使用方法…

每日两题 / 34. 在排序数组中查找元素的第一个和最后一个位置 33. 搜索旋转排序数组(LeetCode热题100)

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣&#xff08;LeetCode&#xff09; 根据二分函数&#xff0c;得到>target和<target的两个&#xff0c;分别是答案的l和r class Solution { public:vector<int> searchRange(vector<int>& nums,…

Python | Leetcode Python题解之第130题被围绕的区域

题目&#xff1a; 题解&#xff1a; class Solution:def solve(self, board: List[List[str]]) -> None:if not board:returnn, m len(board), len(board[0])que collections.deque()for i in range(n):if board[i][0] "O":que.append((i, 0))board[i][0] &q…

github有趣项目:Verilog在线仿真( DigitalJS+edaplayground)

DigitalJS https://github.com/tilk/digitaljs这个项目是一个用Javascript实现的数字电路模拟器。 它旨在模拟由硬件设计工具合成的电路 像 Yosys&#xff08;这里是 Github 存储库&#xff09;&#xff0c;它有一个配套项目 yosys2digitaljs&#xff0c;它可以转换 Yosys 将文…

前端学习日记Vue3---Day1

声明式渲染 使用简洁的模板语法&#xff0c;将数据与 DOM&#xff08;文档对象模型&#xff09;关联起来。通过这种方式&#xff0c;可以实现数据驱动的界面更新&#xff0c;简化开发流程。 示例 <!DOCTYPE html> <html lang"en"> <head><me…

awk的应用

步骤一&#xff1a;awk的基本用法 1&#xff09;基本操作方法 格式1&#xff1a;awk [选项] [条件]{指令} 文件 格式2&#xff1a;前置指令 | awk [选项] [条件]{指令} 其中&#xff0c;print 是最常用的编辑指令&#xff1b;若有多条编辑指令&#xff0c;可用分号分隔。 …

【多视图聚类】COMPLETER:Incomplete Multi-view Clustering via Contrastive Prediction

CVPR 2021 0.摘要 在本文中&#xff0c;我们研究了不完全多视图聚类分析中的两个具有挑战性的问题&#xff0c;即i&#xff09;如何在没有标签的帮助下学习不同视图之间的信息性和一致性表示&#xff0c;以及ii&#xff09;如何从数据中恢复缺失的视图。为此&#xff0c;我们…