[Sharding-JDBC Series 1] Spring Boot integra Sharding-JDBC para lograr la separación de lectura y escritura

Tabla de contenido

Introducción a Sharding-JDBC

Construir una base de datos maestro-esclavo mysql

Construcción de la aplicación Springboot

dependencia de pom

configuración de application.properties

prueba

Habilitar registro (no requerido)


Introducción a Sharding-JDBC

ShardingSphere-JDBC se posiciona como una solución de middleware de base de datos distribuida liviana que proporciona servicios adicionales en la capa JDBC de Java. Utiliza el cliente para conectarse directamente a la base de datos y proporciona servicios en forma de paquetes jar sin implementaciones ni dependencias adicionales. Puede entenderse como un controlador JDBC mejorado, totalmente compatible con JDBC y varios marcos ORM.

  • Aplicable a cualquier marco ORM basado en JDBC, como: JPA, Hibernate, Mybatis, Spring JDBC Template o directamente usando JDBC.
  • Admite cualquier grupo de conexiones de bases de datos de terceros, como: DBCP, C3P0, BoneCP, Druid, HikariCP, etc.
  • Es compatible con cualquier base de datos que implemente la especificación JDBC y actualmente admite MySQL, Oracle, SQLServer, PostgreSQL y cualquier base de datos que siga el estándar SQL92.

caracteristicas:

  • Subbiblioteca y submesa
  • Separación de lectura y escritura
  • Personalización de la estrategia de fragmentación
  • Clave primaria distribuida descentralizada
  • Gobernanza distribuida
  • Transacción flexible
  • Interfaz de transacción estandarizada

Construir una base de datos maestro-esclavo mysql

Puede consultar el artículo anterior, "[Mycat Series One] Tutorial detallado de construcción de la replicación maestro-esclavo de MySQL basada en Docker" para construir un mysql maestro y dos esclavos , por supuesto, también puede usar varios linux para construir sin usar Docker, los detalles son los siguientes:

Tipo de base de datos base de datos IP en contenedor docker IP de host (IP externa)
Principal: mysql-master prueba 172.17.0.2:3306 192.168.239.128:3307
De: mysql-slave1 prueba 172.17.0.3:3306 192.168.239.128:3308
De: mysql-slave2 prueba 172.17.0.4:3306 192.168.239.128:3309

Después de configurar el maestro y el esclavo, cree una nueva prueba de base de datos en la biblioteca maestra. Puede usar herramientas de cliente de terceros, como Navicat, o secuencias de comandos de línea de comandos. Las secuencias de comandos SQL son las siguientes:

USE `test`;

DROP TABLE IF EXISTS `t_user`;

CREATE TABLE `t_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT '' COMMENT '名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1307873057269878786 DEFAULT CHARSET=utf8 COMMENT='用户表';

Los efectos de Navicat son los siguientes:

Construcción de la aplicación Springboot

Este artículo integrará SpringBoot + Mybatis-plus + Druid + Sharding-JDBC + MySQL , de la siguiente manera:

dependencia de pom

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>

        <!-- 数据库连接池 -->
       <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.22</version>
        </dependency>

        <dependency>
            <groupId>io.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>3.1.0.M1</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.2</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.1.2</version>
        </dependency>

configuración de application.properties

# 服务端口
server.port=8080

# mysql-plus 配置
mybatis-plus.mapper-locations=classpath:/mapper/*.xml
mybatis-plus.type-aliases-package=com.stwen.shardingjdbc.entity

spring.main.allow-bean-definition-overriding=true

# sharding-jdbc 配置主从
sharding.jdbc.dataSource.names=master,slave1,slave2

# sharding-jdbc 主数据库
sharding.jdbc.dataSource.master.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.dataSource.master.driverClassName=com.mysql.jdbc.Driver
sharding.jdbc.dataSource.master.url=jdbc:mysql://192.168.239.128:3307/test?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
sharding.jdbc.dataSource.master.username=root
sharding.jdbc.dataSource.master.password=123456
sharding.jdbc.dataSource.master.maxPoolSize=20

# sharding-jdbc 从数据库一
sharding.jdbc.dataSource.slave1.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.dataSource.slave1.driverClassName=com.mysql.jdbc.Driver
sharding.jdbc.dataSource.slave1.url=jdbc:mysql://192.168.239.128:3308/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
sharding.jdbc.dataSource.slave1.username=root
sharding.jdbc.dataSource.slave1.password=123456
sharding.jdbc.dataSource.slave1.maxPoolSize=20

# sharding-jdbc 从数据库二
sharding.jdbc.dataSource.slave2.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.dataSource.slave2.driverClassName=com.mysql.jdbc.Driver
sharding.jdbc.dataSource.slave2.url=jdbc:mysql://192.168.239.128:3309/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
sharding.jdbc.dataSource.slave2.username=root
sharding.jdbc.dataSource.slave2.password=123456
sharding.jdbc.dataSource.slave2.maxPoolSize=20

# 配置从库选择策略,提供轮询与随机,这里选择用轮询,random-随机
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
# 配置主从读写分离
sharding.jdbc.config.masterslave.name=master-slave 
sharding.jdbc.config.masterslave.master-data-source-name=master
sharding.jdbc.config.masterslave.slave-data-source-names=slave1,slave2
# 开启SQL显示,默认值: false,注意:仅配置读写分离时不会打印日志
sharding.jdbc.props.sql.show=true

Descripción del parámetro de configuración:

  • mybatis-plus.mapper-locations : la ruta del archivo de mapeo XXXmapper.xml
  • mybatis-plus.type-aliases-package : nombre del paquete de la clase de entidad
  • sharding.jdbc.dataSource.names : la configuración es el nombre de la base de datos, que es el nombre de las múltiples fuentes de datos creadas anteriormente
  • sharding.jdbc.dataSource : configurar varias fuentes de datos

Los otros parámetros detallados no se explicarán uno por uno, solo mírelos y comprenda.

Entre ellos, se agrega spring.main.allow-bean-definition-overriding = true para evitar que se informen los siguientes errores:

En la clase de inicio Springboot, agregue la configuración, escanee el paquete de interfaz dao de mybatis, de la siguiente manera

WeChat screenshot_20190626145550.png

prueba

Escriba la clase de prueba, agregue dos interfaces: agregue una nueva, lista de consultas

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    @PutMapping("/save")
    public Object save() {
        User user = new User();
        user.setName("新增");
        return userService.save(user);
    }
    
    @GetMapping("/list")
    public Object list() {
        // 强制路由主库
        //HintManager.getInstance().setMasterRouteOnly();
        return userService.list();
    }
    
}

Inicie la aplicación, acceda a la interfaz: localhost: 8080 / user / save, puede ver los datos y encontrar que se ha agregado un nuevo dato

Visite la interfaz de consulta de lista nuevamente: localhost: 8080 / user / list

Habilitar registro (no requerido)

(No es necesario) Active el registro de la instrucción sql. No se recomienda activarlo en el entorno de producción. Esto es solo para verificar si se logra el efecto de separación de lectura y escritura.

Vea el directorio de registro y abra el registro de declaraciones SQL:

mysql>  show variables like '%general_log%';
mysql>  set global general_log=on;

Nota:

  • Conéctese a las tres bases de datos configuradas anteriormente, ejecute el comando anterior y active el registro de SQL (no es necesario reiniciar para que surta efecto).
  • Cuando se reinicia Mysql, la configuración de registro anterior no será válida.

Después de configurar las tres bases de datos, visite las dos interfaces de prueba nuevamente y luego verifique el registro SQL:

De la siguiente manera, en el contenedor mysql-master, verifique el registro de sql, puede ver que el sql insertado se ejecuta en la base de datos principal

De la siguiente manera, verifique el registro sql de mysql-slave2, y los datos de la lista de lectura se ejecutan desde la base de datos, lo que indica que la separación de lectura y escritura que configuramos es exitosa.

Retardo de sincronización maestro-esclavo

  A menudo aparece en la arquitectura de separación lectura-escritura, es decir , ¿cómo resolver el problema del retraso de lectura ?

  Simplemente inserte un dato y luego léalo de inmediato, ¿es posible que no se lea en este momento? En el análisis final, los datos se copian al nodo esclavo después de que se escribe el nodo maestro. La razón por la cual los datos no se pueden leer es que el tiempo de copia es relativamente largo, es decir, los datos no se han copiado al nodo esclavo, hay que leer desde el nodo. No puedo leerlo. La replicación maestro-esclavo de mysql5.7 es multiproceso , lo que significa que la velocidad será más rápida, pero es posible que no se garantice que se lea al 100% de inmediato . Podemos resolver este problema de dos maneras:

  (1) Compromiso a nivel empresarial, si se leerá inmediatamente después de que se complete la operación

  (2) Para aquellos que se leerán inmediatamente después de la operación y no pueden verse comprometidos en el negocio, podemos ir directamente a la biblioteca principal para este tipo de lectura . Por supuesto, Sharding-JDBC también considera la existencia de este problema, por lo que nos brindamos un La función permite al usuario especificar si usar la biblioteca principal para leer. Utilice el siguiente método para configurar antes de leer:

    @GetMapping("/list")
    public Object list() {
        // 强制路由主库
        HintManager.getInstance().setMasterRouteOnly();
        return userService.list();
    }

Verifique el registro sql de la configuración de la biblioteca principal, verá la siguiente impresión, que indica a la biblioteca principal que la operación de lectura está obligada a continuar:

SELECT  id,name  FROM t_user

● La optimización de rendimiento de Tomcat8 más sólida de la historia

¿Por qué Alibaba puede resistir 10 mil millones en 90 segundos? - La evolución de la arquitectura distribuida de alta concurrencia del lado del servidor

Plataforma de comercio electrónico B2B: función de pago electrónico ChinaPay UnionPay

Aprenda el candado distribuido de Zookeeper, deje que los entrevistadores lo miren con admiración

Solución de bloqueo distribuido de Redisson con microservicio de pico de comercio electrónico de SpringCloud

Vea más artículos buenos, ingrese a la cuenta oficial, por favor, excelente en el pasado

Una cuenta pública profunda y conmovedora 0.0

Supongo que te gusta

Origin blog.csdn.net/a1036645146/article/details/108705394
Recomendado
Clasificación