首先导入hotel-admin 一个实现了对数据库数据增删改查的简易后台
本次的目标是,实现对后台数据库Crud的同时,保证ES内部的数据同步变更
- 明确主次关系,引起修改的主体是对数据库的Crud,通过使用消息队列技术来监听Crud,实现异步调用Es进行数据的更新
- hotel-admin是Publisher,在对数据库进行crud的时候,要同步发送消息到队列
- 队列应该分开设计,可以使用topic交换机,分别声明,hotel.insert.queue和hotel.delete.queue队列
- 在添加/更新数据的时候
rabbitTemplate.convertAndSend(MqConstants._HOTEL_EXCHANGE_,MqConstants._HOTEL_INSERT_KEY_,hotel.getId());
- 在删除数据的时候
rabbitTemplate.convertAndSend(MqConstants._HOTEL_EXCHANGE_,MqConstants._HOTEL_DELETE_KEY_,id);
- 之后是修改hotel-demo的代码
package cn.itcast.hotel.mq;
import cn.itcast.hotel.constant.MqConstants; import cn.itcast.hotel.service.IHotelService; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;
/** * @Author MisakiMikoto * @Date 2023/5/23 */ @Component public class HotelListener {
@Autowired private IHotelService hotelService;
/** * 监听酒店新增或者修改的业务 * @param id 酒店ID */ @RabbitListener(queues = MqConstants.HOTEL_INSERT_QUEUE) public void listenHotelInsertOrUpdate(Long id){ hotelService.insertById(id); }
/** * 监听酒店删除的业务 * @param id 酒店ID */ @RabbitListener(queues = MqConstants.HOTEL_DELETE_QUEUE) public void listenHotelDelete(Long id){ hotelService.deleteById(id); } } 别忘记还需要声明个个队列与交换机和key的关系
|
编写一个docker.compose文件实现集群的自动部署
version: '2.2' services: es01: image: elasticsearch:7.12.1 container_name: es01 environment: - node.name=es01 - cluster.name=es-docker-cluster - discovery.seed_hosts=es02,es03 - cluster.initial_master_nodes=es01,es02,es03 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - data01:/usr/share/elasticsearch/data ports: - 9200:9200 networks: - elastic es02: image: elasticsearch:7.12.1 container_name: es02 environment: - node.name=es02 - cluster.name=es-docker-cluster - discovery.seed_hosts=es01,es03 - cluster.initial_master_nodes=es01,es02,es03 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - data02:/usr/share/elasticsearch/data ports: - 9201:9200 networks: - elastic es03: image: elasticsearch:7.12.1 container_name: es03 environment: - node.name=es03 - cluster.name=es-docker-cluster - discovery.seed_hosts=es01,es02 - cluster.initial_master_nodes=es01,es02,es03 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - data03:/usr/share/elasticsearch/data networks: - elastic ports: - 9202:9200 volumes: data01: driver: local data02: driver: local data03: driver: local networks: elastic:driver: bridge
|
启动集群之前还需要设置
vm.max_map_count=262144
这个文件在/etc/下 如果没找到,可以手动创建 然后输入 sudo sysctl -p
|
集群状态监控
实星代表主节点,空星代表次节点
查询时,请求先传送到coordinating节点,coordinating节点会把请求分发给所有其他的节点,之后把查询的结果进行汇总,然后处理为最终结果返回给用户