当前位置: 首页 > news >正文

19-springcloud(上)

一 微服务架构进化论

在这里插入图片描述

单体应用阶段 (夫妻摊位)

在互联网发展的初期,用户数量少,一般网站的流量也很少,但硬件成本较高。因此,一般的企业会将所有的功能都集成在一起开发一个单体应用,然后将该单体应用部署到一台服务器上即可满足业务需求。

在这里插入图片描述

生活中的单体应用

小夫妻俩刚结婚,手里资金有限,就想着开一个路边烧烤摊。丈夫负责烤串做菜、妻子负责服务收银及上菜。这是一个典型的路边烧烤摊的经营模式。

单体应用的特点:

  • 能够接纳的请求数量时有限的,因为服务器的内存、CPU配置是有限的。
  • 展现层、控制层、持久层全都在一个应用里面,调用方便、快速。单个请求的响应结果超快。
  • 开发简单、上手快、三五个人团队好管好用。

垂直应用阶段 (门面饭店)

随着小夫妻俩经营有方、待客有道,开始有人愿意为了吃他们做的烧烤排队了。夫妻俩一想,我们这俩人也干不过来啊,怎么办?招 人吧、扩大规模吧。

  • 招什么人?当然是厨师啊、端菜收银的妻子自己还能干得过来,主要是丈夫的活挺不住了。那就招厨师。
  • 不能让人站着吃吧?租一个附近的门市、添置更多的桌椅板凳。

在这里插入图片描述

问题:

在处理并发请求的能力和容量上增强了,但是在单个请求的处理速度上下降了。

分布式系统阶段 (酒店)

为了解决上一阶段遇到的问题:单个请求的处理速度下降。也就是饭店针对单个订单做菜响应速度下降了,但是由于饭店的菜确实好吃、菜品精良,客流量又持续的增高。该店又再次面临扩容的问题。

  • 为了解决客流量持续增高,夫妻又招聘了4位厨师
  • 为了解决单个订单处理速度下降的问题,将厨师分为两组,一组专门做烧烤,一组专门做饭菜。专业的人做专业的事情,注意力越集中,办事越熟练、效率越高。

在这里插入图片描述

服务治理阶段 (大酒店)

新的问题又出现了,有的顾客既点烧烤又点饭菜。导致后端两组厨师之间沟通不畅,怎么组合套餐推送给前台?厨师之间怎么调用、 怎么沟通啊?谁是头?谁是大脑?谁记得A厨师的烧烤和B厨师的饭菜是一桌的?

在这里插入图片描述

随着服务数量的不断增加,服务中的资源浪费和调度问题日益突出。此时需要增加一个调度中心来治理服务。调度中心可基于访问压力来实时管理集群的容量,从而提高集群的利用率。

在这里插入图片描述

注意:

在服务治理(SOA)架构中,需要一个企业服务总线(ESB)将基于不同协议的服务节点连接起来,它的工作是转换、解释消息和路由。说白了就是丈夫做菜品的配置管理、做订单的服务注册。丈夫负责主动观察问询各工种的工作状态并记录,妻子主动向丈夫问询后端厨师的状态,并根据丈夫的反馈分配订单。

微服务阶段 (五星大酒店)

饭店的规模越来越大了、岗位分工也越来越细了。真的成了超级大饭店了,怎么管?

什么是微服务:

将系统的业务功能划分为极小的独立微服务,每个微服务只关注于完成某个小的任务。系统中的单个微服务可以被独立部署和扩展,且各个微服务之间是高内聚、松耦合的。微服务之间采用轻量化通信机制暴露接口来实现通信。

在这里插入图片描述

解释:

  • 服务网关:前台。所有的顾客进来,由前台统一接待。比如:Spring Cloud Gateway。
  • 熔断机制:菜品限量,法式菜品、意大利菜品、日本料理。什么时间可以吃得到、可提供多少人份?这些服务都是有限制的。
  • 工作效率监督:工作流程中每个岗位做了什么工作、用了多长时间。哪个环节出现问题、哪个岗位需要调整。比如: Sleuth、日志监控ELK等。
  • 配置中心:菜单,川菜,东北菜,杭帮菜,烩菜。
  • 服务集群:厨师微服务集群包含,川菜厨师微服务,杭帮菜厨师微服务等。
  • 高可用注册中心:大堂经理,负责那些人上班了,他在哪里干的什么工作。

二 微服务的拆分规范和原则

在这里插入图片描述

压力模型拆分

压力模型简单来说就是用户访问量,我们要识别出某些超高并发量的业务,尽可能把这部分业务独立拆分出来。

压力模型拆解为三个维度:

  • 高频高并发场景

在这里插入图片描述

原因

比如商品详情页,它既是一个高频场景(时时刻刻都会发生),同时也是高并发的场景(QPS - Query per seconds极高)

  • 低频突发流量场景

在这里插入图片描述

原因:

秒杀场景它并不是高频场景(偶尔发生),但是它会产生突发流量。再跟大家举一个例子,那就是“商品发布”,对新零售业务来说,当开设一个线下大型卖场以后,需要将所有库存商品一键上架,这里的商品总数是个非常庞大的数字(几十万+),瞬间就可以打出很高的QPS

  • 低频流量场景

在这里插入图片描述

原因:

后台运营团队的服务接口,比如商品图文编辑,添加新的优惠计算规则,上架新商品。它发生的频率比较低,而且也不会造成很高的并发量。

业务模型拆分

业务模型拆分的维度有很多,我们在实际项目中应该综合各个不同维度做考量。我这里主要从主链路、领域模型和用户群体三个维度。

  • 主链路拆分

在电商领域"主链路"是一个很重要的业务链条,它是指用户完成下 单场景所必须经过的场景。按照我们平时买买买的剁手经验,可以识别出很多核心主链路,比如商品搜索->商品详情页->购物车模块- >订单结算->支付业务,这是就是一条最简单的主链路。如果这是一场战斗的话,那么主链路就是这场战斗的正面战场,我们必须力保主链路不失守。

核心主链路拆分,有以下几个目的:

  1. 异常容错:为主链路建立层次化的降级策略(多级降级),以及合理的熔断策略
  2. 调配资源:主链路通常来讲都是高频场景,自然需要更多的计算资源,最主要的体现就是集群里分配的虚机数量多。
  3. 服务隔离:主链路是主打输出的C位,把主链路与其他打辅助的业务服务隔离开来,避免边缘服务的异常情况影响到主链路。
  • 领域模型拆分

领域驱动设计DDD(Domain-Driven Design 领域驱动设计)不是一个新概念,但老外们有个毛病,做什么事情特别喜欢提炼方法论,本来一个非常简单的概念,愣是被吹到神乎其神高深莫测。

  • 用户群体拆分

根据用户群体做拆分,我们首先要了解自己的系统业务里有哪些用户,比如说电商领域,我们有2C的小卖家,也有2B的大客户,在集团内部有运营、采购、还有客服小二等等。对每个不同的用户群体来说,即便是相同的业务领域,也有该群体其独有的业务场景。

用户群体相当于一个二级域,我们建议先根据主链路和领域模型做一级域的拆分,再结合具体的业务分析,看是否需要在用户领域方向上做更细粒度的拆分。

三 为什么选择Spring Cloud

在这里插入图片描述

Spring Cloud与Netflix

Netflix是一家做视频网站的公司,之所以要说一下这个公司是因为 Spring Cloud在发展之初,Netflix做了很大的贡献。包括服务注册中心Eureka、服务调用Ribbon、Feign,服务容错限流Hystrix、服务网关Zuul等众多组件都是Netflix贡献给Spring Cloud社区的。

什么是SpringCloud

Spring Cloud是一个基于Spring Boot实现的微服务架构开发工具。 它为微服务架构中涉及的配置管理、服务治理、断路器、智能路由、控制总线、分布式会话和集群状态管理等操作提供了一种简单的开发方式。

在这里插入图片描述

核心事件追踪

  • 2018年6月底,Eureka 2.0 开源工作宣告停止,继续使用风险自负。
  • 2018年11月底,Hystrix 宣布不再在开源版本上提供新功能。
  • 2018年12月,Spring官方宣布Netflix的相关项目进入维护模式。

从此,Spring Cloud逐渐告别Netflix时代。

  • 2018年10月31日,Spring Cloud Alibaba正式入驻了Spring Cloud官方孵化器,并在maven中央库发布了第一个版本。

服务注册中心选型

  • Eureka:Spring Cloud与Netflix的大儿子,出生的时候家里条件一般,长大后素质有限。
  • Nacos:后起之秀,曾经Spring Cloud眼中“别人家的孩子”,已经纳入收养范围(Spring Cloud Alibaba孵化项目)。
  • Apache Zookeeper:关系户,与hadoop关系比较好
  • etcd:关系户,与kubernetes关系比较好
  • Consul:关系户,曾经与docker关系比较好

注意:

如果你的应用已经使用到了Hadoop、Kubernetes、Docker, 在Spring Cloud实施过程中可以考虑使用其关系户组件,避免 搭建两套注册中心,节省资源。

分布式配置管理

目前可选的分布式配置管理中心,有阿里的Nacos、携程的 Apollo、和Spring Cloud Config。

服务网关

服务网关这块就不多说了,没有任何悬念,Spring Cloud Gateway 在各方面都碾压Zuul,Zuul2也基本上是胎死腹中。

熔断限流

  • Hystrix

2018年12月,Spring官方宣布Netflix的相关项目进入维护模式。不再开发新的功能,但是Hystrix整体上还是比较稳定的,对于老用户不必更换,影响也不大。

  • resilience4j

Hystrix停更之后,Netflix官方推荐使用resilience4j,它是一个轻量、易用、可组装的高可用框架,支持熔断、高频控制、隔离、限流、限时、重试等多种高可用机制。

  • Sentinel(重点)

Sentinel是阿里中间件团队开源的,面向分布式服务架构的轻量级 高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。

四 Spring Cloud版本选择

在这里插入图片描述

SpringCloud版本号由来

SpringCloud的版本号是根据英国伦敦地铁站的名字进行命名的, 由地铁站名称字母A-Z依次类推表示发布迭代版本。

在这里插入图片描述

SpringCloud和SpringBoot版本对应关系

在这里插入图片描述

注意事项:

其实SpringBoot与SpringCloud需要版本对应,否则可能会造成很多意料之外的错误,比如eureka注册了结果找不到服务类啊,比如某些jar导入不进来啊,等等这些错误。

版本说明

名字描述
SNAPSHOT快照版,可以稳定使用,且仍在继续改进版本。
PRE预览版,内部测试版. 主要是给开发人员和测试人员测试和找BUG用的,不建议使用;
RC发行候选版本,基本不再加入新的功能,主要修复bug。
SR修正版或更新版
GA正式发布的版本

从 Spring Cloud 2020.0.0-M1 开始,Spring Cloud 废除了这种英国伦敦地铁站的命名方式,而使用了全新的 “日历化” 版本命名方式。

五 如何学习微服务Spring Cloud

在这里插入图片描述

简单来说,就是“三大功能,两大特性”。

在这里插入图片描述

三大功能是指微服务核心组件的功能维度,由浅入深层次递进;而两大特性是构建在每个服务组件之上的高可用性和高可扩展性。别看微服务框架组件多,其实你完全可以按照这三大功能模块,给它们有简入难对号入座。

注意:

  • 服务间通信:包括服务治理、负载均衡、服务间调用;
  • 服务容错和异常排查:包括流量整形、降级熔断、调用链追踪;
  • 分布式能力建设:包括微服务网关、分布式事务、消息驱动、分布式配置中心。

从哪里入手

在这里插入图片描述

从微服务组件的功能维度来讲,服务间通信是最基础的功能特性,这个功能模块是最适合作为初学者学习微服务技术的切入点。

注意:

  • 服务间通信:包括服务治理、负载均衡、服务间调用;
  • 服务容错和异常排查:包括流量整形、降级熔断、调用链追踪;
  • 分布式能力建设:包括微服务网关、分布式事务、消息驱动、分布式配置中心。

相关文章:

19-springcloud(上)

一 微服务架构进化论 单体应用阶段 (夫妻摊位) 在互联网发展的初期,用户数量少,一般网站的流量也很少,但硬件成本较高。因此,一般的企业会将所有的功能都集成在一起开发一个单体应用,然后将该单体应用部署到一台服务器…...

前端基础---HTML笔记汇总一

HTML定义 HTML超文本标记语言——HyperText Markup Language。 超文本是什么&#xff1f; 链接标记是什么&#xff1f; 标记也叫标签&#xff0c;带尖括号的文本 标签分类 单标签:只有开始标签&#xff0c;没有结束标签(<br>换行 <hr>水平线 <img> 图像标…...

智汇云舟亮相中国安防工程商集成商大会

智汇云舟亮相中国安防工程商集成商大会&#xff0c;以视频孪生驱动安防行业数字化转型 近日&#xff0c;由中国安全防范产品行业协会指导&#xff0c;永泰传媒主办的中国安防工程商&#xff08;系统集成商&#xff09;大会暨第69届中国安防新产品、新技术成果展示在石家庄圆满…...

使用 Sealos 在离线环境中光速安装 K8s 集群

作者&#xff1a;尹珉。Sealos 开源社区 Ambassador&#xff0c;云原生爱好者。 当容器化交付遇上离线环境 在当今快节奏的软件交付环境中&#xff0c;容器化交付已经成为许多企业选择的首选技术手段。在可以访问公网的环境下&#xff0c;容器化交付不仅能够提高软件开发和交付…...

算法-模拟

1、旋转数组 public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** 旋转数组* param n int整型 数组长度* param m int整型 右移距离* param a int整型一维数组 给定数组* return int整型一维数组*/…...

如何通过Instagram群发消息高效拓展客户?

之前小S有跟大家说过关于独立站&#xff0b;Instagram如何高效引流&#xff0c;发现大家都对Instagram的话题挺关注的。Instagram作为全球最受欢迎的社交媒体之一&#xff0c;对于许多商家和营销人员来说&#xff0c;Instagram是一个不可忽视的营销平台&#xff0c;他们可以通过…...

基于springboot实现多线程抢锁的demo

1、本代码基于定时调度和异步执行同时处理&#xff0c;如果只加异步处理&#xff0c;会导致当前任务未执行完&#xff0c;下个任务到点也不会触发执行 Scheduled(fixedRate 50_000)Asyncpublic void testThread() throws Exception{ZkLock lock new ZkLock(zkJob.getZK(), &q…...

Java I/O模型发展以及Netty网络模型的设计思想

Java I/O模型发展以及Netty网络模型的设计思想 I/O模型Java BIOJava NIOJava AIO NIO Reactor网络模型单Reactor单线程模型单Reactor多线程模型主从Reactor多线程模型 Netty通信框架 前言&#xff1a; BIO、NIO的代码实践参考&#xff1a;Java分别用BIO、NIO实现简单的客户端服…...

智能电网时代:数字孪生的崭露头角

随着科技的不断进步&#xff0c;数字孪生已经开始在电力行业崭露头角&#xff0c;为这个关键的行业带来了前所未有的机遇和潜力。本文就带大家了解一下数字孪生在哪些方面为电力行业做出改变&#xff0c;以及未来的创新应用。 首先&#xff0c;数字孪生可以提高电力系统运营效率…...

每日一题 501二叉搜素树中的众数(中序遍历)

题目 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 BST 满足如下定义&a…...

测试理论与方法----测试流程第三个环节:设计测试用例

测试流程第三个环节&#xff1a;设计测试用例&#xff1a;怎么测<——>测试需求的提取&#xff1a;测什么 ### 5、测试用例 描述&#xff1a;测试用例(TestCase)&#xff1a;是一份关于【具体测试步骤】的文档&#xff0c;是为了达到最佳的测试效果或高效揭露软件中潜藏的…...

C++多态案例2----制作饮品

#include<iostream> using namespace std;//制作饮品的大致流程都为&#xff1a; //煮水-----冲泡-----倒入杯中----加入辅料//本案例利用多态技术&#xff0c;提供抽象类制作饮品基类&#xff0c;提供子类制作茶叶和咖啡class AbstractDrinking {public://煮水//冲水//倒…...

机械零件保养3d模拟演示打消客户购买顾虑

复杂机械的工作运转是复杂的&#xff0c;想要对机械有深度的理解和迭代&#xff0c;必须了解它的运转原理及参数&#xff0c;复杂机械运行原因教学存在着不可视、系统庞杂及知识点多等弊病&#xff0c;3D虚拟展示是基于web3d网页运行的三维页面&#xff0c;可以将复杂机械运行过…...

SpringBoot的自动装配源码分析

文章目录 一&#xff1a;什么是自动装配二、springboot的启动流程1.调用SpringApplication&#xff08;&#xff09;的构造方法2.执行核心run方法&#xff08;&#xff09;3.执行核心prepareContext&#xff08;&#xff09;4.执行核心refreshContext&#xff08;&#xff09;5…...

Linux常用命令——csplit命令

在线Linux命令查询工具 csplit 将一个大文件分割成小的碎片文件 补充说明 csplit命令用于将一个大文件分割成小的碎片&#xff0c;并且将分割后的每个碎片保存成一个文件。碎片文件的命名类似“xx00”&#xff0c;“xx01”。csplit命令是split的一个变体&#xff0c;split只…...

React 组件的3大属性: state

state 一、理解二、用途三、使用3.1、类初始化3.2、函数初始化 四、状态读更4.1、组件内部状态管理和数据更新4.2、state 和 props 一起使用 一、理解 组件被称为"状态机", 页面的显示是根据组件的state 属性的数据来显示。 state 是一个用于存储和管理组件内部数据的…...

vscode 上传项目到gitlab

第一步初始化项目 如果没有创建过分支&#xff08;创建分支这里不记录&#xff09;&#xff0c;默认是master分支&#xff1a; ①将所需要的上传的文件添加到暂存区&#xff0c;如图&#xff1a; ②填写一下注释信息&#xff0c;将暂存区的文件上传到本地分支&#xff08;没有创…...

[羊城杯 2020] easyphp

打开题目&#xff0c;源代码 <?php$files scandir(./); foreach($files as $file) {if(is_file($file)){if ($file ! "index.php") {unlink($file);}}}if(!isset($_GET[content]) || !isset($_GET[filename])) {highlight_file(__FILE__);die();}$content $_GE…...

QT 常用类与组件

0 思维导图 1 信息调试类&#xff08;QDebug&#xff09; #include "widget.h" #include<iostream> //printf #include<QDebug> //qDebuf using namespace std; //coutWidget::Widget(QWidget *parent): QWidget(parent) {//输出函数//使用…...

C#控制台连接Mysql数据库,有配置数据库连接字符串的配置文件

C#控制台连接Mysql数据库&#xff0c;有配置数据库连接字符串的配置文件 实现功能 读取..txt 中的配置文件&#xff0c;来初始化连接字符串让连接字符串的配置文件不存在会主动创建默认的连接字符串 注意点&#xff1a; 需要引用Newtonsoft使用mysql 代码如下 using Syst…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...

boost::filesystem::path文件路径使用详解和示例

boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类&#xff0c;封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解&#xff0c;包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

比特币:固若金汤的数字堡垒与它的四道防线

第一道防线&#xff1a;机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”&#xff08;Hashing&#xff09;就是一种军事级的加密术&#xff08;SHA-256&#xff09;&#xff0c;能将信函内容&#xff08;交易细节&#xf…...

【大厂机试题解法笔记】矩阵匹配

题目 从一个 N * M&#xff08;N ≤ M&#xff09;的矩阵中选出 N 个数&#xff0c;任意两个数字不能在同一行或同一列&#xff0c;求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求&#xff1a;1 ≤ K ≤ N ≤ M ≤ 150 输入格式 N M K N*M矩阵 输…...