当前位置: 首页 > wzjs >正文

网站模板开发推广 quot 网站开发 quot

网站模板开发,推广 quot 网站开发 quot,郑州网站优化工资,餐饮vi设计案例欣赏一、场景简介 现有酒店管理与酒店搜索预定两个分离的微服务模块,为了数据的安全性我们在就带你管理模块通过Mysql进行crud,为了搜索的高效和质量在搜索预定模块我们采用了ElasticSearch搜索引擎(视作一种NoSQL 数据库)&#xff0c…

一、场景简介

        现有酒店管理与酒店搜索预定两个分离的微服务模块,为了数据的安全性我们在就带你管理模块通过Mysql进行crud,为了搜索的高效和质量在搜索预定模块我们采用了ElasticSearch搜索引擎(视作一种NoSQL 数据库),这样一来如何同步数据就是我们必须要解决的问题。

 

        而上图这样的调用暴露接口的方式无疑又违背了分模块单一职责的初衷,降低了效率又增加了耦合,为了解决这一问题,我们将采用消息中间件Rabbit MQ来承担通讯的角色。

 

 二、问题解决

        有关MQ的内容大家可以自行查找或查看官方文档RabbitMQ Tutorials | RabbitMQ

1.引入依赖

因为两个模块一个发布,一个监听都需要用到MQ,所以两者都要引入依赖

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

 2.配置.yml

spring:rabbitmq:port: 5672host: 192.168.56.128 #主机地址username: #账号password: #密码virtual-host: / #虚拟主机

2.常量定义

        一些关于MQ中间件定义和使用时需要用到的常量,当然也可以直接在用的时候再声明,这里选择做统一管理。

public class MqConstant {/*** 交换机*/public final static String HOTEL_EXCHANGE="hotel.topic";/*** 监听新增和修改的队列*/public final static String HOTEL_INSERT_QUEUE="hotel.insert.queue";/*** 监听删除的队列*/public final static String HOTEL_DELETE_QUEUE="hotel.delete.queue";/*** 新增或修改的RoutingKey*/public final static String HOTEL_INSERT_KEY="hotel.insert.key";/*** 删除的RoutingKey*/public final static String HOTEL_DELETE_KEY="hotel.delete.key";}

 3.组件定义

可以直接在@RabbitListener注解中定义绑定关系等属性,这里为了看起来更清晰,我采用@Bean注解定义在配置类,放在需要进行监听的用户搜索模块

import cn.itcast.hotel.constant.MqConstant;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MqConfig {//定义交换机,关于fanout,direct,topic三种不同交换机的区别可查看官方文档@Beanpublic TopicExchange topicExchange(){return new TopicExchange(MqConstant.HOTEL_EXCHANGE,true,false);}//定义增改队列@Beanpublic Queue insertQueue(){return new Queue(MqConstant.HOTEL_INSERT_QUEUE,true);}//定义删除队列@Beanpublic Queue deleteQueue(){return new Queue(MqConstant.HOTEL_DELETE_QUEUE,true);}//定义增改绑定关系@Beanpublic Binding insertQueueBinding(){return new Binding(MqConstant.HOTEL_INSERT_QUEUE,Binding.DestinationType.QUEUE,MqConstant.HOTEL_EXCHANGE,MqConstant.HOTEL_INSERT_KEY,null);}//定义删除绑定关系@Beanpublic Binding deleteQueueBinding(){return BindingBuilder.bind(deleteQueue()).to(topicExchange()).with(MqConstant.HOTEL_DELETE_KEY);}
}

 4.消息发布

酒店管理模块中在增删改业务成功完成后应该向MQ发布消息通知,我们来补全Service中的逻辑

import cn.itcast.hotel.constant.MqConstant;
import cn.itcast.hotel.mapper.HotelMapper;
import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.service.IHotelService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class HotelService extends ServiceImpl<HotelMapper, Hotel> implements IHotelService {@Autowiredprivate RabbitTemplate rabbitTemplate;/*** 保存酒店信息并发送消息到 RabbitMQ* @param hotel 酒店对象*/public void saveHotelWithMessage(Hotel hotel) {// 使用 MyBatis-Plus 保存酒店信息到数据库boolean saveSuccess = this.save(hotel);if (saveSuccess) {// 发送消息到 RabbitMQrabbitTemplate.convertAndSend(MqConstant.HOTEL_EXCHANGE, MqConstant.HOTEL_INSERT_KEY, hotel.getId());} else {throw new RuntimeException("保存酒店信息失败");}}/*** 更新酒店信息并发送消息到 RabbitMQ* @param hotel 酒店对象*/public void updateHotelWithMessage(Hotel hotel) {// 检查 ID 是否存在if (hotel.getId() == null) {throw new IllegalArgumentException("ID 不能为空");}// 使用 MyBatis-Plus 更新酒店信息boolean updateSuccess = this.updateById(hotel);if (updateSuccess) {// 发送消息到 RabbitMQrabbitTemplate.convertAndSend(MqConstant.HOTEL_EXCHANGE, MqConstant.HOTEL_INSERT_KEY, hotel.getId());} else {throw new RuntimeException("更新酒店信息失败");}}/*** 删除酒店信息并发送消息到 RabbitMQ* @param id*/@Overridepublic void removeByIdWithMessage(Long id) {if (id == null) {throw new IllegalArgumentException("ID 不能为空");}// 使用 MyBatis-Plus 更新酒店信息boolean removeSuccess = this.removeById(id);if (removeSuccess) {// 发送消息到 RabbitMQrabbitTemplate.convertAndSend(MqConstant.HOTEL_EXCHANGE, MqConstant.HOTEL_DELETE_KEY, id);} else {throw new RuntimeException("删除酒店信息失败");}}
}

5.监听消息

在用户搜索模块,需要监听MQ发来的消息,根据key判断并执行ES的更新操作

  • 监听
    import cn.itcast.hotel.constant.MqConstant;
    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;@Component
    public class HotelListener {@Autowiredprivate IHotelService hotelService;/*** 监听酒店新增或修改* @param id*/@RabbitListener(queues = MqConstant.HOTEL_INSERT_QUEUE)public void listenHotelInsert(Long id){hotelService.insertDocById(id);}/*** 监听酒店删除* @param id*/@RabbitListener(queues = MqConstant.HOTEL_DELETE_QUEUE)public void listenHotelDelete(Long id){hotelService.deleteDocById(id);}
    }
    
  •  更新操作
    @Overridepublic void deleteDocById(Long id) {//request对象DeleteRequest deleteRequest = new DeleteRequest("hotel",id.toString());//发送请求try {restHighLevelClient.delete(deleteRequest,RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(e);}}@Overridepublic void insertDocById(Long id) {//获取数据库数据Hotel hotel = getById(id);//转换esHotelDoc hotelDoc = new HotelDoc(hotel);//request对象IndexRequest indexRequest =new IndexRequest("hotel").id(hotel.getId().toString());//jsonindexRequest.source(JSON.toJSONString(hotelDoc), XContentType.JSON);//发送请求try {restHighLevelClient.index(indexRequest,RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(e);}}

三、功能测试 

         在酒店管理模块中更改MySQL数据库内容,观察是否同步到利用ES数据库回显的用户查询模块,以下是价格1500以上酒店的间隔升序回显:

可以看到深圳大中华最低,以1599排在第一页首位

 我们在管理模块将其价格上升十倍

再回到用户搜索模块,可以看到深圳大中华价格已经变为15990并且出现在最后一页末尾,可见ES中数据也被同步修改,这里就不在通过DSL查询向大家展示了。

通过以上更改,我们实现了更合理高效的数据同步,那么本次的分享到这里就结束了,感谢大家阅读。


文章转载自:

http://CP9T6LqJ.gyjLd.cn
http://A1qA2OO4.gyjLd.cn
http://XPq5INUj.gyjLd.cn
http://4ZvsrtEy.gyjLd.cn
http://xR8W3Pkx.gyjLd.cn
http://5MhUjVbo.gyjLd.cn
http://sOsM9hho.gyjLd.cn
http://pQKVrFRb.gyjLd.cn
http://G2C4ANCY.gyjLd.cn
http://MmYnEpPm.gyjLd.cn
http://E3dARuRc.gyjLd.cn
http://jWytIPNa.gyjLd.cn
http://iOhPYuib.gyjLd.cn
http://8YG9rkIz.gyjLd.cn
http://tgQVIBky.gyjLd.cn
http://YrvcQDb8.gyjLd.cn
http://ViidKpI6.gyjLd.cn
http://lJdEvJkp.gyjLd.cn
http://rk0QW7Ds.gyjLd.cn
http://ryuONkCL.gyjLd.cn
http://0DmlGtYn.gyjLd.cn
http://eItocM4H.gyjLd.cn
http://VEHzeLC7.gyjLd.cn
http://GbXR7zHo.gyjLd.cn
http://bmkae7cT.gyjLd.cn
http://76WHxB5f.gyjLd.cn
http://DLAcgQ1I.gyjLd.cn
http://cmdei6IZ.gyjLd.cn
http://PuR3aj4r.gyjLd.cn
http://47heHC5G.gyjLd.cn
http://www.dtcms.com/wzjs/671362.html

相关文章:

  • 怎么免费注册网站手机对比参数配置
  • lamp网站开发七牛云cdn加速wordpress
  • 建立网站准备工作流程网页升级访问网页导航
  • 下列关于网站开发中搜索引擎排名优化建议
  • 找人做购物网站app 软件开发公司
  • 人人做全免费网站江苏苏州昨天出大事
  • 邢台市政建设集团网站蓝色大气网站源码
  • 广西备案工信部网站查看邮箱注册过的网站
  • 齐河县建设局网站知名做漫画网站
  • 做推广都有什么网站企业网站手机版模板
  • 注册账号自建网站163企业邮箱费用
  • 国外 设计网站做网站 怎么发布
  • 盘县网站开发网站规划设计报告
  • pk10代码网站开发小程序怎么放在桌面
  • 网站制作哪家好薇wordpress博客分类
  • 免费网站生成器wordpress无刷新评论
  • 榆林市横山县建设局官方网站辽源市网站建设
  • 网站正在备案中西安旅游攻略知乎
  • 电商网站建设实训步骤深圳网站建设公司哪家
  • 中文商城响应式html网站模板做网站开始要注意什么
  • 《营销型网站建设实战》公司网站微信平台建设的好处
  • 竞价托管推广多少钱怀化网站优化公司有哪些
  • 网站开发与设计培训网站做系统下载
  • seo网站优化价格南京网站设计机构
  • 福州网站seo微商城网站策划
  • 自己做的网站有排名吗建筑工程公司有哪些
  • js网站评论框有哪些做ppt的网站有哪些
  • 炫酷一些的网站手机网站开发技术pdf
  • 商城网站建设需求文档建站模板招募设计师
  • 石家庄网站备案平面设计培训学校一年学费