【MySQL】Spring Boot项目基于Sharding-JDBC和MySQL主从复制实现读写分离(8千字详细教程)

news2025/1/11 4:21:14

目录

  • 前言
  • 一、 介绍
  • 二、 主从复制
    • 1. 原理
    • 2. 克隆从机
    • 3. 克隆从机大坑
    • 4. 远程登陆
    • 5. 主机配置
    • 6. 从机配置
    • 7. 主机:建立账户并授权
    • 8. 从机:配置需要复制的主机
    • 9. 测试
    • 10. 停止主从同步
  • 三、 读写分离
    • 1. Sharding-JDBC介绍
    • 2. 一主一从
    • 3. 一主一从读写分离
      • 3.1 实现步骤
      • 3.2 配置读写分离规则
      • 3.3 允许bean定义覆盖配置项
      • 3.4 启动项目测试


前言

  • 本篇文章将手把手教你如何在 Linux 虚拟机上搭建 MySQL 一主一从的数据库架构,教你如何实现 MySQL 主从复制,再到手把手教你如何在 Spring Boot 项目上使用 Sharding-JDBC 框架实现读写分离。
  • 笔者开发环境介绍:
    • Linux 系统:Centos 7
    • 虚拟机:VMware 16
    • MySQL :8.0.31
  • 如果还没安装 VMware 虚拟机软件和 CentOS 7 的小伙伴可以移步到我的这篇博文进行学习——《Linux系统CentOS7虚拟机VMware安装保姆级教程》。
  • 如果不知道在 CentOS 7 如何安装 MySQL 的小伙伴可以移步到我的这篇博文进行学习——《Linux下如何安装MySQL以及远程登录保姆级教程》。

一、 介绍


  • 面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说,将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行级锁,使得整个系统的查询性能得到极大的改善。这就称为读写分离

    image-20221120140234763


二、 主从复制


1. 原理

  • MySQL 主从复制是一个异步的复制过程,底层是基于 MySQL 数据库自带的二进制日志 (Binlog) 功能。就是一台或多台 MySQL 数据库 (slave,即从库) 从另一台 MySQL 数据库 (master,即主库) 进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL 主从复制是 MySQL 数据库自带功能,无需借助第三方工具。
  • MySQL 复制过程分成三步:
    • master 将改变记录到二进制日志 (binary log) ;
    • slave 将 master 的 binary log 拷贝到它的中继日志 (relay log) ;
    • slave 重做中继日志中的事件,将改变应用到自己的数据库中。

image-20221120161557549

2. 克隆从机

  • 首先要准备两台 Linux 虚拟机,笔者已经安装过一台虚拟机作为主机,IP 地址为 192.168.148.100 (server100) ,现在我们通过 VMware 软件的 “克隆” 功能来克隆出第二台 Linux 虚拟机作为从机,IP 地址设置为 192.168.148.101

  • 首先关闭 server100 :

    image-20221119114955788

  • 然后左侧右击 server100 –> 管理 –> 克隆:

    image-20221119115125249

  • 点击 “下一页” :

    image-20221119115209026

  • 保持默认,下一页:

    image-20221119115252217

  • 选择 “创建完整克隆” ,点击下一页:

    image-20221119115342963

  • 改名、改存放路径:

    image-20221119115536045

  • 开始克隆:

    image-20221119115606593

  • 克隆完成:

    image-20221119115817830

  • 克隆完成后,要修改四个位置。第一个是网络,双击 server101 的网络适配器:

    image-20221119115944820

  • 点击 “高级” :

    image-20221119120021167

  • 点击 “生成” 来修改 MAC 地址,确保两台虚拟机的 MAC 地址不同:

    image-20221119120129003

  • 然后,开机 server101 ,登录 root 用户:

    image-20221119120700987

    image-20221119120729708

  • 修改主机名称。命令如下:

    vim /etc/hostname
    

    image-20221119121120110

    记得 :wq 保存退出。

  • 重命名后需要重启:

    reboot
    

    image-20221119121217785

  • 重启完再以 root 用户登录,下一步是更改 IP 地址:

    vim /etc/sysconfig/network-scripts/ifcfg-ens33
    
  • 改两个地方,一个是 UUID ,确保和 server100 不同即可;另一个是 IPADDR ,我修改为 192.168.148.101

    image-20221119121830756

    修改好后按 :wq 保存退出。

  • 然后重启网络:

    systemctl restart network
    
  • 这样,一台虚拟机就克隆完成了。重要的是,里面曾经安装的 JDK、MySQL、Redis 等软件和数据都是跟 server100 保持一致的。这就省去了我们重复安装和配置的麻烦了。

    image-20221119122316773


3. 克隆从机大坑

  • 克隆的方式生成的虚拟机 (包含 MySQL Server),则克隆的虚拟机 MySQL Server 的 UUID 相同 (此 UUID 是 MySQL 服务的 UUID,和前面修改的 Linux 网络配置的 UUID 不是同一个东西) ,必须修改,否则在有些场景会报错。比如: show slave status\G ,报如下的错误:

    Last_IO_Error: Fatal error: The slave I/0 thread stops because master and slave have equal MySQL server UUIDs; these UUIDS must be different for replication to work.
    
  • 解决方法:

    修改 MySQL Server 的 UUID 方式:

    vim /var/lib/mysql/auto.cnf
    

    image-20221119123111063

    自己随便改,与 server 100 不同即可。

  • 然后,重启 MySQL 服务即可:

    systemctl restart mysqld
    

4. 远程登陆

  • 笔者采用 MobaXTerm 远程登陆:

    image-20221120162244004

  • 新建连接:

    image-20221119123720821

  • 成功远程连接:

    image-20221119123840840

  • 此时,server100 也可以开机了:

    image-20221119123942460

  • server100 作为主机、server101 作为从机,一主一从实现读写分离。

  • SQLyog 远程登录 - 教程详见我的这篇博文的第 4 章《4. SQLyog远程连接》。


5. 主机配置

  • 建议 MySQL 版本一致且后台以服务运行,主从所有配置项都配置在[mysqld] 节点下,且都是小写字母。具体参数配置如下:

  • 必选:

    # [必须]主服务器唯一ID
    server-id=100
    
    # [必须]启用二进制日志,指名路径。比如:自己本地的路径/log/mysqlbin
    log-bin=ouc-bin
    
  • 可选:

    # [可选] 0(默认)表示可读可写(主机),1表示只读(从机)
    read-only=0
    
    # 设置日志文件保留的时长,单位是秒
    binlog_expire_logs_seconds=6000
    
    # 控制单个二进制日志大小。此参数的最大和默认值是1GB
    max_binlog_size=200M
    
    # [可选]设置不要复制的数据库
    binlog-ignore-db=test
    
    # [可选]设置需要复制的数据库,默认全部记录。比如: binlog-do-db=atguigu_master_slave
    binlog-do-db=需要复制的主数据库名字
    
    # [可选]设置binlog格式
    binlog_format=STATEMENT
    
  • 重启后台 MySQL 服务,使配置生效。

【注意】

  • 先搭建完主从复制,再创建数据库。MySQL 主从复制起始时,从机不继承主机数据。
  • 进入主机 server100 ,输入以下命令进入 biglog 配置文件:

    vim /etc/my.cnf
    
  • 在第 3 行左右,修改成如下的样子:

    image-20221119161201401

    :wq 保存并退出。

  • 然后重启 MySQL 服务:

    systemctl restart mysqld
    

6. 从机配置

  • 从机 server101 也如法炮制。

  • 要求主从所有配置项都配置在 /etc/my.cnf[mysqld] 栏位下,且都是小写字母。

  • 必选:

    [mysqld]
    # [必须]从服务器唯一ID,要与主服务器不同
    server-id=101	
    
  • 可选:

    # [可选]启用中继日志
    relay-log=mysql-relay
    

    image-20221119162442917

  • 重启后台 mysql 服务,使配置生效。

    systemctl restart mysqld
    

【注意】

  • 主、从机都要开放 MySQL 端口号 3306 的防火墙。

7. 主机:建立账户并授权

  • 如果你使用的是 MySQL 5.7 ,只需执行下面一条指令即可:

    -- MySQL 5.7专用
    GRANT REPLICATION SLAVE ON *.* TO 'slave101'@'从机器数据库IP' IDENTIFIED BY 'xsh981104';
    

    其中,‘slave101’ 是你自己起的从机名称。

  • 注意,笔者使用的是 MySQL 8.0 ,在主机端进入 MySQL root 用户,输入以下命令创建名为 slave101 的账户,用于主机和从机之间的通信:

    mysql> CREATE USER 'slave101'@'%' IDENTIFIED BY 'xsh981104';
    
  • 我创建的时候报了一个错误:

    ERROR 1396 (HY000): Operation CREATE USER failed for 'slave101'@'%'
    
  • 原因是这个用户之前创建过,但删除了,没有刷新权限。解决方法是先删除这个用户,然后再刷新权限,再次创建即可。

    -- 删除用户
    DROP USER 'slave101';
    
    -- 刷新权限
    FLUSH PRIVILEGES;
    
    -- 再次创建用户
    CREATE USER 'slave101'@'%' IDENTIFIED BY 'xsh981104';
    
  • 成功创建用户 slave101

    image-20221120103145409

  • 然后,赋予用户 slave101 权限:

    GRANT REPLICATION SLAVE ON *.* TO 'slave101'@'%';
    

    其中,REPLICATION 指的是主从复制的权限、*.* 表示任何数据库下的任何表、'slave101'@'%' 表示授予权限的用户。

    image-20221120104456844

  • 授权后,可以用下面的命令来查看用户 slave101 拥有的所有权限:

    SHOW GRANTS FOR 'slave101'@'%';
    

    image-20221120104701982

  • 然后,如果你是 MySQL 8.0 ,下面的语句必须执行。否则出问题:

    ALTER USER 'slave101'@'%' IDENTIFIED WITH mysql_native_password BY 'xsh981104';
    

    image-20221120104828117

【注意】

  • 上面这句不执行,从机执行 show slave status\G 时会报下面的错误:

Last_IO_Error: error connecting to master ‘slave1@192.168.1.150:3306’ - retry-time: 60 retries: 1 message: Authentication plugin ‘caching_sha2_password’ reported error: Authentication requires secure connection.

  • 刷新权限:

    FLUSH PRIVILEGES;
    

    image-20221120105021877

  • 接下来是比较重要的步骤:查询 Master 的状态,并记录下 FilePosition 的值:

    SHOW MASTER STATUS;
    

    image-20221120105213576

    记录下 FilePosition 的值。注意执行完此步骤后不要再操作主服务器,防止主服务器状态值变化。

  • 到这里,主库的配置就完成了。


8. 从机:配置需要复制的主机

  • 步骤1-从机上,进入 MySQL ,开始复制主机:

    CHANGE MASTER TO
    MASTER_HOST='主机的IP地址',
    MASTER_USER='主机用户名',
    MASTER_PASSWORD='主机用户名的密码',
    MASTER_LOG_FILE='ouc-bin.00000X',
    MASTER_LOG_POS=主机的Position值;
    
  • 举例:

    CHANGE MASTER TO MASTER_HOST='192.168.148.100',MASTER_USER='slave101',MASTER_PASSWORD='xsh981104',MASTER_LOG_FILE='ouc-bin.000002',MASTER_LOG_POS=1805;
    

    image-20221120110749373

  • 步骤2-启动 slave 同步:

    START SLAVE;
    

    image-20221120110956866


  • 疑难杂症 1 - 有的小伙伴在步骤一时遇到类似下面的报错:

    ERROR 3021 (HY000): This operation cannot be performed with a runing slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first.
    

    这是因为从库之前已经配置过主从复制,必须先停掉原来的:

    STOP SLAVE;
    

    再重新执行步骤 1 和 2 即可。


  • 疑难杂症 2 - 有的小伙伴还遇到下面的报错:

    ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
    

    这是因为之前你开启过中继日志,又关掉了。解决方法是重置一下即可:

    RESET SLAVE;
    
  • 接着,查看从库的同步状态:

    SHOW SLAVE STATUS\G;
    

    image-20221120112235645

  • 这样,主从复制就搭建完毕了。


9. 测试

  • 用 SQLyog 远程连接至主库和从库。

  • 在主库 192.168.148.100 中创建一个新的数据库 test1

    CREATE DATABASE IF NOT EXISTS test1 CHARACTER SET 'utf8';
    
  • 使用该数据库,在该数据库下创建数据表 students

    CREATE TABLE IF NOT EXISTS students(
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    last_name VARCHAR(15) NOT NULL
    );
    
  • 在该表下插入数据:

    INSERT INTO students(last_name)
    VALUES('Tom'), ('Amy');
    
  • 查看主库:

    SELECT * FROM students;
    

    image-20221120122815620

  • 打开从库 192.168.148.101 ,再没有任何操作的情况下,发现已经把主库的数据库 test1 以及数据表 students 复制过来了:

    image-20221120123214071

  • 且数据表 students 中的数据也是完全相同的:

    SELECT * FROM students;
    

    image-20221120122815620

  • 说明主从复制搭建成功。


10. 停止主从同步

  • 如果你想停止主从同步,只需在从库输入下面指令即可:

    STOP SLAVE;
    

三、 读写分离


1. Sharding-JDBC介绍

  • Sharding-JDBC 定位为轻量级 Java 框架,在Java的 JDBC 层提供的额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。使用 Sharding-JDBC 可以在程序中轻松的实现数据库读写分离。

    • 适用于任何基于 JDBC 的 ORM 框架,如: JPA、Hibernate、 Mybatis、Spring JDBC Template 或直接使用 JDBC。
    • 支持任何第三方的数据库连接池,如: DBCP、 C3PO、 BoneCP、Druid、 HikariCP 等。
    • 支持任意实现 JDBC 规范的数据库。目前支持 MySQL、 Oracle、 SQLServer、 PostgreSQL 以及任何遵循 SQL92 标准的数据库。
  • 与 Spring Boot 结合使用时,只需要添加 Maven 依赖坐标即可:

    <!-- Sharding-JDBC -->
    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <version>4.0.1</version>
    </dependency>
    

2. 一主一从

  • 在实现读写分离之前,要把 MySQL 的主从复制的结构搭建好。

  • 笔者的主库 IP 地址为 192.168.148.100 ,从库 IP 地址为 192.168.148.101 。版本都是 MySQL 8.0.31 。

  • 如果你的 MySQL 数据库安装在 Windows 电脑上,把 Windows 电脑上的数据库备份成 .sql 文件,恢复到主库上即可。不知道的小伙伴可以转到我的这篇博文中学习——《如何把Windows上的MySQL数据库迁移到Linux服务器上》。

    image-20221120151701980

    image-20221120151737600


3. 一主一从读写分离


3.1 实现步骤

  • 使用 Sharding-JDBC 实现读写分离只需要三步:
  1. 导入 Sharding-JDBC 的 Maven 坐标;
  2. 在配置文件 application.yml 中配置读写分离规则;
  3. 在配置文件 application.yml 中配置允许 bean 定义覆盖配置项。

3.2 配置读写分离规则

  • 打开 Spring Boot 的配置文件 application.yml 。在 spring: 节点下添加下面的配置:

    spring:
      # 配置Sharding-JDBC读写分离规则
      shardingsphere:
        # 指定数据源
        datasource:
          names:
            master,slave  # 一主一从
          # 配置主库数据源
          master: # 必须跟上面names对应
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://192.168.148.100:3306/reggie?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
            username: root
            password: xsh981104
          # 配置从库数据源
          slave: # 必须跟上面names对应
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://192.168.148.101:3306/reggie?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
            username: root
            password: xsh981104
        # 读写分离配置
        masterslave:
          load-balance-algorithm-type: round_robin  # 多个从库的负载均衡策略:轮询
          name: dataSource  # 最终的数据源名称
          master-data-source-name: master # 主库数据源名称
          slave-data-source-names: slave  # 从库数据源名称列表,多个逗号分隔
        props:
          sql:
            show: true  # 开启SQL显示,默认false
    
  • 大家根据自己的主、从库的 IP 地址和密码作相应的修改即可。

  • 如果有爆红的情况,那就把 pom.xml 中的 Duird 的 Maven 坐标改成下面即可:

    <!-- Druid数据库连接池 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.8</version>
    </dependency>
    
  • 然后,清除 IDEA 缓存并重启 IDEA 即可正常启动 Spring Boot 项目:

    image-20221120152832170

    image-20221120152846988


3.3 允许bean定义覆盖配置项

  • 为什么要配置这一项呢?是因为 Sharding-JDBC 和 Druid 都会创建一个 DataSource 的 bean ,这样两个重名的 bean 就会发生冲突。因此必须在 Spring Boot 配置文件 application.yml 中配置允许 bean 定义覆盖为 true ,这样,后定义的 bean 就会覆盖前面定义的 bean ,从而解决了 bean 冲突的问题。

    spring:
      main:
        # 允许bean定义覆盖
        allow-bean-definition-overriding: true
    
  • 这样,基于 MySQL 主从复制实现读写分离就成功实现了。

3.4 启动项目测试

  • 启动 Spring Boot 项目,可以看到启动日志里生成了两个数据源:

    image-20221120152959300

  • 打开浏览器来测试一下,在浏览器地址栏输入你项目的地址,笔者这里是黑马的《瑞吉外卖》的后台管理系统。

    image-20221120153440496

  • 从日志中可以看到,读取员工表是从 slave 从库中读取的:

    image-20221120153556048

  • 我们来测试一下写操作,编辑一下员工信息:

    image-20221120153711646

  • 可以看到,写操作是主库 master 操作的:

    image-20221120153939384

  • 至此,基于 MySQL 主从复制实现读写分离就成功开发完毕了!

  • 如果你还有任何疑问,欢迎随时在下方评论或者私信我,我会尽快给大家解答。

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

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

相关文章

安服-windowslinux日志分析

目录 windows日志分析 windows事件日志 日志分析工具 Linux日志分析 windows日志分析 windows事件日志 日志分析工具 Linux日志分析 rsyrslog.conf中记录了&#xff0c;这些日志文件存储的位置以及存储的内容是关于什么的日志 其中lastlog比较重要&#xff0c;记录了用户登录…

FRP之入门篇

目录 一、前言 1、概述 2、原理 3、支持功能 4、适用场景 二、环境准备 三、使用 1、安装包下载 2、服务端部署 2.1、上传安装包 2.3、启动服务端 3、客户端部署 3.1、代理服务准备 3.2、上传安装包 3.3、客户端配置 3.4、启动客户端 4、功能验证 一、前言 1、…

Redis在Windows和Linux下的安装方法(超级详细)

Redis的两种不同系统安装1. redis在Windows下的安装2. redis在Linux下的安装1. redis在Windows下的安装 下载安装包(https://github.com/MicrosoftArchive/redis/releases) 下载完后得到安装包找一个自己熟悉的路径就可以进行解压了,我放的是D盘 解压后的文件: 进入到文件夹中…

Java集合(二):Map集合与Collections工具类

目录 Map接口 Map接口的常用方法 删除方法 判断方法 查找方法 增加方法 Map常用方法&遍历操作 HashTable 字典-Dictionary,v> HashMap、HashTable和LinkedHashMap TreeMap 【2】TreeMap-存储自定义数据类型-【内部比较器】 HashMap底层源码 jdk8-源码…

央视春晚临近,主持人李思思被爆离职,知情人火速做出回应

每年的这个时候&#xff0c;中央电视台的春晚&#xff0c;都成为人们热议的话题&#xff0c;不过今年的话题却比较火爆。大众们所关注的央视春晚&#xff0c;第一是参加春晚的明星嘉宾&#xff0c;其次就是参加春晚的节目主持人。 说起央视春晚的主持人&#xff0c;最早要追溯到…

【笔试题】【day26】

文章目录第一题&#xff08;就绪队列中的进程数&#xff09;第二题&#xff08;磁盘缓冲区存在的意义&#xff09;第三题&#xff08;进程从执行态变成就绪态的原因&#xff09;第四题&#xff08;管道&#xff09;第五题&#xff08;文件打开&#xff0c;操作系统会做什么&…

python 图像处理(一阶梯度图像和角度图像)

在整个图像处理的学习过程中可以看到&#xff0c;在很多应用中图像强度的变化情况是非常重要的信息。强度的变化可以用灰度图像I&#xff08;对于彩色图像&#xff0c;通常对每个颜色通道分别计算导数&#xff09;的x和y的方向导数和进行描述。 图像的梯度向量为&#xff1a; …

[datawhale202211]跨模态神经搜索实践:前端简介 Streamlit

结论速递 VCED项目使用一个十分简单好用的 Web 应用程序框架Streamlit。 本次任务简单学习Streamlit的基本使用。并逐行阅读学习VCED项目的前端代码&#xff0c;学习数据的传递&#xff0c;中间存储方式&#xff0c;以及功能的实现。 前情回顾 环境配置Jina生态跨模态模型 …

[python]basemap后安装后hello world代码

import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.basemap import Basemap m Basemap() # 实例化一个map m.drawcoastlines() # 画海岸线 m.drawmapboundary(fill_colorwhite) m.fillcontinents(colorwhite,lake_colorwhite) # 画大洲&#x…

点云配准(四) Sparse Point Registration 算法浅析

Sparse Point Registration (SPR)是一篇2017年的点云配准算法,该算法的主要目的是对稀疏点云进行配准,并且取得了不错的成果和突破。本文一方面是对SPR配准算法模型进行了简单的原理解析以及附加代码实现,另一方面是对之前工作的总结,也算水篇博文,接下来的工作主要就是…

正统类加载器Tomcat(tomcat二探)

主流的Java Web服务器&#xff0c;如Tomcat、Jetty、WebLogic、WebSphere或其他笔者没有列举的服务器&#xff0c; 都实现了自己定义的类加载器&#xff0c;而且一般还都不止一个。因为一个功能健全的Web服务器&#xff0c;都要解决 如下的这些问题&#xff1a; 部署在同一个服…

C++设计模式之桥模式

桥模式也是设计模式中单一组件模式的一种。什么是单一组件模式呢&#xff1f; 单一组件模式&#xff1a; 在软件组件设计中&#xff0c;如果责任划分的不清晰&#xff0c;使用继承得到的结果往往是随着需求的变化而变化&#xff0c;子类急剧膨胀&#xff0c;同时充斥着重复代…

SpringBoot-Dubbo中的Customer怎么获取了注册中心的服务呢?

1.Dubbo中的Customer怎么获取了注册中心的服务呢&#xff1f; &#xff08;1&#xff09;要在pom文件中导入接口依赖 &#xff08;2&#xff09;在配置文件中指定服务中心的ip地址 &#xff08;3&#xff09;使用的dubbo自己的注解向服务中心中获取服务&#xff0c;并且将获取…

史上最简单:SpringCloud 集成 mybatis-plus(以若依微服务版本为例)

编者按&#xff1a;若依微服务版是基于Spring Boot、Spring Cloud & Alibaba的微服务的权限管理系统&#xff0c;也是笔者比较推荐的个人学习和企业实践都比较优秀的开源项目。 笔者也以此项目为例&#xff0c;介绍一下我自己是如何操作 SpringCloud 集成 mybatis-plus 的。…

API网关之Nginx作为网关的优势及实战

基于Nginx的网关的优势&#xff1a; 1 .速度更快、并发更高 单次请求或者高并发请求的环境下&#xff0c;Nginx都会比其他Web服务器响应的速度更快。一方面在正常情况下&#xff0c;单次请求会得到更快的响应&#xff0c;另一方面&#xff0c;在高峰期(如有数以万计的并发请求…

【Pytorch with fastai】第 20 章 :结语与问题

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

开启linux的网络服务, FTP、SSH和NFS服务

在使用linux中开发的时候&#xff0c;我们可以选择启用一些网络服务方便我们进行开发&#xff0c;加快开发的进度。 现在很多用linux进行开发的工程师&#xff0c;他们大多都是在windows系统上安装虚拟机&#xff0c;然后在虚拟机中安装linux系统&#xff0c;然后在里面完成项目…

Java项目——表白墙(前后端连接+数据库存储)

前端的表白墙实现代码在之前的博客中有 Message类 表白墙中的每一个表白信息都由Message对象呈现&#xff0c;其包含form——表白者&#xff0c;to——被表白者&#xff0c;message——表白信息&#xff0c;以及一系列get和set方法 public class Message {private String fr…

我是如何构建自己的笔记系统的?

我是如何构建自己的笔记系统的? 关于笔记系统的重要性互联网上有许多的资料, 我这里将不再赘述. 下面我将直接介绍我的笔记从记录到整理文章发布的所有详细步骤和工具 我的笔记系统可能并不完善, 而且带着极强的个人倾向性, 只希望它能提供给你一种思考的方向 原文地址: https…

ArrayList 可以完全替代数组吗?

本文已收录到 GitHub AndroidFamily&#xff0c;有 Android 进阶知识体系&#xff0c;欢迎 Star。技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 加入 Android 交流群。 前言 大家好&#xff0c;我是小彭。 在前面的文章里&#xff0c;我们学习了很多数据结构与算法思想…