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文件

- 优化,灵活选择不同的命名空间

- 不同的环境要加载的文件数量不同

- 没有文件就会报错,设置成先不检查

- 总结
