微服务架构介绍

f4981b7e069148f7b1227bcb80cd973d.jpg单体架构

 

单体,即:一个进程完成全部的后端处理,如果搞不定,就多个进程一起,单体中一般包含:客户端(App、H5、Web)、服务端部署(反向代理、数据库、中间件等),目前市面上大多数项目都还是主流于使用单体结构;

 

但是,随着 用户量、流量、数据的增长,单体架构出现了瓶颈(即:单台服务器处理能力有限、包括但不限于:并发处理不过来、内存、cpu、磁盘IO等瓶颈),就出现了:垂直、水平拆分,即使用多台服务器均衡请求;

 

水平、垂直拆分

水平拆分:同一个后端多环境部署,他们都处理相同的内容,使用反向代理来均衡负载;这种也叫集群(多个节点干相同的事儿)

 

垂直拆分:不同业务拆分为各个节点,反向代理通过路由将请求分发给每个业务节点上;

 

但是不论是 水平拆分 还是 垂直拆分,都是为了应对并发,使用更多的服务器来处理更多的请求;

 

 

 

分布式和集群

在 水平、垂直拆分时,假设我们的业务节点所产生的日志信息需要统一汇总记录,我们就分离出了一些共用的服务(Service-mini,小服务),供我们的业务层节点请求访问,比如共用的日志处理服务,每个业务节点都需要把自己的日志发送到公共的节点上,这时,慢慢就演变成了,一个业务节点,需要多个业务节点相互配合,最后才将用户的请求返回出去,这种架构,我们称之为:分布式;

 

关于真正理解 集群 和 分布式 的区别,包括什么是节点、什么是服务实例等,可以参考:这里

 

 

 

 

 

CAP:分布式的入门理论,即:C / A / P 这三个不能同时满足,或者说:一致性C、可用性A、分区容错P 不能同时满足;(关于CAP的分区容错P和为什么不能同时满足的更详细解释,点这里)

 

P:网络之间的的互相请求连接总是有不稳定(包括:丢包、断网、延迟等)的时候;

 

C和A:在P不满足的条件下,我们不能保证其高可用性、数据的一致性;

 

分布式事务:在分布式环境下,如何保证事务的一致性,即多节点之间的数据执行过程中,要么都成功、要么都失败;

 

分布式锁:单体中因为是一个进程,所以上锁是很简单的,比如内部锁lock,但是多进程的话,是很难保证他们之间事务的一致性;

 

 

 

微服务

当分布式的问题都解决掉之后,微服务就出现了;

 

所谓微服务架构,就是在分布式技术成熟后,使用分布式的方式去完成业务解耦,这种架构风格就是微服务架构(还包括全套的微服务架构组件)

 

 

 

官方含义:微服务架构是一个用分布式服务来拆分业务逻辑,完成解耦的架构模式(架构风格)

 

微服务架构就是在分布式技术成熟后,通过分布式服务来拆分业务逻辑,完成解耦,并且通过一系列组件和方法论来解决落地问题,这套架构风格+落地标准就是微服务架构!

 

微服务:每个服务就是方法,调用分布式服务

 

微服务图如下:

 

 

 

 

 

要想实现微服务的落地,必须先完成对服务的拆分!

 

推荐使用DDD领域驱动设计,来完成服务的拆分,即:按照领域来拆分(按照这种来拆分,每个人最终的结构都会是不一样的,所以,没有确切的结果!)

 

提示:学习微服务前,最好先了解什么是DDD领域驱动模型,里面的几个大概念需要理清,比如:领域和子领域、领域模型、实体和值对象、聚合和聚合根、领域事件、充血模型和贫血模型等; 

 

 

 

微服务的知识体系

核心要求(必须掌握)

服务注册发现——高可用+伸缩性

网关服务治理——在客户端和服务端之间

功能性要求

全链路追踪:skywalking

分布式日志 ELK

Apollo 配置中心

独立鉴权授权中心 SSO

Prometheus+Grafana 监控分析

分布式锁——分布式事务

运维需求

Git+Jenkins+Docker+Kubernetes

微服务的根基(核心要求)

根基包括两点:

 

服务的高可用:即服务必须保证在线、存活,尽量降低服务不可用的情况;

服务的可伸缩:即服务能根据请求过来的流量、并发数等,去自动增减自身的服务(有些服务压力大,有些服务压力小,那么我们需要通过一种策略去动态地增加压力大的服务实例数量,减少压力小的服务实例数量);

 那怎么实现高可用和可伸缩功能呢?即:怎么实现动态检查服务实例状态、动态增减服务实例数量呢?

 

我们就需要引入一个工具:服务注册发现

 

服务注册发现

每当每一个微服务实例启动时,都会向 服务注册发现中心 注册,服务注册发现中心 就会保存每个注册过来的服务实例,并向这些服务实例发送心跳、判断对应的服务实例是否正在工作、或者是否出现宕机等;

 

 

 

看上图,服务注册中心保存了已经注册的服务实例,我们在网关这里先去 服务注册中心Consul集群 中获取这些服务实例的信息(比如地址等),再去调用对应的集群中的某个服务实例节点;

 

现在又有一个问题,我们客户端如果要访问,那么是直接击中到服务实例集群中吗?很显然不是,,这就引出了第二个核心内容:网关服务治理;

 

 

 

网关服务[治理] Gateway

如果我们的客户直接击中服务实例节点,那么将会这样:

 

 

 

 缺点:

 

1、上面只有8个服务实例,就那么乱了,而我们以后项目中部署的服务实例肯定会上百个,如果是这样子的话关系就会更加的复杂化了;

 

2、服务实例直接暴露给外网,公网IP肯定不够用,资源利用完全不可行;

 

3、安全性:难道每个微服务都要自己检查其自身的安全性吗?这样工作量太大,以后出现安全性问题也非常难以排查;

 

我们通过引入网关解决上面3个问题:

 

 

 

首先,客户端访问反向代理Nginx,然后反向代理将请求转发给 网关 ,网关根据请求来的信息,在 服务注册中心 中获取对应的微服务节点信息,然后根据信息找到微服务节点并请求该节点处理业务逻辑;

 

  

 

因为所有的请求都需要听过网关,所以我们可以在网关上做一些特殊的事情,包括但不限于:缓存、鉴权授权、均衡负载、路由转发、Polly(熔断服务、限流、超时和重试)等,我们将这些事情称之为:网关服务治理

 

Polly 是一种.NET弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如重试,断路,超时,故障恢复等策略。

 

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

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

相关文章

设计模式之工厂方法模式精讲

工厂方法模式又叫虚拟构造函数(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建性工作推迟到子类中。 工厂模式可以分为简单工厂…

零基础入门转录组数据分析——绘制差异火山图

零基础入门转录组数据分析——绘制差异火山图 差异分析的火山图(Volcano Plot)在生物信息学数据分析中,特别是在基因表达差异分析中,是一个非常直观和有用的工具。 本教程将从导入的数据结构开始,一步步带大家在R中绘制好看的火山图,最后对火山图进行解读,确保读者理解…

STL第二弹

3.5 stack容器 3.5.1 stack容器基本概念 概念: stack是一种先进后出的数据结构,他只有一个出口 栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为 3.5.2 stack常用接口 构造函数: stack stk; //stack采用模板类实…

Spark-Scala语言实战(7)

在之前的文章中,我们学习了如何在IDEA中导入jars包,并做了一道例题,了解了RDD。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢…

conda使用记录

linux 使用conda创建新一个新的python环境过程 conda create -n recommendation_env python3.8.18 # 指定python版本 conda env list # 查看所有的环境 conda activate recommendation_env # 激活创建的新环境 pip install flask # 安装依赖 或者 pip install flask版本号 或者…

XUbuntu22.04之Typora快捷键Ctrl+5不生效问题(二百二十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

5、axios请求、动画、组件、路由重定向、UI组件

一、axios请求 Axios是一个基于Promise的HTTP状态库&#xff0c;封装ajax。ajax包含axios安装 npm install axios 引入 import axios form “axios” 1、get请求 <script> // 1.本页面引入 import axios from "axios";data() {return {imgSrc: ""…

Springboot+vue的高校科研信息管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的高校科研信息管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#x…

C++:list类

list的介绍 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代 2. list 的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。 3. list 与 …

蓝桥杯物联网竞赛_STM32L071_13_定时器

CubeMx配置LPTIM: counts internal clock events 计数内部时钟事件 prescaler 预分频器 updata end of period 更新期末 kil5配置&#xff1a; 中断回调函数完善一下&#xff1a; void HAL_LPTIM_AutoReloadMatchCallback(LPTIM_HandleTypeDef *hlptim){if(cnt ! 10) cnt…

算法——动态规划:01背包

原始01背包见下面这篇文章&#xff1a;http://t.csdnimg.cn/a1kCL 01背包的变种&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 简化一…

数据结构:单调栈和单调队列

文章目录 一、单调栈1.1、栈的思想1.2、单调栈1.2.1、单调栈的基本应用&#xff1a;找出数组中每个元素右侧第一个更大的元素1.2.2、单调栈的基本应用&#xff1a;找出数组中每个元素左侧第一个更大的元素1.2.3、单调栈拓展1.2.4、单调栈LeetCode题单 二、单调队列2.1、队列的思…

【chemistry 5】脂类代谢、氨基酸代谢、核酸代谢

&#x1f31e;欢迎来到生物化学的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年3月29日&…

Discourse 用户可以自己修改用户名吗

Discourse 是可以修改用户名的&#xff0c;但用户修改自己的用户名会有时间的限制。 这是因为根据官方的说法就是当用户修改用户名后可能会导致内容的失效等问题。 在默认的安装配置下&#xff0c;用户可以在完成注册后的 3 天自己对用户名进行修改。 3 天以后&#xff0c;用…

【CASS精品教程】CASS11台阶画法大全

文章目录 一、无边台阶二、有边台阶三、圆弧无边台阶四、U型台阶五、曲线U型台阶六、L型台阶一、无边台阶 点击【居民地】→【房屋附属】→【台阶】: 选择【两点边】即可。 两点边的绘制方法是,依次点击四个点,或者点击三个点后空格,注意台阶缺口(有白色线条)为下。 四…

HarmonyOS实战开发-Stage模型下Ability的创建和使用

介绍 本篇Codelab基于Stage模型&#xff0c;对Ability的创建和使用进行讲解。首先在课程中我们将带领大家使用DevEco Studio创建一个Stage模型Ability&#xff0c;并使用UIAbilityContext启动另一个Ability&#xff0c;然后借助Want&#xff0c;在Ability之间传递参数&#xf…

基于SpringBoot的“财务管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“财务管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统登录界面图 管理员功能界面图…

Deepspeed、ZeRO、FSDP、ZeRO-Offload、all reduce、reduce-scatter

Transformer为基础的大模型应该如何并行 数据并行。但是如果模型太大放不到一块卡上就没用了。为了解决把参数放到一块卡上的问题&#xff0c;演进出了论文Zero的思想&#xff0c;分为Zero-DP和Zero-R两部分。Zero-DP是解决Data parallel的问题&#xff0c;并行过程中内容不够…

Plecs电力电子仿真专业教程-软件操作

Plecs仿真软件基本操作方法&#xff1a; 从连线中引出线&#xff1a;Ctrl 鼠标左键 设置元件参数&#xff1a;双击元件&#xff0c;进行设置&#xff0c;若要显示参数&#xff0c;则在参数后的方框打勾。 CTRL E ---- 仿真参数设置 Ctrl T -----开始仿真 CtrlF …

如何检查电脑的最近历史记录?这里提供详细步骤

如果你怀疑有人在使用你的计算机,并且你想查看他们在做什么,下面是如何查看是否有访问内容的痕迹。 如何检查我的计算机的最近历史记录 要检查计算机的最近历史记录,应该从web浏览器历史记录开始,然后移动到文件。但是,可以修改或删除浏览器历史记录,也可以隐藏Windows…