尚硅谷 SpringCloud 01 分布式概念-工程创建-nacos安装-nacos服务注册与发现-远程调用-负载均衡注解版-配置中心-动态刷新-环境隔离

1.分布式基础

2.单体架构-集群架构-分布式架构

  • 单体架构 顶不住大量访问高并发
  • 集群架构 - 多语言团队交互问题
  • 分布式架构 - 微服务



    3.环境准备
  • 版本选择

    4.项目结构
  • 创建cloud-demo项目
  • 只有pom.xml文件
java 复制代码
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <packaging>pom</packaging>
    <groupId>com.atguigu.cloud</groupId>
    <artifactId>cloud-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloud-demo</name>
    <description>Demo project for Spring Boot</description>


    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring-cloud.version>2023.0.3</spring-cloud.version>
        <spring-cloud-alibaba.version>2023.0.3.2</spring-cloud-alibaba.version>
    </properties>


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  • 在cloud-demo项目下新建模块
  • services是用来管理下面的项目的,也不写代码-也只有pom.xml文件
  • 在services模块下,继续创建模块

  • maven调成多级目录
  • 注册中心
  • Nacos安装
  • 启动nacos
  • 启动Nacos


  • 服务注册步骤

  • 注册service-order

  • 注册service-product

  • 启动多个程序,形成集群


  • 注册中心 - 服务发现

  • EnableDiscoveryClient 注解 -Spring Cloud Alibaba 2021.0.1.0 及以上版本,该版本对服务注册的注解做了简化 ------无需显式添加 @EnableDiscoveryClient

  • 可能是因为使用的是 Spring Cloud Alibaba 2021.0.1.0 及以上版本,该版本对服务注册的注解做了简化 ------无需显式添加 @EnableDiscoveryClient,只要引入了 Nacos 注册中心的依赖并配置了 spring.cloud.nacos.server-addr,微服务就会自动注册到 Nacos。

  • DiscoverClient 作用:

  • 获取服务实例列表:可通过它查询指定服务的所有实例(包含实例的 IP、端口、元数据等信息)

  • 可以获取注册中心中所有已注册的服务名称列表

  • 实现自定义服务调用:结合获取到的实例信息,可手动实现 HTTP 调用(如使用 RestTemplate),灵活控制服务调用的逻辑(如自定义负载均衡策略)。

  • 远程调用

  • 远程调用-下单场景

  • 商品服务

    • Product类
java 复制代码
@Data
public class Product {
    private Long id;
    private BigDecimal price;
    private String productName;
    private int num;
}


  • 订单服务
  • Order类
java 复制代码
@Data
public class Order {
    private Long id;
    private BigDecimal totalAmount;
    private Long userId;
    private String nickName;
    private String address;
    private List<Object> productList;
}


  • 远程调用
  • 在cloud-demo下新建一个module,作为数据模型层,所有微服务的数据模型都在这
  • 将service-order和service-product模块的bean删除,转移到model里模块里,统一管理
  • 在service-order和service-product 中引入model模块的依赖

  • 远程调用 手动调用的详解
  • 获取并装载远程调用的product信息
  • 远程调用成功
  • 负载均衡
  • 引入负载均衡依赖
java 复制代码
<!--        负载均衡-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
  • 负载均衡注解版
  • 代码更改
  • 注册中心宕机,还能调用成功吗
  • 虽然注册中心宕机,但实例缓存中有地址且服务本身并未宕机,所以可以继续远程调用,但无法更新服务器的状态
  • 配置中心

java 复制代码
        <!-- nacos配置中心依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
  • 引入nacos service-order.properties配置
  • 在nacos配置中心创建配置文件
  • 获取nacos配置成功
  • @RefreshScope 自动刷新,直接改配置后,会更新成改后的数据
  • 若不加@RefreshScope 自动刷新,则更改配置文件后,请求结果没有变化
  • 加了@RefreshScope 自动刷新后,动态改变后,每次请求会以最新的配置为准
  • service-product统一引入了配置中心依赖,但没有导入配置-就报错了
  • 要么去配置,要么禁用导入检查
  • 批量绑定数据-@ConfigurationProperties,无需@RefreshScope和@Value 推荐!


  • 配置中心 - 数据隔离

  • nacos 命名空间隔离dev uat prod环境
  • 分组隔离业务
  • 将dev开发环境的开吗克隆到test测试环境
  • 按需加载 采用application.yml文件
  • 优化,灵活选择不同的命名空间
  • 不同的环境要加载的文件数量不同
  • 没有文件就会报错,设置成先不检查
  • 总结
相关推荐
饕餮争锋19 小时前
Spring AOP原理简析
java·spring
lang2015092819 小时前
Kafka元数据缓存机制深度解析
分布式·缓存·kafka
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ20 小时前
日志打印配置:logback-spring.xml配置;info和error完全区分了,并且按时间拆分了
xml·spring·logback
qq_3432470320 小时前
单机版认证kafka
数据库·分布式·kafka
武子康21 小时前
Java-199 JMS Queue/Topic 集群下如何避免重复消费:ActiveMQ 虚拟主题与交付语义梳理
java·分布式·消息队列·rabbitmq·activemq·mq·java-activemq
源代码•宸21 小时前
分布式缓存-GO(简历写法、常见面试题)
服务器·开发语言·经验分享·分布式·后端·缓存·golang
A尘埃21 小时前
Java业务场景(高并发+高可用+分布式)
java·开发语言·分布式
苦学编程的谢1 天前
RabbitMQ_7_高级特性(4)
分布式·rabbitmq
赵榕1 天前
RabbitMQ发布订阅模式同一消费者多个实例如何防止重复消费?
分布式·微服务·rabbitmq
古城小栈1 天前
雾计算架构:边缘-云端协同的分布式 AI 推理
人工智能·分布式·架构