微服务学习笔记(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);
    }
}
相关推荐
用户908324602736 小时前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
用户8307196840821 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解1 天前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解1 天前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记1 天前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者2 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840822 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解2 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端
初次攀爬者3 天前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺3 天前
搞懂@Autowired 与@Resuorce
java·spring boot·后端