当前位置: 首页 > news >正文

Spring Boot主从服务器详解教程

目录

1. 什么是主从服务器

1.1 基本概念

1.2 工作原理

1.3 特点说明

2. 主从服务器与主从数据库的区别

2.1 主要区别对比

2.2 架构位置

3. 主从服务器的应用场景

3.1 微服务架构

3.2 API网关

3.3 缓存服务

4. 主从服务器架构设计

4.1 基础架构图

4.2 组件说明

5. Spring Boot实现主从服务器

5.1 项目结构

5.2 核心依赖配置

5.2.1 父级pom.xml

5.3 公共模块实现

5.3.1 服务器角色枚举

5.3.2 服务器状态管理

5.3.3 数据同步接口

5.4 主服务器实现

5.4.1 主服务器启动类

5.4.2 主服务器配置

5.4.3 主服务器核心服务

5.4.4 主服务器控制器

5.5 从服务器实现

5.5.1 从服务器启动类

5.5.2 从服务器配置

5.5.3 从服务器核心服务

5.5.4 从服务器控制器

6. 负载均衡配置

6.1 Nginx配置

6.2 Spring Cloud Gateway配置

7. 健康检查机制

7.1 自定义健康检查

7.2 主从状态监控

8. 故障转移实现

8.1 主服务器故障检测

8.2 故障转移配置

9. 监控和日志

9.1 监控指标收集

9.2 日志配置

10. 最佳实践

10.1 部署建议

10.2 性能优化

10.3 安全考虑

11. 常见问题解决

11.1 数据同步延迟

11.2 脑裂问题

11.3 性能瓶颈

11.4 启动顺序问题

总结


1. 什么是主从服务器

1.1 基本概念

主从服务器是一种分布式系统架构模式,包含以下角色:

  • 主服务器(Master Server):负责处理写操作、协调工作、决策制定
  • 从服务器(Slave Server):负责处理读操作、执行主服务器分配的任务

1.2 工作原理

┌─────────────┐    同步数据/指令    ┌─────────────┐
│   主服务器   │ ────────────────→ │   从服务器1  │
│  (Master)   │                   │  (Slave1)   │
└─────────────┘                   └─────────────┘│                                 ││        ┌─────────────┐         │└────────→│   从服务器2  │←────────┘│  (Slave2)   │└─────────────┘

1.3 特点说明

  • 高可用性:从服务器可以在主服务器故障时接管
  • 负载分担:多个服务器分担处理请求
  • 水平扩展:可以根据需要增加从服务器
  • 数据一致性:主服务器负责维护数据的一致性

2. 主从服务器与主从数据库的区别

2.1 主要区别对比

特性主从服务器主从数据库
作用层面应用服务层数据存储层
主要功能处理业务逻辑、API请求存储和查询数据
同步内容应用状态、配置信息数据库记录
故障转移服务实例切换数据库实例切换
扩展方式增加服务器实例增加数据库实例

2.2 架构位置

[客户端] ↓
[负载均衡器]↓
[主从服务器集群] ← 我们要讲解的部分↓
[主从数据库集群]↓
[存储系统]

3. 主从服务器的应用场景

3.1 微服务架构

在微服务中,每个服务都可以部署主从架构:

// 用户服务的主从部署
user-service-master: 192.168.1.10:8081
user-service-slave1: 192.168.1.11:8081
user-service-slave2: 192.168.1.12:8081

3.2 API网关

// API网关的主从配置
gateway-master: 处理所有写操作和路由决策
gateway-slave: 处理读操作和请求转发

3.3 缓存服务

// Redis缓存服务的主从应用层
cache-service-master: 负责缓存更新策略
cache-service-slave: 负责缓存查询

4. 主从服务器架构设计

4.1 基础架构图

                    [负载均衡器]│┌──────────┼──────────┐│          │          │┌─────────▼─┐  ┌─────▼─┐  ┌─────▼─┐│ Master   │  │Slave1 │  │Slave2 ││ Server   │  │Server │  │Server │└─────────┬─┘  └───────┘  └───────┘│┌─────────▼─────────┐│   配置中心/注册中心  ││   (Nacos/Consul)  │└───────────────────┘

4.2 组件说明

  • 注册中心:服务发现和健康检查
  • 配置中心:统一配置管理
  • 负载均衡器:请求分发
  • 监控系统:性能监控和告警

5. Spring Boot实现主从服务器

5.1 项目结构

master-slave-demo/
├── master-server/          # 主服务器
│   ├── src/main/java/
│   ├── src/main/resources/
│   └── pom.xml
├── slave-server/           # 从服务器
│   ├── src/main/java/
│   ├── src/main/resources/
│   └── pom.xml
└── common/                 # 公共模块├── src/main/java/└── pom.xml

5.2 核心依赖配置

5.2.1 父级pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>master-slave-demo</artifactId><version>1.0.0</version><packaging>pom</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version><relativePath/></parent><modules><module>common</module><module>master-server</module><module>slave-server</module></modules><dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Actuator --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Nacos Discovery --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2021.0.1.0</version></dependency><!-- Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency></dependencies>
</project>

5.3 公共模块实现

5.3.1 服务器角色枚举
package com.example.common.enums;public enum ServerRole {MASTER("master", "主服务器"),SLAVE("slave", "从服务器");private final String code;private final String description;ServerRole(String code, String description) {this.code = code;this.description = description;}// getter方法public String getCode() { return code; }public String getDescription() { return description; }
}
5.3.2 服务器状态管理
package com.example.common.model;import com.example.common.enums.ServerRole;
import org.springframework.stereotype.Component;@Component
public class ServerContext {private ServerRole role;private String serverId;private boolean active = true;private long startTime;public ServerContext() {this.startTime = System.currentTimeMillis();this.serverId = generateServerId();}private String generateServerId() {return System.getProperty("server.role", "unknown") + "-" + System.currentTimeMillis();}// getter和setter方法public ServerRole getRole() { return role; }public void setRole(ServerRole role) { this.role = role; }public String getServerId() { return serverId; }public void setServerId(String serverId) { this.serverId = serverId; }public boolean isActive() { return active; }public void setActive(boolean active) { this.active = active; }public long getStartTime() { return startTime; }public boolean isMaster() {return ServerRole.MASTER.equals(role);}public boolean isSlave() {return ServerRole.SLAVE.equals(role);}
}
5.3.3 数据同步接口
package com.example.common.service;public interface DataSyncService {/*** 同步数据到从服务器*/void syncToSlaves(String data);/*** 从主服务器接收数据*/void receiveFromMaster(String data);/*** 检查同步状态*/boolean isSyncComplete();
}

5.4 主服务器实现

5.4.1 主服务器启动类
package com.example.master;import com.example.common.enums.ServerRole;
import com.example.common.model.ServerContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication(scanBasePackages = "com.example")
@EnableDiscoveryClient
public class MasterServerApplication implements CommandLineRunner {@Autowiredprivate ServerContext serverContext;public static void main(String[] args) {System.setProperty("server.role", "master");SpringApplication.run(MasterServerApplication.class, args);}@Overridepublic void run(String... args) throws Exception {serverContext.setRole(ServerRole.MASTER);System.out.println("主服务器启动完成,角色:" + serverContext.getRole().getDescription());}
}
5.4.2 主服务器配置
# master-server/src/main/resources/application.yml
server:port: 8081spring:application:nam
http://www.dtcms.com/a/273413.html

相关文章:

  • 性能狂飙 Gooxi 8卡5090服务器重新定义高密度算力
  • 中国银联豪掷1亿采购海光C86架构服务器
  • 没有管理员权限,在服务器安装使用 Jupyter + R 内核
  • JVM 内存结构
  • QTextCodec的功能及其在Qt5及Qt6中的演变
  • RLHF(人类反馈的强化学习)
  • Java JDK 下载指南
  • ThinkBook 14s IWL(20RM)OEM系统镜像原厂Win10系统
  • Zero-Shot(零样本学习),One-Shot(单样本学习),Few-Shot(少样本学习)概述
  • CVE-2023-41990/CVE-2023-32434/CVE-2023-38606/CVE-2023-32435
  • Spring事务管理深度解析:原理、实践与陷阱
  • 开发需要写单元测试吗?
  • 关键字前跟空格或首字母, 关键字后跟空格或标点符号; 标点符号后面不是必须跟空格;
  • 无监督光流,unflow, uflow,upflow
  • imx6ull-裸机学习实验14(下)——驱动DDR3和测试
  • 数组和指针回顾,练习与解析
  • OSCP官方靶场-Solstice WP
  • 【第二节】ubuntu server配置静态IP
  • (思维)洛谷 P3081 USACO13MAR Hill Walk 题解
  • 网络安全基础概念以及虚拟环境的搭建
  • alpinelinux的网络配置
  • ZW3D 二次开发-创建六面体方框
  • 力扣面试150题--全排列
  • AOSP自启动拦截框架Intent Firewall
  • 反向传播notes
  • 敏捷测试中的质量闸门如何设置?
  • 位运算算法题
  • 第七讲:C++中的string类
  • 深度学习参数初始化方法详解及代码实现
  • 深度学习×第7卷:参数初始化与网络搭建——她第一次挑好初始的重量