探索云原生世界:Spring Cloud全方位解读——构建微服务架构的利器

 目录

一、微服务简介

二、微服务发展史

三、Spring Cloud

        3.1 Spring Cloud 版本策略

        3.2 Spring Cloud 发展历程

        微服务是一种软件架构风格,将单一应用程序拆分成一组小型、独立的服务。每个服务运行在自己的进程中,服务之间采用轻量级通信机制进行交互。今天就来带大家全方位的窥探下微服务以及其实现方案 Spring Cloud。

一、微服务简介

        微服务的体系非常庞大,框架组件多,微服务的部分学习路径如下图,主要包括三大功能和两大特性。

        三大功能指微服务核心组件的功能维度,由浅入深层次递进;两大特性是构建在每个服务组件之上的高可用和高可扩展性。

        从功能维度讲,服务间的通信是最基础的功能特性,当构建其服务通信能力之后,接下来就要考虑服务容错能力,提高服务调用的稳定性。在这之后,就可以从全局的角度构建一些分布式特性。

        除了功能特性,还会从高可用性和高可扩展性两个维度来做扩展。

        高可用性是系统设计首要考虑的目标,保障高可用性有两个方向,分别是:

  1. 避免单点故障:在做系统架构时,不能信任任何服务,服务器都有可能挂掉。如果某一个服务只有一台机器,那就会形成单点,一旦这个服务器挂掉,那整个服务都不可用,这时不能接受的。
  2. 故障机器状态恢复:尽快将故障机器恢复到故障前的状态。对于向 Nacos 这类中心化注册中心来说,因故障而下线的机器在重新上线后,应该有能力从某个地方获取故障发生前的服务注册列表。

二、微服务发展史

        要想很好的了解一个事物,就需要先了解它的发展历史,这样才能知道来龙去脉,才能把握未来,学习微服务也是一样的道理。

        微服务是由单体应用发展而来的,单体应用将所有的功能都维护在一个巨无霸的服务中,然后打包成一个 war 包扔到 Tomcat 中运行,对外提供服务。单体应用存在很多问题,比如:

  • 开发中互相干扰
  • 沟通成本高
  • 无法快速迭代
  • 无法单独回滚等

        由于单体服务存在很多问题,计算机中的分治思想就产生了作用,将单体应用拆分成比较小的服务,分开维护。

        微服务架构是在 SOA (面向服务架构)之上的进一步发展。在实践中,通过领域建模理论将一个大型应用拆分成更细粒度且边界清晰的服务模块,而且每个服务可以单独部署、单独测试、单独发布回滚,并借助 Docker 和 CI/CD (持续集成)完成快速上线。

        每个微服务拥有独立的代码库和数据库,采用敏捷开发做快速迭代,微服务的优势:

  • 快速迭代、快速回滚;
  • 资源利用大大提高:可以将硬件资源定向分配给需要用到资源的微服务,实现差异化的资源利用;
  • 降低协作成本:代码库、数据库、编译打包从共享变成独享,进一步降低了沟通成本;
  • 高可用:高可用是系统设计的第一目标,我们可以通过很多技术手段对微服务施加个性化的保护措施,如:弹性机房水位调拨、流量整形、熔断降级。

        了解完微服务后,我们再来了解下 Spring Cloud。

三、Spring Cloud

        Spring Cloud 由 Spring 社区孵化而成,是专门解决微服务架构的一套全家桶微服务架构。最关键的是,Spring Cloud 除了采用 Spring 社区的研发力量外,还吸纳了众多一线大厂的开源组件,经过深度融合,使这些组件成为 Spring Cloud 的一部分。

        以下是 Spring 社区提供的简易架构图

        

         在上图中,可以看到有几个 Spring Boot Apps 的应用集群,这就是经过拆分后的微服务。Spring Cloud 和 Spring Boot 达成了一种默契的配合:Spring Boot 主内,通过自动装配和各种开箱即用的特性,搞定了数据层访问、RESTful 接口、日志组件、内置容器等等基础功能,让开发人员轻轻松松就可以搭建起一个应用;Spring Cloud 主外,在应用集群之外提供了各种分布式系统的支持特性,帮助你轻松实现负载均衡、熔断降级、配置管理等诸多微服务领域的功能。

        3.1 Spring Cloud 版本策略

        大部分开源项目以数字版本进行更新迭代,Spring Cloud 在诞生之初就别出心裁使用了字母序列,以字母 A 开头,按顺序使用字母表中的字母标识重大迭代发布的大版本号。        

Spring Cloud版本
版本发布时间
Angel2015年3月
Brixton2016年5月
Camden2016年9月
Dalston2017年4月
Edgware2017年11月
Finchley2018年6月
Greenwich2019年1月
Hoxton2019年11月
Ilford2020年12月
Jubilee2021年12月
  • SNAPSHOT 版本:正在开发中的快照版本,例如 2021.0.0-SNAPSHOT,快照版代表当前分支最新的代码进度,也是更新最为频繁的小版本类型,不推荐在线上正式环境使用;
  • Milestone 版本:在大版本正式发布前的里程碑版本,例如 2021.0.0-M1,M1 代表当前大版本的第一个里程碑版本,M2 代表第二个迭代里程碑,以此类推。在正式版本发布之前要经历多个里程碑的迭代,像 Spring Cloud Finchley 版足足经历了 9 个 M 版本之后,才过渡到了 RC 版。同样地,我也不推荐你在正式项目中使用 Milestone 版本;
  • Release Candidate 版本:这就是我们俗称的 RC 版,例如 2021.0.0-RC1。当一个版本迭代到 RC 版的时候,意味着离正式发布已经不远了。但是你要注意,RC 版是发布前的候选版本,走到这一步通常已经没有新的功能开发,RC 主要目的是开放出来让大家试用并尽量修复严重 Bug。
  • Release 版:稳定的正式发布版,比如 2020.0.1。你可以在自己的线上业务中放心使用 Release 稳定版。

        3.2 Spring Cloud 发展历程

        在 Spring Cloud 历史上有两家举足轻重的公司,分别是 Netflix 和 Alibaba。这两家公司分别为开源社区贡献了 Spring Cloud Netflix 组件库和 Spring Cloud Alibaba 组件库。

        Netflix 是一家美国的流媒体巨头,它靠着自己强大的技术实力,开发沉淀了一系列优秀的组件,这些组件经历了 Netflix 线上庞大业务规模的考验,功能特性和稳定性过硬。如 Eureka 服务注册中心、Ribbon 负载均衡器、Hystrix 服务容错组件等。后来Netflix 将这些组件贡献给了 Spring 开源社区,构成了 Netflix 组件库。可以这么说,在 Spring Cloud的早期阶段,是Netflix打下了的半壁江山。

        Netflix 和 Spring Cloud 度过了蜜月期之后,矛盾就逐渐发生了。先是 Eureka 2.0 开源计划的搁浅,而后 Netflix 宣布 Hystrix 进入维护状态,Eureka 和 Hystrix 这两款 Netflix 组件库的明星项目停止了新功能的研发,Spring 社区不得不开始思考替代方案,在后续的新版本中走向了“去 Netflix 化”。以至于 Netflix 的网关组件 Zuul 2.0 历经几次跳票千呼万唤始出来后,Spring Cloud 社区已经不打算集成 Zuul 2.0,而是掏出了自己的 Gateway 网关。在最新版本的 Spring Cloud 中,Netflix 的踪迹已经逐渐消散。

        Spring Cloud Alibaba 是由 Alibaba 贡献的组件库,随着阿里在开源路线上的持续投入,近几年阿里系在开源领域的声音非常响亮。Spring Cloud Alibaba 凝聚了阿里系在电商领域超高并发经验的重量级组件,保持了旺盛的更新活力,成为了 Spring Cloud 社区的一股新生代力量。Spring Cloud Alibaba 组件秉承了“大而全”的特点,就像一个大中台应用一般包罗万象,在功能特性的丰富程度上做到了应有尽有。这也是本课程选择 Spring Cloud Alibaba 组件的一个重要原因。

        下面我们看下 Spring Cloud 的组件库,后续会分别详细介绍这些组件,欢迎收藏关注。

Spring Cloud 组件
功能特性Alibab组件库Netflix组件库Spring Cloud官方或三方组件库
服务治理NacosEurekaConsul
负载均衡RibbonLoadbalancer
远程调用DubboNetflix FeignOpenfeign
服务容错SentinelHystrixResilience4j
分布式配置中心NacosSpring Cloud Config
消息总线Bus
服务网关ZuulGateway
分布式链路追踪

Sleuth

Zipkin

消息中间件RocketMQStream
分布式事务Seata

        这些组件配合使用就形成了分布式架构 Spring Cloud 的强大功能,在自己的项目中需要斟酌选择,尽量不用 Netflix 的组件,因为它的影子后续会越来越少。这些组件在后边的文章中会陆续进行详细介绍,欢迎大家收藏关注。

往期经典推荐

SpringBoot项目并发处理大揭秘,你知道它到底能应对多少请求洪峰?-CSDN博客

深入探索Elasticsearch数据写入黑箱-CSDN博客

TiDB内核解密:揭秘其底层KV存储引擎如何玩转键值对-CSDN博客

透视Redis大key背后的I/O挑战-CSDN博客

MySQL自增主键有什么作用?来自大厂的使用经验-CSDN博客

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

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

相关文章

Open3D 进阶(21)无序点云平面检测的鲁棒统计方法

目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、算法过程 除了寻找具有最大支持的单个平面外,Open3D还包含一个算法,该算法使…

【Java EE初阶二十九】Linux 系统的学习

当前写的博客系统程序,只是部署在咱们自己的电脑上,其他用户是无法直接访问的.由于 NAT 机制的存在,导致了IP 地址就被分成了 内网 IP 和 外网 IP. 云服务器,包括公司中使用专用服务器,一般都是 Linux 系统,这个系统的使用和 Windows 差异很大.(通过命令行来操作的系…

Jupyter Notebook的安装和使用(windows环境)

一、jupyter notebook 安装 前提条件:安装python环境 安装python环境步骤: 1.下载官方python解释器 2.安装python 3.命令行窗口敲击命令pip install jupyter 4.安装jupyter之后,直接启动命令jupyter notebook,在默认浏览器中打开jupyte…

SQL教学:掌握MySQL数据操作核心技能--DML语句基本操作之“增删改查“

大家好,今天我要给大家分享的是SQL-DML语句教学。DML,即Data Manipulation Language,也就是我们常说的"增 删 改 查",是SQL语言中用于操作数据库中数据的一部分。作为MySQL新手小白,掌握DML语句对于数据库数…

测试环境搭建整套大数据系统-问题篇(一:实时遇到的问题)

1. java.io.IOException: Failed to deserialize JSON ‘{“age”:867,“sex”:“fba8c074f9”,“t_insert_time”:“2024-03-04 14:12:24.821”}’ 解决方式 修改数据类型。将TIMESTAMP_LTZ改为TIMESTAMP。 2. java. lang,classNotFoundException: org,apache.flink,streami…

典中典之西电A测-气压测控仿真系统

兄弟,如果你看到这篇,只能说明你A测也挂了,没办法,哥们太菜了,抄的太假过不了你电有些老师的慧眼 这坨🐕⑩我先吃为敬 环境搭建可以参考这个兄弟的博客 一、题目要求 实现功能:使用 Arduino UNO 微控制器,搭建一个 PC 上位机远程气压检测控…

账号管理支持批量测试资产可连接性,资产管理支持通过标签方式选择资产,JumpServer堡垒机v3.10.4 LTS版本发布

2024年3月4日,JumpServer开源堡垒机正式发布v3.10.4 LTS版本。JumpServer开源项目组将对v3.10 LTS版本提供长期的支持和优化,并定期迭代发布小版本。欢迎广大社区用户升级至v3.10 LTS最新版本,以获得更佳的使用体验。 在v3.10.4 LTS版本中&a…

spring-smart-di 动态切换接口源

0、背景 一般我们系统同一个功能可能会对接多个服务商,防止某个服务商的服务不可用快速切换或者收费不同需要切换,那我们一般做快速切换逻辑传统无非就是先将每个服务商实现,然后在配置点(数据库或者nacos)配置当前正…

ChromeDriver全版本下载教程

确定自己的Chrome版本 step1. 打开Chrome浏览器右上角的三个点,再点击设置 step2. 在设置中点击“关于Chrome”,圈起来的红框即为当前Chrome版本,我的版本就是121.0.6167.185 在json中查找自己对应ChromeDriver版本下载链接 一般教程会让你…

linux条件判断之case-in-esac

之前提到的“if...then...fi”是通过比较来判断变量的,如果符合状态就进行某些行为动作,并且通过较多层次(就是elif...)的方式,进行多个变量的判断,其也可以使用case...in...esac方式进行实现 1.case...in...esac格式 case $变量…

Linux如何设计一个线程池

在设计线程池之前&#xff0c;我们可以对线程进行简单的封装这样子在线程池中就可以少一点调用接口&#xff0c;就像搭积木一样&#xff0c;一层一层的搭上去 #pragma once#include <iostream> #include <pthread.h> #include <string> #include <functi…

【树】【异或】【深度优先】【DFS时间戳】2322. 从树中删除边的最小分数

作者推荐 【二分查找】【C算法】378. 有序矩阵中第 K 小的元素 涉及知识点 树 异或 DFS时间戳 LeetCode2322. 从树中删除边的最小分数 存在一棵无向连通树&#xff0c;树中有编号从 0 到 n - 1 的 n 个节点&#xff0c; 以及 n - 1 条边。 给你一个下标从 0 开始的整数数组…

【操作系统学习笔记】文件管理1.3

【操作系统学习笔记】文件管理1.3 参考书籍: 王道考研 视频地址: Bilibili I/O 控制方式 程序直接控制方式中断驱动方式DMA 方式通道控制方式 程序直接控制方式 关键词: 轮询 完成一次读/写操作的流程 CPU 向控制器发出读指令。于是设备启动&#xff0c;并且状态寄存器设…

2021 年 12 月青少年软编等考 C 语言一级真题解析

目录 T1. 输出整数部分思路分析 T2. 疫情集中隔离思路分析 T3. 字符判断思路分析 T4. 统计数思路分析 T5. 最大质因子思路分析 T1. 输出整数部分 输入一个双精度浮点数 f f f&#xff0c;输出其整数部分。 时间限制&#xff1a;1 s 内存限制&#xff1a;64 MB 输入 一个双精…

C++惯用法之RAII思想: 资源管理

C编程技巧专栏&#xff1a;http://t.csdnimg.cn/eolY7 目录 1.概述 2.RAII的应用 2.1.智能指针 2.2.文件句柄管理 2.3.互斥锁 3.注意事项 3.1.禁止复制 3.2.对底层资源使用引用计数法 3.3.复制底部资源(深拷贝)或者转移资源管理权(移动语义) 4.RAII的优势和挑战 5.总…

探索Pandas:数据处理与分析的利剑

在这篇文章中&#xff0c;我们将深入探讨Pandas库&#xff0c;这是一个开源的Python库&#xff0c;专为数据分析和处理而设计。Pandas提供了高效的DataFrame对象&#xff0c;使得数据清洗、分析变得简单易行。通过本篇文章&#xff0c;我们不仅会了解Pandas的核心功能&#xff…

MATLAB:Image Processing Toolbox工具箱入门实战

目录 1.基本图像导入、处理和导出 2.实战项目一&#xff1a;利用imfindcircles()函数检测和测量图像中的圆形目标 1.基本图像导入、处理和导出 Basic Image Import, Processing, and Export- MATLAB & SimulinkThis example shows how to read an image into the worksp…

linux系统iptables的操作

iptables操作 安装参数解释参数使用iptables语法示例规则匹配条件通用匹配&#xff08;协议&#xff09;&#xff0c;可以独立使用通过端口规则匹配:通过ip地址修改规则: icmp类型匹配扩展匹配指定ip范围指定多端口范围MAC地址匹配通过网卡接口保存和删除规则本地端口转发 网络…

前端Vue篇之Vue 3.0 中的 Vue Composition API?Composition API与React Hook很像,区别是什么

目录 Vue 3.0 中的 Vue Composition API&#xff1f;Composition API与React Hook很像&#xff0c;区别是什么1. 实现原理2. 调用方式和性能3. 生态和社区 Vue 3.0 中的 Vue Composition API&#xff1f; 在Vue 3中&#xff0c;引入了Composition API来解决Vue 2中Options API…

Java集合框架-Collection和Map

文章目录 Collection-单列集合特点ListArrayListLinkedListVecter SetHashSetTreeSet Map-键值对集合特点Map常用APIput添加细节remove Map的三种遍历方式1.通过键找值2.通过"键值对"3.Lambda表达式foreach源码 HashMap需求 为什么要使用泛型 泛型的优点1.集合中存储…