设计并实现一个多线程图书馆管理系统,涉及数据库操作

没有实现全部功能,希望路过的大佬,可以实现全部功能,在评论区聊聊

在这里插入图片描述
创建数据库library-demo

CREATE DATABASE `library-demo`

创建图书表book

CREATE TABLE `book` (`bookId` int(11) NOT NULL AUTO_INCREMENT COMMENT '图书ID',`bookName` varchar(15) DEFAULT NULL COMMENT '书名',`author` varchar(10) DEFAULT NULL COMMENT '作者',`publish` varchar(100) DEFAULT NULL COMMENT '出版社',`isbn` varchar(30) DEFAULT NULL COMMENT 'ISBN',`introduction` varchar(50) DEFAULT NULL COMMENT '简介',`language` varchar(10) DEFAULT NULL COMMENT '语言',`price` varchar(10) DEFAULT NULL COMMENT '价格',`bookStatus` tinyint(4) DEFAULT NULL COMMENT '图书状态',`bookImage` varchar(30) DEFAULT NULL COMMENT '封面',`bookCount` int(11) DEFAULT NULL COMMENT '存有量',`borrowDate` date DEFAULT NULL COMMENT '借阅日期',`returnDate` date DEFAULT NULL COMMENT '返还日期',`borrowTime` int(11) DEFAULT NULL COMMENT '借阅时长',PRIMARY KEY (`bookId`)
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8 COMMENT='图书表';

创建用户表user

CREATE TABLE `user` (`userId` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',`userName` varchar(10) DEFAULT NULL COMMENT '用户名字',`password` varchar(10) DEFAULT NULL COMMENT '密码',`email` varchar(10) DEFAULT NULL COMMENT '邮箱',`phone` varchar(15) DEFAULT NULL COMMENT '电话',`address` varchar(20) DEFAULT NULL COMMENT '地址',PRIMARY KEY (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='用户表';

创建用户图书关联表bookuser

CREATE TABLE `bookuser` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '关系id',`book_id` int(11) DEFAULT NULL COMMENT '图书id',`user_id` int(11) DEFAULT NULL COMMENT '用户id',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户图书关系表';

创建借阅记录表borrowslog

CREATE TABLE `borrowslog` (`logId` int(11) NOT NULL AUTO_INCREMENT COMMENT '日志id',`borrowsFlag` varchar(10) DEFAULT NULL COMMENT '借阅标志',`bookId` varchar(10) DEFAULT NULL COMMENT '书籍Id',`userId` varchar(10) DEFAULT NULL COMMENT '用户Id',`borrowsDate` date DEFAULT NULL COMMENT '借阅日期',`returnFlag` varchar(10) DEFAULT NULL COMMENT '归还标志',`returnDate` date DEFAULT NULL COMMENT '归还日期',`borrowsTime` int(11) DEFAULT NULL COMMENT '借阅时长',`realityBorrowsTime` int(11) DEFAULT NULL COMMENT '实际借阅时长',`borrowNumber` varchar(20) DEFAULT NULL COMMENT '借阅单号',PRIMARY KEY (`logId`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='借阅记录表';

到此数据库创建完成
下边是Demo的结构
在这里插入图片描述
book.java

package com.domain;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;/*** @program: LibraryDemo* @description: 图书实体* @author: Casey Hu* @create: 2023-12-06 11:52**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {private Integer BookId;private String BookName;private String Author;private String Publish;private String ISBN;private String Introduction;private String Language;private String Price;private Integer bookStatus;private String bookImage;private Integer bookCount;private Date borrowDate;private Date returnDate;private Integer borrowTime;
}

BorrowsLog.java

package com.domain;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;/*** @program: LibraryDemo* @description:* @author: Casey Hu* @create: 2023-12-07 14:15**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BorrowsLog {private Integer logId;private String borrowsFlag;private String bookId;private String userId;private Date borrowsDate;private String returnFlag;private Date returnDate;private String borrowsTime;private String realityBorrowsTime;private String borrowNumber;}

User.java

package com.domain;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @program: LibraryDemo* @description: 用户* @author: Casey Hu* @create: 2023-12-06 14:17**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Integer UserId;private String UserName;private String Password;private String Email;private String Phone;private String Address;}

LibraryService.java

package com.service;import com.domain.Book;
import com.domain.BorrowsLog;
import com.domain.User;
import com.util.JDBCUtil;import java.sql.ResultSet;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;/*** @program: LibraryDemo* @description:* @author: Casey Hu* @create: 2023-12-06 16:25**/public class LibraryService {//添加图书public synchronized void addBook(Book book) {JDBCUtil jdbcUtil = new JDBCUtil();int i = jdbcUtil.executeUpdate("INSERT INTO book (bookName, author, publish, isbn, introduction, `language`, price, bookStatus, bookImage, bookCount)" +" VALUES('" + book.getBookName() + "', '" + book.getAuthor() + "', '" + book.getPublish() + "', '" + book.getISBN() + "', '" + book.getIntroduction() + "', '" + book.getLanguage() + "', '" + book.getPrice() + "', " + book.getBookStatus() + ", '" + book.getBookImage() + "', " + book.getBookCount() + ");");if (i==1) {System.out.println("插入成功");}else {System.out.println("插入失败");}jdbcUtil.closeConnection();}//删除图书public synchronized void deleteBook(Book book) {JDBCUtil jdbcUtil = new JDBCUtil();jdbcUtil.executeUpdate("update book set bookStatus = 0 where bookName = " + book.getBookName() + ";");jdbcUtil.closeConnection();}//搜索图书public synchronized List<Book> queryBookList(Book book) {List<Book> bookList =new ArrayList<>();JDBCUtil jdbcUtil = new JDBCUtil();ResultSet resultSet=jdbcUtil.executeQuery("select * from book where bookName = " + book.getBookName() + " and bookStatus = 1;");try {while (resultSet.next()) {Book bookRes=new Book();bookRes.setBookName(resultSet.getString("bookName"));bookRes.setAuthor(resultSet.getString("author"));bookRes.setPublish(resultSet.getString("publish"));bookRes.setISBN(resultSet.getString("isbn"));bookRes.setIntroduction(resultSet.getString("introduction"));bookRes.setLanguage(resultSet.getString("language"));bookRes.setPrice(resultSet.getString("price"));bookRes.setBookStatus(resultSet.getInt("bookStatus"));bookRes.setBookImage(resultSet.getString("bookImage"));bookRes.setBookCount(resultSet.getInt("bookCount"));bookRes.setBorrowDate(resultSet.getDate("borrowDate"));bookRes.setReturnDate(resultSet.getDate("returnDate"));bookRes.setBorrowTime(resultSet.getInt("borrowTime"));bookList.add(bookRes);}}catch (Exception e){e.printStackTrace();}jdbcUtil.closeConnection();return bookList;}public synchronized Book queryBook(Book book) {JDBCUtil jdbcUtil = new JDBCUtil();Book bookRes=new Book();ResultSet resultSet=jdbcUtil.executeQuery("select * from book where isbn = '" + book.getISBN() + "' and bookStatus = 1;");try {while (resultSet.next()) {bookRes.setBookName(resultSet.getString("bookName"));bookRes.setAuthor(resultSet.getString("author"));bookRes.setPublish(resultSet.getString("publish"));bookRes.setISBN(resultSet.getString("isbn"));bookRes.setIntroduction(resultSet.getString("introduction"));bookRes.setLanguage(resultSet.getString("language"));bookRes.setPrice(resultSet.getString("price"));bookRes.setBookStatus(resultSet.getInt("bookStatus"));bookRes.setBookImage(resultSet.getString("bookImage"));bookRes.setBookCount(resultSet.getInt("bookCount"));bookRes.setBorrowDate(resultSet.getDate("borrowDate"));bookRes.setReturnDate(resultSet.getDate("returnDate"));bookRes.setBorrowTime(resultSet.getInt("borrowTime"));}}catch (Exception e){e.printStackTrace();}jdbcUtil.closeConnection();return bookRes;}//借阅图书public synchronized void borrowBook(Book book, User user,Integer days) {//根据图书ISBN查询 图书是否可以借阅,且查看库存量是否有,JDBCUtil jdbcUtil = new JDBCUtil();ResultSet resultSet = jdbcUtil.executeQuery("select bookStatus,bookCount,bookName,bookId from book where isbn='"+book.getISBN()+"' ;");Instant instant = Instant.now();long timestamp = instant.toEpochMilli();try {while (resultSet.next()) {Integer bookStatus = resultSet.getInt("bookStatus");if(bookStatus==1){Integer bookCount = resultSet.getInt("bookCount");if(bookCount>0){//借阅 减少库存int i = jdbcUtil.executeUpdate("update book set bookCount = bookCount - 1 where isbn='" + book.getISBN() + "' ;");if(i==1){//新增借阅日志i = jdbcUtil.executeUpdate("INSERT INTO borrowslog (borrowsFlag, bookId, userId, borrowsDate,  borrowsTime, borrowNumber) " +"VALUES('1', '" + resultSet.getInt("bookId") + "', '" + user.getUserId() + "', NOW(), '" + days + "', '" + timestamp + "');");if(i==1){System.out.println("借阅成功!借阅单号:"+timestamp);}else {System.out.println("借阅异常,请联系管理员");}}}else {System.out.println("此书 "+resultSet.getInt("bookName")+"库存不足");}}else {System.out.println("此书 "+resultSet.getInt("bookName")+"已下架");}}}catch (Exception e){System.out.println("查不到此书");e.printStackTrace();}jdbcUtil.closeConnection();}public synchronized void returnBook(String borrowNumber) {JDBCUtil jdbcUtil = new JDBCUtil();//通过借阅单号, 更新借阅标志和时间ResultSet resultSet = jdbcUtil.executeQuery("SELECT logId, borrowsFlag, bookId, userId, borrowsDate, returnFlag, returnDate, \n" +"borrowsTime, realityBorrowsTime, borrowNumber FROM borrowslog where borrowNumber='"+borrowNumber+"';");BorrowsLog borrowsLog = new BorrowsLog();try {while (resultSet.next()) {borrowsLog.setLogId(resultSet.getInt("logId"));borrowsLog.setUserId(resultSet.getString("userId"));borrowsLog.setBookId(resultSet.getString("bookId"));//计算实际时间Date  borrowsDate= resultSet.getDate("borrowsDate");long differenceInMilliseconds = new Date().getTime() - borrowsDate.getTime();// 转换毫秒差值为天数Integer differenceInDays = (int) TimeUnit.MILLISECONDS.toDays(differenceInMilliseconds);//更新jdbcUtil.executeUpdate("UPDATE borrowslog SET  returnFlag='1', returnDate=NOW(), realityBorrowsTime="+differenceInDays+" WHERE logId="+borrowsLog.getLogId()+" and borrowNumber='"+borrowNumber+"';");int i = jdbcUtil.executeUpdate("update book set bookCount = bookCount + 1 where bookId=" + borrowsLog.getBookId() + " ;");if(i==1){System.out.println("此书归还成功");}}}catch (Exception e){e.printStackTrace();}jdbcUtil.closeConnection();}}

UserService.java(没有实现)

package com.service;/*** @program: LibraryDemo* @description:* @author: Casey Hu* @create: 2023-12-06 16:49**/public class UserService {
}

JDBCUtil.java

package com.util;import javax.sql.DataSource;
import java.sql.*;/*** @program: LibraryDemo* @description: JDBC工具类* @author: Casey Hu* @create: 2023-12-06 14:31**/public class JDBCUtil {public static Connection connection;public static String url="jdbc:mysql://localhost:3306/library-demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";public static String user="root";public static String password="123456";public static Connection getConnection(){try {connection = DriverManager.getConnection(url,user,password);} catch (Exception e) {e.printStackTrace();}return connection;}//执行查询public static ResultSet executeQuery(String sql) {System.out.println("执行SQL:"+sql);Connection conn=getConnection();ResultSet resultSet=null;try {Statement stmt=conn.createStatement();resultSet=stmt.executeQuery(sql);}catch (Exception e){e.printStackTrace();}return resultSet;}// 执行更新操作(插入、更新、删除)public static int executeUpdate(String sql) {System.out.println("执行SQL:"+sql);Connection conn = getConnection();int result = 0;try {// 开始事务conn.setAutoCommit(false);Statement statement = conn.createStatement();result = statement.executeUpdate(sql);conn.commit();} catch (SQLException e) {// 回滚事务if (conn != null) {try {conn.rollback();} catch (SQLException ex) {ex.printStackTrace();}}e.printStackTrace();}return result;}// 关闭数据库连接public static void closeConnection() {if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}

StatementTest.java

package com.util;import com.service.LibraryService;import java.sql.*;/*** @program: LibraryDemo* @description:* @author: Casey Hu* @create: 2023-12-06 14:45**/public class StatementTest {public static void main(String[] args) throws ClassNotFoundException, SQLException {
//        //加载驱动
//        Class.forName("com.mysql.cj.jdbc.Driver");
//        //输入url、用户名、密码创建连接
//        //jdbc:mysql:是固定的写法,后面跟主机名localhost,3306是默认的MySQL端口号demo是数据库名称
//        //useUnicode=true是指是否使用Unicode字符集,赋值为true
//        //serverTimezone=UTC是指定时区时间为世界统一时间
//        //characterEncoding=utf-8是指定字符编码格式为UTF8
//        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/library-demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai", "root", "123456");
//        //sql查询语句
//        String sql = "select * from user";
//        Statement statement = connection.createStatement();
//        //执行查询语句
//        ResultSet resultSet = statement.executeQuery(sql);
//        //结果遍历
//        while (resultSet.next()) {
//            Object id = resultSet.getObject("userId");
//            Object name = resultSet.getObject("userName");
//            Object password = resultSet.getObject("password");
//            Object phone = resultSet.getObject("phone");
//            System.out.println(id + "-" + name + "-" + password + "-" + phone);
//        }
//        //关闭资源
//        resultSet.close();
//        statement.close();
//        connection.close();
//        JDBCUtil jdbcUtil = new JDBCUtil();
//        User user=new User();
//        user.setUserName("李四");
//        user.setPassword("123456");
//        user.setEmail("XXXXXXXXXX");
//        user.setPhone("1235586865");
//        jdbcUtil.executeUpdate("INSERT INTO `user` (userName, password, email, phone, address) " +
//                "VALUES('"+user.getUserName()+"', '"+user.getPassword()+"', '"+user.getEmail()+"', '"+user.getPhone()+"', '"+user.getAddress()+"');");
//        ResultSet resultSet = jdbcUtil.executeQuery("select * from user");
//        //结果遍历
//        while (resultSet.next()) {
//            Object id = resultSet.getObject("userId");
//            Object name = resultSet.getObject("userName");
//            Object password = resultSet.getObject("password");
//            Object phone = resultSet.getObject("phone");
//            System.out.println(id + "-" + name + "-" + password + "-" + phone);
//        }
//        jdbcUtil.closeConnection();
//        Book book=new Book();
//        book.setBookName("晚熟的人");
//        book.setAuthor("莫言");
//        book.setPrice("100");
//        book.setBookImage("1111111");
//        book.setIntroduction("《晚熟的人》是中国当代作家莫言创作的中短篇小说集");
//        book.setISBN("978-7020-164-776");
//        book.setBookStatus(1);
//        book.setBookCount(10);LibraryService libraryService=new LibraryService();
//        libraryService.addBook(book);
//        Book book1 = libraryService.queryBook(book);
//        System.out.println(book1.toString());
//        User user=new User();
//        user.setUserId(1);//借阅图书
//        libraryService.borrowBook(book1,user,30);//归还libraryService.returnBook("1701968793273");}
}

结束

写个总结吧,有的功能,比如登录,多线程的那部分没有实现,因为不会啊。我整体做完最后特别大的感受就是,对于持久层的框架是非常有必要的,如果没有mybatis,这样一点一点的封装是非常麻烦的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/208335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS创建JavaScript(类 Web开发模式)项目

上文 HarmonyOS带大家创建自己的第一个Page页面并实现路由跳转(ArkTS)带大家创建了我们项目中第一个自己创建的page 并完成了一个跳转逻辑的编写 上文的开发模式是 ArkTS 的 也被称为 声明式开发范式 还有一种 javaScript的 类Web开发模式 这种方式就类似于我们传统的前端开发模…

基于微群机器人的二次开发

请求URL&#xff1a; http://域名地址/modifyGroupName 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是String登录实例标识chatRoom…

读书笔记-《数据结构与算法》-摘要2[冒泡排序]

冒泡排序 核心&#xff1a;冒泡&#xff0c;持续比较相邻元素&#xff0c;大的挪到后面&#xff0c;因此大的会逐步往后挪&#xff0c;故称之为冒泡。 public class BubbleSort {public static void main(String[] args) {int unsortedArray[] new int[]{6, 5, 3, 1, 8, 7, 2…

Leetcode每日一题学习训练——Python3版(到达首都的最少油耗)

版本说明 当前版本号[20231205]。 版本修改说明20231205初版 目录 文章目录 版本说明目录到达首都的最少油耗理解题目代码思路参考代码 原题可以点击此 2477. 到达首都的最少油耗 前去练习。 到达首都的最少油耗 ​ 给你一棵 n 个节点的树&#xff08;一个无向、连通、无环…

倒计时模块复习

经典回顾倒计时 倒计时的基本布局介绍。 一个内容区域和一个输入区域&#xff0c;内容区域进行划分 直接使用flex布局会更快一点。 js代码 我们利用一下模块化思想&#xff0c;直接把获得时间这个功能写成一个函数。方便后续的调用 function getTime() {const date new Date…

MES管理系统通过哪些方面提升产品质量管理水平

在当今高度竞争的市场环境中&#xff0c;质量成为了企业生存和发展的关键因素。工厂作为生产产品的核心场所&#xff0c;其质量管理水平直接影响到产品的质量和企业的声誉。为了应对这一挑战&#xff0c;许多工厂引入了MES管理系统解决方案。本文将探讨MES管理系统如何帮助工厂…

【UE5】监控摄像头效果(上)

目录 效果 步骤 一、视角切换 二、摄像头画面后期处理 三、在场景中显示摄像头画面 效果 步骤 一、视角切换 1. 新建一个Basic关卡&#xff0c;添加第三人称游戏资源到项目浏览器 2. 新建一个Actor蓝图&#xff0c;这里命名为“BP_SecurityCamera” 打开“BP_Securit…

模电笔记。。。。

模电 2.8 蜂鸣器 按照蜂鸣器驱动方式分为有源蜂鸣器和无源蜂鸣器 有源的有自己的震荡电路&#xff0c;无源的要写代码控制。 里面有个线圈&#xff0c;相当于电感&#xff0c;储能&#xff0c;通直隔交。 蜂鸣器的参数&#xff1a;额定电压&#xff0c;工作电压&#xff0…

【CCF-B】1/2区,录用见刊极快!2个月录用!

计算机类 • 好刊解读 今天小编带来Taylor and Francis旗下计算机领域快刊&#xff0c;CCF-B类推荐的期刊解读&#xff0c;期刊审稿周期短&#xff0c;投稿友好&#xff0c;如您有投稿需求&#xff0c;可作为重点关注&#xff01;后文有相关领域真实发表案例&#xff0c;供您投…

防水,也不怕水。Mate X5是如何做到让你湿手湿屏也不影响操作的?

相信不少人都碰到过当手机屏幕存在小水珠时&#xff0c;触控变得不灵敏&#xff0c;或者出现“幽灵触屏”&#xff0c;指东打西的情况。 尤其是在洗澡、做饭&#xff0c;或者在户外遇到下雨天气时&#xff0c;如果打湿的手机收到重要聊天消息或者电话&#xff0c;却因为湿屏导…

生成fip.bin在Milkv-duo上跑rtthread的相关尝试,及其问题分析

前言 &#xff08;1&#xff09;PLCT实验室实习生长期招聘&#xff1a;招聘信息链接 &#xff08;2&#xff09;本来是想在Milkv-duo上跑rtthread的&#xff0c;做了很多努力&#xff0c;一直没有结果。虽然不知道最终能不能成功做出来&#xff0c;还是把自己的相关努力分享出来…

MDK官网如何下载stm32支持包

网站&#xff1a;https://www.keil.com/demo/eval/arm.htm 1 2 3点这个下载

基于Mint Mate 21.2 Victoria 的Anjuta安装与测试

序言 Linux mint mate 21.2 命名为 victoria 版&#xff0c;在vmware虚拟机中安装按提示默认安装即可&#xff0c;不做更多记录。mint mate的优点是稳定&#xff0c;窗口质感好。安装完成后&#xff0c;需要关注一些常用功能配置。主要有&#xff1a;显示器调整、桌面调整、工…

当然热门的原创改写改写大全【2023最新】

在信息时代&#xff0c;随着科技的不断发展&#xff0c;改写软件逐渐成为提高文案质量和写作效率的重要工具。本文将专心分享一些好用的改写软件&#xff0c;其中包括百度文心一言智能写作以及147SEO改写软件。这些工具不仅支持批量改写&#xff0c;而且在发布到各大平台后能够…

python爬取 HTTP_2 网站超时问题的解决方案

问题背景 在进行网络数据爬取时&#xff0c;使用 Python 程序访问支持 HTTP/2 协议的网站时&#xff0c;有时会遇到超时问题。这可能会导致数据获取不完整&#xff0c;影响爬虫程序的正常运行。 问题描述 在实际操作中&#xff0c;当使用 Python 编写的爬虫程序访问支持 HTT…

使用高防IP防护有哪些优势

高防IP是针对互联网服务器在遭受大流量的DDoS攻击后导致服务不可用的情况下&#xff0c;推出的付费增值服务&#xff0c;用户可以通过配置高防IP&#xff0c;将攻击流量引流到高防IP&#xff0c;确保源站的稳定可靠。高防IP相当于搭建完转发的服务器。 高防IP有两种接入方式&a…

Notepad安装

中文免安装版&#xff0c;下载解压即可。 NotepadV7.5.6 (访问密码: 1666)https://url48.ctfile.com/f/33868548-986668939-7a3316?p1666

Node-RED 设置登录权限

Node-RED 提供了内置的 “adminAuth” 功能&#xff0c;使你能够通过用户名和密码来保护对 Node-RED 编辑器的访问。本文将向你展示如何配置登录权限&#xff0c;以及一些相关的最佳实践。以下是设置登录权限的步骤&#xff1a; 步骤一&#xff1a;配置 AdminAuth 在 Node-RE…

react Hooks实现原理

Fiber 上篇文章fiber简单理解记录了react fiber架构&#xff0c;Hooks是基于fiber链表来实现的。阅读以下内容时建议先了解react fiber。 jsx -> render function -> vdom -> fiber树 -> dom vdom 转 fiber 的过程称为 recocile。diff算法就是在recocile这个过程…

LVS-DR+Keepalived+动静分离实验

架构图 解释一下架构&#xff0c;大概就是用Keepalived实现两台DR服务器的LVS负载均衡&#xff0c;然后后端服务器是两台Nginx服务器两台Tomcat服务器并且实现动静分离这个实验其实就是把 LVS-DRKeepalived 和 动静分离 给拼起来&#xff0c;真的是拼起来&#xff0c;两个部分…