微服务学习笔记(1)——SpringColud概述


🔥我的主页: 九转苍翎
⭐️个人专栏: 《Java SE 》 《Java集合框架系统精讲》 《MySQL高手之路:从基础到高阶 》 《计算机网络 》 《Java工程师核心能力体系构建》 《RabbitMQ理论与实践》
天行健,君子以自强不息。


1.系统架构的迭代

1.1 单体架构

定义:整个应用程序的所有功能模块(如用户管理、订单管理、支付管理等)都打包在一个单一的进程中,使用同一个数据库
优点:

  • 技术栈统一:开发、测试、部署简单。
  • 易于开发:初期功能集中,模块间直接调用,沟通成本低
  • 性能高:本地方法调用,没有网络开销
  • 部署单一:只需维护一个应用

缺点:

  • 代码复杂度高:随着功能增加,代码库变得庞大、耦合严重,难以理解和维护
  • 技术栈固化:难以引入新的框架或语言
  • 可扩展性差:无法针对特定模块进行独立伸缩,必须整体伸缩,成本高
  • 部署不灵活:任何微小的修改都需要重新构建和部署整个应用,风险高、上线慢
  • 可靠性风险:一个模块的bug可能导致整个系统崩溃

1.2 集群与分布式架构

定义:

  • 集群 :为了解决单点故障和性能瓶颈,将相同的单体应用部署在多台服务器上,通过负载均衡器对外提供服务。本质上是"复制"
  • 分布式:将单体应用按业务维度拆分成多个独立的子系统,这些子系统可以部署在不同的服务器上,通过网络通信协作完成整体业务。本质上是"拆分"

优点:

  • 高可用与高性能:通过集群实现负载均衡和故障转移
  • 初步解耦:通过分布式拆分,系统在物理上分离,技术栈可以按服务选择
  • 数据库拆分:可能出现分库分表,读写分离

缺点:

  • 服务治理复杂:需要管理它们的地址(服务发现)、调用关系、负载均衡策略
  • 通信可靠性:网络调用代替本地调用,面临超时、重试、网络故障等问题。
  • 数据一致性:从单一数据库变为分布式数据库,面临分布式事务难题
  • 运维复杂:需要监控、管理成百上千的服务实例,部署、配置、日志收集都变得困难
  • 服务间依赖:可能形成复杂的调用链

1.3 微服务架构

定义:微服务架构是分布式架构的一种更精细、更彻底的实践。它强调将单个应用程序拆分为一组微小、自治的服务

分布式架构与微服务架构的区别:

  • 分布式架构:侧重于压力的分散,强调的是服务的分散化
  • 微服务架构:侧重于能力的分散,更强调服务的专业化和精细分工

2.SpringCloud概述

2.1 微服务、SpringCloud与SpringBoot的关系

  • 微服务是架构思想:强调将单个应用拆分为一组小型的、独立部署的服务,每个服务围绕业务能力构建。但思想落地需要工具------服务发现、配置中心、负载均衡等这些分布式系统要解决的问题,微服务本身并不提供
  • Spring Cloud是构建微服务架构的一套解决方案:规定了应用间协作的标准方式,涵盖以下核心组件
    • 服务发现:互相知道在哪里
    • 远程调用:支持服务间接口调用
    • 负载均衡:将请求/流量按照规定的算法分配到处理同一业务的不同机器上
    • 配置管理:外部化动态配置和集中化管理配置
    • API网关:请求的统一入口
  • SpringBoot是构建单个微服务的基础框架:通过自动配置、起步依赖和嵌入式容器等特性,快速创建独立运行的Spring应用

2.2 SpringCloud的实现方式

Spring Cloud 本身是一套标准/规范,具体实现方式主要分为以下几种技术选型方案

站在Java的视角进行类比的话,Spring Cloud相当于定义了一堆interface,下述的Spring Cloud Netflix/Spring Cloud Alibaba相当于同一接口的不同实现类

组件角色 Spring Cloud Netflix Spring Cloud Alibaba Spring Cloud 官方原生
服务发现 Eureka Nacos Consul / Zookeeper
负载均衡 Ribbon Ribbon / Spring Cloud LoadBalancer Spring Cloud LoadBalancer
远程调用 Feign Feign / RestTemplate OpenFeign
熔断降级 Hystrix Sentinel Resilience4j
API 网关 Zuul 1.x Spring Cloud Gateway Spring Cloud Gateway
配置中心 Spring Cloud Config Seata Spring Cloud Config / Consul / Nacos

2.3 版本对应关系

3.父子工程搭建

3.1 项目结构

3.2 依赖导入和pom文件解析

3.2.1 spring-cloud-blog

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring-cloud-blog</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>modules</module>
    </modules>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <java.version>17</java.version>
        <mybatis.version>3.0.3</mybatis.version>
        <mysql.version>8.0.33</mysql.version>
        <spring-cloud.version>2025.0.0</spring-cloud.version>
        <spring-cloud-alibaba.version>2025.0.0.0</spring-cloud-alibaba.version>
        <spring-boot.version>3.5.0</spring-boot.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <!-- SpringCloud 微服务 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringCloud Alibaba 微服务 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringBoot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- mybatis -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
            <!-- MySQL驱动 -->
            <dependency>
                <groupId>com.mysql</groupId>
                <artifactId>mysql-connector-j</artifactId>
                <version>${mysql.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

properties:Maven的全局变量定义区,用于集中管理项目中重复使用的配置值

xml 复制代码
<!-- 语法 -->
<spring-boot.version>3.2.4</spring-boot.version>
<!-- 引用方式 -->
<version>${spring-boot.version}</version>

dependencyManagement:Maven依赖版本管理中心,只管理版本,不引入依赖


BOM导入(当前配置):BOM是一个特殊的POM文件,里面只干一件事------定义一堆依赖的版本号

标签 作用说明
type pom 打包类型,表示依赖的不是JAR,是POM文件
scope import 作用域,表示将依赖导入当前项目

pom + import表示将外部的一个POM文件导入当前项目

xml 复制代码
<!-- 示例 -->
<dependencyManagement>
    <dependencies>
        <!-- SpringCloud 微服务 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <!-- 版本:2025.0.0 -->
            <version>${spring-cloud.version}</version>
            
            <type>pom</type>
            <scope>import</scope>
            
        </dependency>
    </dependencies>
</dependencyManagement>

Ctrl + 鼠标左键点击 groupIdartifactId 标签的内容,跳转到导入的POM文件

总之,上述示例中的配置的作用是:采用 Spring Cloud 官方 BOM 作为版本基准,将其内所有组件版本定义合并入当前项目的版本管理中心。此后引入具体 Spring Cloud 组件时无需再书写版本号,实现版本统一管控


dependencies :依赖引入区,这里写的每个依赖都会被下载、被 classpath 加载、被项目使用

3.2.2 modules

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <!-- Maven 的继承声明,让子模块继承父POM的所有配置 -->
    <parent>
        <groupId>org.example</groupId>
        <artifactId>spring-cloud-blog</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>modules</artifactId>
    <packaging>pom</packaging>
    <modules>
        <module>order-service</module>
        <module>product-service</module>
    </modules>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
        </dependency>
    </dependencies>
</project>

3.3 启动项目

order-service和product-service服务会继承父工程的所有依赖,创建启动类然后启动即可

java 复制代码
@SpringBootApplication
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}
java 复制代码
@SpringBootApplication
public class ProductServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductServiceApplication.class, args);
    }
}
相关推荐
墨染青竹梦悠然2 小时前
基于SpringBoot + vue的农产品销售系统(华夏鲜仓)
vue.js·spring boot·python·django·毕业设计·毕设
消失的旧时光-19432 小时前
第二十一课:系统是怎么一步步拆坏的?——单体到模块化实践(完整工程版)
java·spring boot·后端·架构
Coder_Boy_2 小时前
Java高级_资深_架构岗 核心面试知识点(AI整合+混合部署)
java·人工智能·spring boot·后端·面试·架构
计算机学姐2 小时前
基于SpringBoot的药房管理系统【个性化推荐+数据可视化】
java·spring boot·后端·mysql·spring·信息可视化·java-ee
小沈同学呀3 小时前
Spring Boot实现加密字段模糊查询的最佳实践
java·spring boot·后端·encrypt
J_liaty3 小时前
SpringBoot缓存预热:ApplicationRunner与CommandLineRunner深度对比与实战
spring boot·后端·缓存
康小庄3 小时前
Java自旋锁与读写锁
java·开发语言·spring boot·python·spring·intellij-idea
沙河板混3 小时前
@Mapper注解和@MapperScan注解
java·spring boot·spring
xifangge20253 小时前
[报错] SpringBoot 启动报错:Port 8080 was already in use 完美解决(Windows/Mac/Linux)
java·windows·spring boot·macos·错误解决