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.rhkb.cn/news/342686.html

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

相关文章

C语言小例程6/100

题目:输入三个整数x,y,z,请把这三个数由小到大输出。 程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值…

电商平台的消费增值策略

电商平台通过创新的消费增值策略,为用户提供了全新的激励体验。这种策略通过积分奖励和价值提升机制,鼓励用户持续参与并增强用户对平台的忠诚度。 消费积分的奖励机制 在电商平台,每一笔交易都会根据预设的比例回馈给消费者一部分资金&…

MATLAB format

在MATLAB中,format 是一个函数,用于控制命令窗口中数值的显示格式。这个函数可以设置数值的精度、显示的位数等。以下是一些常用的 format 命令: format long:以默认的长格式显示数值,通常显示15位有效数字。format s…

Mysql学习(三)——SQL通用语法之DML

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 DML添加数据修改数据删除数据 总结 DML DML用来对数据库中表的数据记录进行增删改操作。 添加数据 -- 给指定字段添加数据 insert into 表名(字段1,字…

引用(C++)和内联函数

前言&#xff1a;本文主要讲解C语法中引用如何使用和使用时的一些技巧 基本语法 引用就是取别名 #include <iostream> using namespace std; int main() {int a 10;int& b a;//给a取别名为bcout << a << endl;cout << b << endl;return 0…

【python】OpenCV—Bitplane

学习来自&#xff1a; 位平面分割&#xff08;Bit-Plane Slicing&#xff09;使用OpenCVPython进行图像处理的初学者指南 位平面 位平面&#xff08;bitplane&#xff09;是一个在计算机科学中用于描述图像数据的概念&#xff0c;具体定义如下&#xff1a; 【定义】&#x…

SpringBoot实现发送邮件功能

目录 一、开启邮件服务 二、导入pom依赖 三、配置yml文件 四、发送邮件 4.1、发送文字邮件 4.2、发送html邮件 4.3、发送附件邮件 4.4、发送图片邮件 一、开启邮件服务 这里拿QQ邮箱举例。 翻到下面进行开启,之后获取授权码。 二、导入pom依赖 <dependency><…

kotlin 调用java的get方法Use of getter method instead of property access syntax

调用警告 Person.class public class Person {private String name;Person(String name) {this.name name.trim();}public String getName() {return name;}public void setName(String name) {this.name name;}public String getFullName() {return name " Wang&quo…

【漏洞复现】用友NC downCourseWare 任意文件读取漏洞

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具&#xff0c;用友NC提供了一系列业务管理模块&#xff0c;包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等&#xff0c;帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友NC …

使用python优雅的将PDF转为Word

使用python优雅的将PDF转为Word 先装这个优雅的库 pip install pdf2docx然后运行下面优雅的代码&#xff0c;将pdf路径和docx路径修改 from pdf2docx import Converter # path pdf_file C:\\Users\\phl\\Desktop\\软件工程期末\\软件工程模拟试题5.pdf docx_file C:\\User…

Python 识别图片形式pdf的尝试(未解决)

想识别出pdf页面右下角某处的编号。pdf是图片形式页面。查了下方法&#xff0c;有源码是先将页面提取成jpg&#xff0c;再用pytesseract提取图片文件中的内容。 直接用图片来识别。纯数字的图片&#xff0c;如条形码&#xff0c;可识别。带中文的不可以&#xff0c;很乱。 识别…

pESC-HIS是什么,怎么看?-实验操作系列-2

01 典型的pESC-HIS质粒遗传图谱 02 介绍 质粒类型&#xff1a;酿酒酵母蛋白表达载体 表达水平&#xff1a;高拷贝 诱导方法&#xff1a;半乳糖 启动子&#xff1a;GAL1和GAL10 克隆方法&#xff1a;多克隆位点&#xff0c;限制性内切酶 载体大小&#xff1a;6706bp 5 测…

国产工业级实时数据库

项目功能描述 Mars数据库的核心功能在于其能够高效地处理来自工业现场的大量传感器数据。它通过简化的可视化配置&#xff0c;允许用户轻松接入各种传感器&#xff0c;并进行数据记录和逻辑处理。Mars数据库在单机模式下支持高达120万个传感器信号的接入&#xff0c;而其分布式…

LeetCode 算法:合并区间c++

原题链接&#x1f517;&#xff1a;合并区间 难度&#xff1a;中等⭐️⭐️ 题目 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰…

C语言实现教学计划编制问题,Dev C++编译器下可运行(240606最新更新)

背景&#xff1a; 问题描述 大学的每个专业都要编制教学计划。假设任何专业都有固定的学习年限&#xff0c;每学年含两学期&#xff0c; 每学期的时间长度和学分上限都相等。每个专业开设的课程都是确定的&#xff0c;而且课程的开设时间的安排必须满足先修关系。每个课程的先…

搜索与图论:图中点的层次

搜索与图论&#xff1a;图中点的层次 题目描述参考代码 题目描述 输入样例 4 5 1 2 2 3 3 4 1 3 1 4输出样例 1参考代码 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 100010;int n, m; int h[N], e[N]…

Softing工业助力微软解锁工业数据,推动AI技术在工业领域的发展

一 概览 Softing作为全球先进工业通信解决方案供应商之一&#xff0c;与微软合作共同推出了众多工业边缘产品&#xff0c;以实现工业应用中OT和IT的连接。这些产品可在基于微软Azure云平台的IIoT解决方案中轻松集成和运行&#xff0c;并为AI解锁工业数据&#xff0c;还可通过A…

Android——热点开关演讲稿

SoftAP打开与关闭 目录 1.三个名词的解释以及关系 Tethering——网络共享&#xff0c;WiFi热点、蓝牙、USB SoftAp——热点(无线接入点)&#xff0c;临时接入点 Hostapd——Hostapd是用于Linux系统的软件&#xff0c;&#xff0c;支持多种无线认证和加密协议&#xff0c;将任…

Nginx实战:LUA脚本_环境配置安装

目录 一、什么是LUA脚本 二、Nginx中的LUA脚本 1、主要特点 2、用途 三、如何在nginx中使用LUA脚本 1、原生nginx 2、OpenResty 3、nginx lua配置验证 一、什么是LUA脚本 Nginx Lua 脚本是 Nginx 与 Lua 语言集成的结果&#xff0c;它允许你使用 Lua 语言编写Nginx 模块…