Spring 必会之微服务篇(1)

目录

引入

单体架构

集群和分布式架构 

微服务架构

挑战

Spring Cloud

介绍

实现方案

Spring Cloud Alibaba


引入

单体架构

当我们刚开始学开发的时候,基本都是单体架构,就是把一个项目的所有业务的实现功能都打包在一个 war 包或者 Jar 包中。这种架构开发简单,部署简单,一个项目就包含了所有的功能,省去了多个项目之间的交互和调用消耗,直接部署在一个服务即可:

集群和分布式架构 

但是随着网站的用户量越来越大,对应的需求也会越来越多,流量也会越来越大服务可能就会面临一些问题:

  • 后端服务器的压力过大,导致负载变高,出现用户无法访问或者访问失败的情况;
  • 业务场景逐渐复杂,为了满足用户需求,单体应用也会越来越大,各个业务代码之间的耦合度也会越来越高。任何一个问题,都需要项目的重新构建和发布,降低了应用的可用性;
  • 一个微笑的问题,可能会导致整个服务都挂掉

那有问题出现我们肯定也要有对应的解决方案,可以从以下两个方面进行优化:

  • 横向拓展:添加服务器,把单台机器变为多台机器的集群;(集群架构)
  • 纵向拓展:把一个应用按照业务拆分为多个小项目,这个架构也叫垂直架构;(分布式架构)以单体结构规模的项目为单位进行垂直划分,也就是将一个大项目拆分为一个个单体结构项目,项目和项目之间相对比较独立,接口多为数据同步功能。

这两种方案也引出下面要说的集群和分布式:

  • 集群(cluster):将一个系统完整的部署到多个服务器上,每个服务器都能提供系统所有的服务,多个服务器之间通过负载均衡调度完成任务,每一个服务器称为集群节点(node);
  • 分布式(distributed):将一个系统拆分为多个子系统,多个子系统部署在多个服务器上,多个服务器上的子系统协同合作完成一个特定任务;

区别和联系:

  1. 概念上:集群是多个计算机做同样的事情,分布式是多个计算机做不同的事情;
  2. 功能上:集群的每个结点功能是相同的,并且可以替代的,分布式也是多个结点组成的系统,但是每个节点完成的业务是不一样的,一个结点出现问题整改服务都会挂掉;
  3. 关系上:分布式和集群在实践中会配合使用,比如分布式的某个结点可能由一个集群来代替,分布式结构大多是建立在集群上的,所以实际的分布式架构设计中并不会把分布式和集群单独区分,统称:分布式架构;

微服务架构

虽然分布式架构已经按照业务拆分为一个个小的项目,但是还是会有一些重复功能的开发,比如订单系统,电商平台和支付系统都会涉及到;

在分布式架构下,当部署的服务越来越多的时候,重复的代码就会越来越多,服务之间的调用关系也越来越复杂。因此我们可以把一些通用的,会被多个上层服务调用的共享业务,提取成独立基础服务,组成一个个微小的服务,这就是微服务;可以把微服务理解为一个很小的服务,小到一个服务只对应一个单一的功能并且可以单独部署运行,服务之间通过 RESTRPC 协议通讯;

从这个角度来看的话,微服务架构就是分布式架构的一种拓展,这种架构模式下它拆分的粒度更小,服务更加独立,分布式就是微服务拆分的过程,微服务就是分布式架构的一种最佳实践方案:微服务是一种经过良好架构设计的分布式架构方案

分布式架构侧重于压力的分散,强调的是服务的分散化。微服务侧重于能力的分散,更强调服务的专业化和精细分工,从实践的角度来看,微服务架构通常是分布式架构,反之则未必成立,所以选择微服务通常意味着需要解决分布式架构的各种难题。

微服务架构,首先是服务化,就是将单体架构中的功能模块从单体应用中拆分出来,独立部署多个服务。同时要满足以下特点:

  1. 单一职责:一个微服务负责一部分业务功能,并且其核心数据不依赖于其它模块;
  2. 团队治理:每一个微服务都有自己独立的开发,测试,发布,运维人员,团队规模适中;
  3. 服务自治:每个微服务都独立打包部署,访问自己独立的数据库,并做好服务隔离;

所以,微服务架构解决了单体架构存在的问题,特别适合大型项目的开发,因此被大家广泛采用。

挑战

虽然微服务具有很多优势,但是由于服务数量的增加,服务治理也是要面对的一个巨大挑战:

  • 服务依赖:随着服务数量增多,服务之间的关系也变得更加复杂,一个服务的更改需要考虑其对其他服务的影响;
  • 运维成本:一个业务流程会涉及到多个微服务共同完成,有更多的服务需要编译,部署,运行,甚至可能是不同的编程语言,不同的运行环境,当然也需要集群来处理故障转移;
  • 开发和测试:服务之间调用引起网络延迟,不可靠网络,如何进行容错处理等问题,这对开发和测试而言,难度也很大;
  • 服务监控:微服务架构下,不仅需要对整个链路进行监控,还需要对每个服务实现监控;
  • 负载均衡:微服务架构中的服务实例数量可能会非常庞大,因此需要有效的服务发现和负载均衡机制来管理流量和保证高可用性;

并且我们在拆分服务的时候也会遇到很多问题,比如:

  • 如果出现跨服务的业务该如何处理
  • 页面请求到底该访问哪一个路径
  • 如何实现各个服务之间的服务隔离

如果选择微服务架构的话,以上问题都需要我们自己解决,我们也可以拿市场上比较成熟的技术拿来用,在 Java 领域最被广泛使用的就是下面要讲的 Spring Cloud。

Spring Cloud

介绍

可以先进入 Spring Cloud 的官网看看:Spring Cloud 官网

微服务拆分以后碰到的各种问题都有对应的解决方案和微服务组件,而 Spring Cloud 框架可以说是目前 Java 领域最全面的微服务组件的集合了。它提供了一些可以让开发人员快速构建分布式服务的工具,比如配置管理,服务发现,熔断,智能路由等,它们可以在任何分布式的环境中很好的工作;

简单来说,Spring Cloud 就是分布式微服务架构的一站式解决方案,是微服务架构落地的多种技术的集合:

  • Distributed/versioned configuration 分布式版本配置
  • Service registration and discovery 服务注册和发现
  • Routing 路由
  • Service-to-service calls 服务调用
  • Loading balancing 负载均衡
  • Circuit Breakers 熔断器
  • Distributed messageing 分布式消息
  • ......

Spring Cloud 并不是 Spring 团队研发的框架,它只是把一些比较优秀的解决微服务架构中常见的问题的开源框架基于 Spring Cloud 规范进行了整合,并基于 Spring Boot 的风格,对这些组件进行封装,屏蔽掉了复杂的配置和实现原理,为开发者提供了开箱即用的微服务开发体验,这些开源技术的框架还是由各个公司来维护的,Spring Cloud 就是把这些管理起来的。

实现方案

在 Spring Cloud 规范下,最为出名的两种实现方案就是:

  • Spring Cloud Netflix
  • Spring Cloud Alibaba

之前 Spring Cloud 一度使用 Spring Cloud Netflix 最为默认解决方案,但是由于 Netflix 公司在2018年左右宣布核心组件 Hystrix,Ribbon,Zuul 等进入维护状态,所以 Spring Cloud 也被迫宣布删除这些维护模块。

spring-cloud-netflix 也并没有从 Spring Cloud 的依赖中全部删除,只是从2020.0版本开始只管理 Eureka 组件。

并且 Cloud 官方也提供了一些替换建议,有些还是自研的:

  • Hystrix ---> Resilience4i
  • Hystrix Dashboard/Turbine ---> Micrmeter + Monitoring System
  • Ribbon ---> Spring Cloud Loadbalancer
  • Zuul 1 ---> Spring Cloud Gateway
  • Archaius ---> Spring Boot 外部配置 + Spring Cloud 配置

Spring Cloud Alibaba

Spring Cloud Alibaba 是阿里巴巴集团下的开源组件和云产品在 Spring Cloud 规范下实现。

如果说 Spring Cloud Netflix 是 Spring Cloud 的第一代实现,那么 Spring Cloud Alibaba 也可以看作是 Spring Cloud 的第二代实现,主要由 Nacos,Sentinel,Seate 等组件组成。

使用的 Spring Cloud 版本要与你的 Spring 项目的版本与官网保持一致,使用官网指定的版本,不然会出问题:

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

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

相关文章

计算机的基本组成

#灵感# 记录下基础知识,此处专指计算机硬件方面,捎带记下芯片知识。 综述: 计算机硬件的基本组成包括运算器、控制器、存储器、输入设备和输出设备五大部分。其中,集成在一起的运算器和控制器称为 CPU(处理器&#x…

【Python 列表(List)】

Python 中的列表(List)是最常用、最灵活的有序数据集合,支持动态增删改查操作。以下是列表的核心知识点: 一、基础特性 有序性:元素按插入顺序存储可变性:支持增删改操作允许重复:可存储重复元…

Qt 的原理及使用(1)——qt的背景及安装

1. Qt 背景介绍 1.1 什么是 Qt Qt 是⼀个 跨平台的 C 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形 界⾯所需的所有功能。它是完全⾯向对象的,很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模 式,开发者可以通过简单的拖拽…

多分类问题softmax传递函数+交叉熵损失

在多分类问题中,Softmax 函数通常与交叉熵损失函数结合使用。 Softmax 函数 Softmax 函数是一种常用的激活函数,主要用于多分类问题中。它将一个实数向量转换为概率分布,使得每个元素的值在 0 到 1 之间,且所有元素的和为 1。 …

数智读书笔记系列032《统一星型模型--一种敏捷灵活的数据仓库和分析设计方法》

引言 在当今数字化时代,数据仓库作为企业数据管理的核心基础设施,承担着整合、存储和提供企业数据的关键角色。随着商业环境的快速变化和业务需求的日益复杂,数据仓库的设计方法也在不断演进,以适应新的挑战和要求。 背景与意义 数据仓库领域长期存在着两种主流方法论之…

RT-Thread 深入系列 Part 1:RT-Thread 全景总览

摘要: 本文将从 RTOS 演进、RT-Thread 的版本分支、内核架构、核心特性、社区与生态、以及典型产品应用等多维度,全面呈现 RT-Thread 的全景图。 关键词:RT-Thread、RTOS、微内核、组件化、软件包管理、SMP 1. RTOS 演进与 RT-Thread 定位 2…

[docker基础一]docker简介

目录 一 消除恐惧 1) 什么是虚拟化,容器化 2)案例 3)为什么需要虚拟化,容器化 二 虚拟化实现方式 1)应用程序执行环境分层 2)虚拟化常见类别 3)常见虚拟化实现 一)主机虚拟化(虚拟机)实现 二)容器虚拟化实现 一 消除恐…

PostgreSQL 的 pg_advisory_lock 函数

PostgreSQL 的 pg_advisory_lock 函数 pg_advisory_lock 是 PostgreSQL 提供的一种应用级锁机制,它不锁定具体的数据库对象(如表或行),而是通过数字键值来协调应用间的并发控制。 锁的基本概念 PostgreSQL 提供两种咨询锁(advi…

SGLang 实战介绍 (张量并行 / Qwen3 30B MoE 架构部署)

一、技术背景 随着大语言模型(LLM)的飞速发展,如何更高效、更灵活地驾驭这些强大的模型生成我们期望的内容,成为了开发者们面临的重要课题。传统的通过拼接字符串、管理复杂的状态和调用 API 的方式,在处理复杂任务时…

微服务中 本地启动 springboot 无法找到nacos配置 启动报错

1. 此处的环境变量需要匹配nacos中yml配置文件名的后缀 对于粗心的小伙伴在切换【测试】【开发】环境的nacos使用时会因为这里导致项目总是无法启动成功

Lua从字符串动态构建函数

在 Lua 中,你可以通过 load 或 loadstring(Lua 5.1)函数从字符串动态构建函数。以下是一个示例: 示例 1:基本动态函数构建 -- 动态构建一个函数 local funcStr "return function(a, b) return a b end"-…

【Python】‌Python单元测试框架unittest总结

1. 本期主题:Python单元测试框架unittest详解 unittest是Python内置的单元测试框架,遵循Java JUnit的"测试驱动开发"(TDD)理念,通过继承TestCase类实现测试用例的模块化组织。本文聚焦于独立测试脚本的编写…

【Python 实战】---- 使用Python批量将 .ncm 格式的音频文件转换为 .mp3 格式

1. 前言 .ncm 格式是网易云音乐专属的加密音频格式,用于保护版权。这种格式无法直接播放,需要解密后才能转换为常见的音频格式。本文将介绍如何使用 Python 批量将 .ncm 格式的音频文件转换为 .mp3 格式。 2. 安装 ncmdump ncmdump 是一个专门用于解密 .ncm 文件的工具。它…

Linux 学习笔记2

Linux 学习笔记2 一、定时任务调度操作流程注意事项 二、磁盘分区与管理添加新硬盘流程磁盘管理命令 三、进程管理进程操作命令服务管理(Ubuntu) 四、注意事项 一、定时任务调度 操作流程 创建脚本 vim /path/to/script.sh # 编写脚本内容设置可执行权…

YOLO目标检测算法

文章目录 前言一、目标检测算法简介1、传统目标检测算法(1)R-CNN算法简介(2)Fast R-CNN算法简介(3)Faster R-CNN算法简介 2、目标检测中的算法设计范式(1)one-stage(2&am…

【软件设计师:软件】20.软件设计概述

一、软件设计基本原则 一、软件设计基本原则 1. 模块 是指执行某一特定任务的数据结构和程序代码。 将模块的接口和功能定义为其外部特性将模块的局部数据和实现该模块的程序代码称为内部特性。在模块设计时,最重要的原则就是实现信息隐蔽和模块独立。 2 . 信息隐蔽 将每…

软件工程之面向对象分析深度解析

前文基础: 1.软件工程学概述:软件工程学概述-CSDN博客 2.软件过程深度解析:软件过程深度解析-CSDN博客 3.软件工程之需求分析涉及的图与工具:软件工程之需求分析涉及的图与工具-CSDN博客 4.软件工程之形式化说明技术深度解…

需求分析阶段测试工程师主要做哪些事情

在软件测试需求分析阶段,主要围绕确定测试范围、明确测试目标、细化测试内容等方面开展工作,为后续测试计划的制定、测试用例的设计以及测试执行提供清晰、准确的依据。以下是该阶段具体要做的事情: 1. 需求收集与整理 收集需求文档&#x…

vLLM部署Qwen2-7B模型推理

vllm简介 vLLM是一个高效的大语言模型推理和部署服务系统,专为大型语言模型的高效执行而设计。它不仅支持多种量化技术以减少模型大小和加速推理过程,还提供了与OpenAI API兼容的服务接口,使得现有的应用程序能够无缝对接。 一、前提环境 …

【STM32 学习笔记】GPIO输入与输出

GPIO详解 一、GPIO基本概念 GPIO(通用输入输出)是微控制器与外部设备交互的核心接口,具有以下特性: 可编程控制输入/输出模式支持数字信号的读取与输出集成多种保护机制复用功能支持片上外设连接 二、GPIO位结构解析 2.1 保护二…