Tabla de contenido
1. Habilite los registros binlog
1. Primero verifique si binlog está habilitado
2. Habilite binlog y reinicie el servicio mysql.
3. Descargar y configurar el canal
2. Modifique el archivo de configuración instancia.properties en la carpeta conf\example
3. Inicie el servicio del canal (bat en Windows, sh en Linux)
4. Basado en el principio de notificación del Canal
3. Modificar la clase de entidad Artículo
4. Escriba un oyente (sincronización de caché de Redis/jvm)
1. Datos de la tabla de la base de datos y datos de Redis.
1. Habilite los registros binlog
1. Primero verifique si binlog está habilitado
mostrar variables como '%log_bin%';
Si está APAGADO, el bit de instrucción se activa
2. Habilite binlog y reinicie el servicio mysql.
Haga clic derecho en Mi PC - Administrar - Servicios - MYSQL - Propiedades
Aquí está mi dirección.ini
Agregar en [mysqld]
log-bin = mysqlbinlog
formato-binlog=FILA
Después de la configuración, debe reiniciar el servicio mysql.
Ver el estado de
mostrar variables como '%log_bin%';
Abierto con éxito
2. Autorizar el canal para vincularse a MySQL. La cuenta tiene la autoridad para servir como esclavo de MySQL.
CREAR USUARIO canal IDENTIFICADO POR 'canal';
CONCEDER SELECCIÓN, ESCLAVO DE REPLICACIÓN, CLIENTE DE REPLICACIÓN EN *.* A 'canal'@'%';
-- OTORGAR TODOS LOS PRIVILEGIOS EN *.* A 'canal'@'%' ;
PRIVILEGIOS DE ENJUAGUE;
3. Descargar y configurar el canal
1. Descargue el canal, visite la página de lanzamiento, seleccione el paquete requerido para descargar, tome la versión 1.0.17 como ejemplo
O use mis archivos: Alibaba Cloud Disk Sharing
Después de la descompresión
2. Modifique el archivo de configuración instancia.properties en la carpeta conf\example
archivo de configuración final
#################################################
## mysql serverId, v1.0.26+ se generará automáticamente
# canal.instancia.mysql.slaveId=0
# habilitar gtid usa verdadero/falso
canal.instance.gtidon=falso
# información de posición
canal.instance.master.address=127.0.0.1:3306
canal.instancia.master.diario.nombre=
canal.instancia.master.position=
canal.instance.master.timestamp=
canal.instancia.master.gtid=
# rds oss binlog
canal.instancia.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=
# información de meta tsdb de la tabla
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbNombre de usuario=canal
#canal.instance.tsdb.dbContraseña=canal
#canal.instancia.dirección.en espera =
#canal.instancia.standby.diario.nombre =
#canal.instancia.posición.en espera =
#canal.instancia.standby.timestamp =
#canal.instancia.standby.gtid=
# usuario Contraseña
canal.instance.dbUsername=raíz
canal.instance.dbContraseña=msir1234
canal.instance.connectionCharset = UTF-8
# habilitar druida Descifrar la contraseña de la base de datos
canal.instance.enableDruid=falso
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==
# expresión regular de la tabla
canal.instance.filter.regex=.*\\..*
# tabla de expresiones regulares negras
canal.instance.filter.black.regex=mysql\\.slave_.*
# filtro de campo de tabla (formato: esquema1.nombretabla1:campo1/campo2,esquema2.nombretabla2:campo1/campo2)
#canal.instance.filter.field=test1.t_product:id/asunto/palabras clave,test2.t_company:id/nombre/contacto/ch
# filtro negro del campo de la tabla (formato: esquema1.nombretabla1:campo1/campo2,esquema2.nombretabla2:campo1/campo2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch
# configuración mq
canal.mq.topic=ejemplo
# ruta de tema dinámico por esquema o expresión regular de tabla
#canal.mq.dynamicTopic=miprueba1.usuario,tema2:miprueba2\\..*,.*\\..*
canal.mq.partición=0
# configuración de partición hash
#canal.mq.enableDynamicQueuePartition=falso
#canal.mq.particionesNum=3
#canal.mq.dynamicTopicPartitionNum=test.*:4,mycanal:6
#canal.mq.partitionHash=test.table:id^nombre,.*\\..*
#################################################
3. Inicie el servicio del canal (bat en Windows, sh en Linux)
Haga clic en startup.bat para comenzar
Verifique el registro logs\canal\canal.log, si el inicio es exitoso, será como se muestra a continuación.
4. Basado en el principio de notificación del Canal
Interpretación:
- Una vez que el servicio del producto completa la modificación del producto, el negocio finaliza directamente sin ninguna intrusión de código.
- Canal monitorea los cambios en la base de datos MySQL y notifica inmediatamente al servicio de caché cuando se detectan cambios.
- El servicio de caché recibe la notificación del canal y actualiza el caché.
5. Integración del proyecto
1. dependencia del pompón
Utilice el cliente de inicio de canal de código abierto de terceros en GitHub. Dirección: https://github.com/NormanGyllenhaal/canal-client
<dependencia>
<groupId>top.javatool</groupId>
<artifactId>canal-spring-boot-starter</artifactId>
<versión>1.2.1-RELEASE</versión>
</dependencia>
2. Escribir dependencias
canal:
destino:
servidor de ejemplo: localhost:11111 #dirección IP y puerto del canal
3. Modificar la clase de entidad Artículo
Lo que Canal envía al cliente de canal es la fila de datos modificada (fila), y el cliente de canal que presentamos nos ayudará a encapsular los datos de la fila en la clase de entidad Elemento. Este proceso requiere conocer la relación de mapeo entre la base de datos y las entidades. Necesidad de utilizar anotaciones JPA:
Complete el mapeo entre los campos de la tabla de elementos y de la base de datos mediante @Id, @Column y otras anotaciones:
Tenga en cuenta que si es diferente del nombre de la base de datos, se debe utilizar @Column
package com.springboot3.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Id;
/**
*
* @TableName course
*/
@TableName(value ="course")
@Data
public class Course implements Serializable {
/**
*
*/
@Id
@TableId
private String id;
/**
*
*/
private String name;
/**
*
*/
@Column(name = "teacher_id")
private String teacherId;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
4. Escriba un oyente (sincronización de caché de Redis/jvm)
EntryHandler<T>
Escriba un oyente implementando la interfaz para escuchar los mensajes del Canal. Tenga en cuenta dos puntos:
- La clase de implementación
@CanalTable("course")
especifica la información de la tabla que se monitoreará. - El tipo genérico de EntryHandler es la clase de entidad correspondiente a la tabla.
package com.springboot3.handler;
import com.springboot3.domain.Course;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;
@CanalTable(value = "Course")
@Component
@Slf4j
public class CourseHandler implements EntryHandler<Course> {
@Autowired
private RedisTemplate redisTemplate;
@Override
public void insert(Course course) {
log.info("insert message {}", course);
redisTemplate.opsForValue().set(course.getId(),course);
}
@Override
public void update(Course before, Course after) {
log.info("update before {} ", before);
log.info("update after {}", after);
redisTemplate.opsForValue().set(after.getId(),after);
}
@Override
public void delete(Course course) {
log.info("delete {}", course);
redisTemplate.delete(course.getId());
}
}
6. Prueba
1. Datos de la tabla de la base de datos y datos de Redis.
base de datos:
Redis:
2. Agregar datos
Agregar física de datos
La consola muestra:
base de datos redis:
3. Modificar datos
Cambiar la física por la química.
La consola muestra:
base de datos redis:
4. Eliminar datos
Eliminar materia de química
datos de la consola
datos de la base de datos de redis: