范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

干货!基于SpringBoot的RabbitMQ多种模式队列实战

  环境准备#安装RabbitMQ
  由于RabbitMQ的安装比较简单,这里不再赘述。可自行到官网下载http://www.rabbitmq.com/download.html 依赖
  SpringBoot项目导入依赖      org.springframework.boot     spring-boot-starter-amqp  连接配置
  配置文件添加如下配置(根据自身情况修改配置) spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest #spring.rabbitmq.virtual-host=acelin
  五种队列模式实现#1 点对点的队列
  在java配置文件DirectRabbitConfig中先声明一个队列用于接收信息 public static final String PEER_TO_PEER_QUEUE = "peer-to-peer-queue"; // 点对点队列  /******************************* Peer-to-peer ******************************/ @Bean public Queue peer2peerQueue() {     return new Queue(PEER_TO_PEER_QUEUE,true); }
  创建一个消费者类Peer2PeerConsumers。用@RabbitListener对声明的队列进行监听 @Component public class Peer2PeerConsumers extends Base {      @RabbitListener(queues = DirectRabbitConfig.PEER_TO_PEER_QUEUE)     public void consumer2(Object testMessage) {         logger.debug("peer-to-peer消费者收到消息  : " + testMessage.toString());     } }
  创造一个消息生产者。在编码形式上,直接把消息发发送给接收的消息队列 /**  * 【点对点模式】  * @param task 消息内容  **/ @PostMapping("/peer-to-peer/{task}") public String peerToPeer(@PathVariable("task") String task){     rabbitTemplate.convertAndSend(DirectRabbitConfig.PEER_TO_PEER_QUEUE,task);     return "ok";  }
  启动项目。队列绑定到默认交换机
  调用生产者接口产生消息,可看到的消费者立即接收到信息 peer-to-peer消费者收到消息  : (Body:"hi mq" MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=, receivedRoutingKey=peer-to-peer-queue, deliveryTag=1, consumerTag=amq.ctag-vuKWCYLNLn3GwRJKJO5-Mg, consumerQueue=peer-to-peer-queue])
  这里要说明一点的是,点对点模式虽然编码形式只与队列交互,但其本质上还是要跟交换机交互的,本质跟下面要介绍的路由模式其实是一样的。
  查看convertAndSend方法的源码,可以看到我们虽然没有进行交换机和队列的绑定,发送消息是也没指定交换机,但是程序会为我们绑定默认的交换机。 The default exchange is implicitly bound to every queue, with a routing key equal to the queue name. It is not possible to explicitly bind to, or unbind from the default exchange. It also cannot be deleted.
  默认交换机会隐式绑定到每个队列,路由键等于队列名称。我们无法明确绑定到默认交换机或从默认交换中解除绑定。它也无法删除。
  且我们第一个参数传递的是队列的名称,但实际上程序是以这个名字作为路由,将同名队列跟默认交换机做绑定。所以的消息会根据该路由信息,通过默认交换机分发到同名队列上。(我们通过接收的信息receivedRoutingKey=peer-to-peer-queue和consumerQueue=peer-to-peer-queue也可以看的出来)
  2 工作队列模式Work Queue
  在java配置文件DirectRabbitConfig中先声明一个工作队列 public static final String WORK_QUEUE = "work-queue"; // 工作队列   /******************************* Work Queue ******************************/ @Bean public Queue workQueue() {     return new Queue(WORK_QUEUE,true); }
  创建一个消费者类WorkConsumers。同样用@RabbitListener对声明的队列进行监听 @Component public class WorkConsumers extends Base {      @RabbitListener(queues = DirectRabbitConfig.WORK_QUEUE)     public void consumer1(Object testMessage) {         logger.debug("work消费者[1]收到消息  : " + testMessage.toString());     }      @RabbitListener(queues = DirectRabbitConfig.WORK_QUEUE)     public void consumer2(Object testMessage) {         logger.debug("work消费者[2]收到消息  : " + testMessage.toString());     } }
  创造一个消息生产者。在编码形式上,直接把消息发发送给接收的消息队列 /**  * 【工作队列模式】  * @param task 消息内容  **/ @PostMapping("/work/{task}") public String sendWorkMessage(@PathVariable("task") String task){ 	 	rabbitTemplate.convertAndSend(DirectRabbitConfig.WORK_QUEUE,task); 	return "ok";  }
  启动项目,同样的,工作队列也是绑定到默认交换机。
  调用生产者接口连续发送几次消息,可看到两个消费者竞争对队列消息进行消费,一条消息只被一个消费者消费,不会出现重复消费的情况,因此工作队列模式也被称为竞争消费者模式。 - work消费者[1]收到消息  : (Body:"task1" MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=, receivedRoutingKey=work-queue, deliveryTag=1, consumerTag=amq.ctag-PUYjfVq56aEn-7a9DzLNzQ, consumerQueue=work-queue])  - work消费者[2]收到消息  : (Body:"task2" MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=, receivedRoutingKey=work-queue, deliveryTag=1, consumerTag=amq.ctag-1IVtDalFUCKVvYpFr_GF8A, consumerQueue=work-queue])  - work消费者[1]收到消息  : (Body:"task3" MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=, receivedRoutingKey=work-queue, deliveryTag=2, consumerTag=amq.ctag-PUYjfVq56aEn-7a9DzLNzQ, consumerQueue=work-queue])  - work消费者[2]收到消息  : (Body:"task4" MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=, receivedRoutingKey=work-queue, deliveryTag=2, consumerTag=amq.ctag-1IVtDalFUCKVvYpFr_GF8A, consumerQueue=work-queue])
  事实上,竞争消费者模式本质就是多个消费者对同一个队列消息进行消费。另外,与点对点模式一样,工作队列模式的也是用到了默认交换机进行消息分发。因此于基于的Direct交换机的路由模式的原理本质上都是一样的,因此,某种程度上,我们也可以用路由模式实现工作队列模式,这点我们下面介绍路由模式再进行展开
  3 路由模式Routing
  在java配置文件DirectRabbitConfig中先声明2个队列和一个direct类型的交换机,然后将队列1和与交换机用一个路由键1进行绑定,队列2用路由键2与队列进行绑定 public static final String DIRECT_QUEUE_ONE = "directQueue-1"; // Direct队列名称1 public static final String DIRECT_QUEUE_TWO = "directQueue-2"; // Direct队列名称2  public static final String MY_DIRECT_EXCHANGE = "myDirectExchange"; // Direct交换机名称  public static final String ROUTING_KEY_ONE = "direct.routing-key-1"; // direct路由标识1 public static final String ROUTING_KEY_ONE = "direct.routing-key-2"; // direct路由标识2  /******************************* Direct ******************************/ @Bean public Queue directQueueOne() {     return new Queue(DIRECT_QUEUE_ONE,true); }  @Bean public Queue directQueueTwo() {     return new Queue(DIRECT_QUEUE_TWO,true); }  @Bean public DirectExchange directExchange() {     return new DirectExchange(MY_DIRECT_EXCHANGE,true,false); }  @Bean public Binding bindingDirectOne() {     return BindingBuilder.bind(directQueueOne()).to(directExchange()).with(ROUTING_KEY_ONE); }  @Bean public Binding bindingDirectTwo() {     return BindingBuilder.bind(directQueueTwo()).to(directExchange()).with(ROUTING_KEY_TWO); }
  创建一个消费者类DirectConsumers。在每个消费者上,我们用3个消费者注解@RabbitListener对声明的队列进行监听。消费者1和3监听队列1,消费者2监听队列2 @Component public class DirectConsumers extends Base {      @RabbitListener(queues = DirectRabbitConfig.DIRECT_QUEUE_ONE)     public void consumer1(Object testMessage) {         logger.debug("Direct消费者[1]收到消息  : " + testMessage.toString());     }      @RabbitListener(queues = DirectRabbitConfig.DIRECT_QUEUE_TWO)     public void consumer2(Object testMessage) {         logger.debug("Direct消费者[2]收到消息  : " + testMessage.toString());     }      @RabbitListener(queues = DirectRabbitConfig.DIRECT_QUEUE_ONE)     public void consumer3(Object testMessage) {         logger.debug("Direct消费者[3]收到消息  : " + testMessage.toString());     } }
  创造一个消息生产者。发送消息时,带上路由键1信息 /**  * 【Direct路由模式】  * @param message 消息内容  **/ @PostMapping("/direct/{message}") public String sendDirectMessage(@PathVariable("message") String message) {      Map map = new HashMap<>();     map.put("messageId", String.valueOf(UUID.randomUUID()));     map.put("messageData", message);      /* 设置路由标识MY_ROUTING_KEY,发送到交换机MY_DIRECT_EXCHANGE */     rabbitTemplate.convertAndSend(DirectRabbitConfig.MY_DIRECT_EXCHANGE,DirectRabbitConfig.ROUTING_KEY_ONE, map);     return "ok"; }
  启动项目,查看该交换机的绑定情况
  发送多条信息,可以看到,由于队列2没有通过路由键1跟交换机进行绑定,所以对于监控队列2的消费者2,其无法结束到的带有路由键1的消息,而消费者1和3则竞争消费队列1的消息 - Direct消费者[3]收到消息  : (Body:"{messageId=54682b16-0142-46af-be0c-1156df1f27a7, messageData=msg-1}" MessageProperties [headers={}, contentType=application/x-java-serialized-object, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=myDirectExchange, receivedRoutingKey=direct.routing-key-1, deliveryTag=15, consumerTag=amq.ctag-CsuZL9KKByH9IDtqTKe-fg, consumerQueue=directQueue-1])  - Direct消费者[1]收到消息  : (Body:"{messageId=66cd296a-9a60-4458-8e87-72ed13f9964b, messageData=msg-2}" MessageProperties [headers={}, contentType=application/x-java-serialized-object, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=myDirectExchange, receivedRoutingKey=direct.routing-key-1, deliveryTag=2, consumerTag=amq.ctag-hWmdY04YuLL0O2rgeSlxsw, consumerQueue=directQueue-1])  - Direct消费者[3]收到消息  : (Body:"{messageId=48c0830e-2207-47ec-bd3e-a958fec48118, messageData=msg-3}" MessageProperties [headers={}, contentType=application/x-java-serialized-object, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=myDirectExchange, receivedRoutingKey=direct.routing-key-1, deliveryTag=16, consumerTag=amq.ctag-CsuZL9KKByH9IDtqTKe-fg, consumerQueue=directQueue-1])
  我们如果对新增一个队列3,通过路由键1与交换机进行绑定,消费者独立监听队列3,那么我们不难猜到,队列3将和队列1同样拿到一条消息,相当于广播的概念,但我们会发现如果要这么做,似乎路由键无足轻重,因此rabbitmq提供了一种特殊的交换机来处理这种场景,不需要路由键的参与。我们接着往下看
  4 发布/订阅模式Publish/Subscribe
  在java配置文件DirectRabbitConfig中先声明Fanout交换机和两队列,并将两个队列与该交换机进行绑定 public static final String MY_FANOUT_EXCHANGE = "myFanoutExchange"; // Fanout交换机名称  public static final String FANOUT_QUEUE_ONE = "fanout-queue-1"; // Fanout队列名称1 public static final String FANOUT_QUEUE_TWO = "fanout-queue-2"; // Fanout队列名称2  /******************************* Fanout ******************************/ @Bean public Queue fanoutQueueOne() {     return new Queue(FANOUT_QUEUE_ONE,true); }  @Bean public Queue fanoutQueueTwo() {     return new Queue(FANOUT_QUEUE_TWO,true); }  @Bean public FanoutExchange fanoutExchange(){     return new FanoutExchange(MY_FANOUT_EXCHANGE,true,false); }  @Bean public Binding bindingFanoutOne() {     return BindingBuilder.bind(fanoutQueueOne()).to(fanoutExchange()); }  @Bean public Binding bindingFanoutTwo() {     return BindingBuilder.bind(fanoutQueueTwo()).to(fanoutExchange()); }
  创建一个消费者类FanoutConsumers。创建两个消费者,分表对两个队列进行监听 @Component public class FanoutConsumers extends Base {      @RabbitListener(queues = DirectRabbitConfig.FANOUT_QUEUE_ONE)     public void consumer1(Object testMessage) {         logger.debug("FANOUT消费者[1]收到消息  : " + testMessage.toString());     }      @RabbitListener(queues = DirectRabbitConfig.FANOUT_QUEUE_TWO)     public void consumer2(Object testMessage) {         logger.debug("FANOUT消费者[2]收到消息  : " + testMessage.toString());     } }
  创造一个消息生产者。将消息发送给Fanout交换机 /**  * 【工作队列模式】  * @param task 消息内容  **/ @PostMapping("/work/{task}") public String sendWorkMessage(@PathVariable("task") String task){ 	 	rabbitTemplate.convertAndSend(DirectRabbitConfig.WORK_QUEUE,task); 	return "ok";  }
  启动项目,我们可以看到交换机与两个队列进行了绑定,但是路由键那一栏是空的。
  发送两条消息。 /**  * 【Fanout发布订阅模式】  * @param message 消息内容  **/ @PostMapping("/fanout/{message}") public String sendFanoutMessage(@PathVariable("message") String message) {      Map map = new HashMap<>();     map.put("messageId", String.valueOf(UUID.randomUUID()));     map.put("messageData", message);      /* 直接跟交换机MY_FANOUT_EXCHANGE交互 */     rabbitTemplate.setExchange(DirectRabbitConfig.MY_FANOUT_EXCHANGE);     rabbitTemplate.convertAndSend(map);     return "ok"; }
  可以看到,两个消费者都拿到了同样的数据,达到了广播的效果。 - FANOUT消费者[2]收到消息  : (Body:"{messageId=a4bf1931-1db8-4cb9-8b01-397f43a82660, messageData=Hi Fanout}" MessageProperties [headers={}, contentType=application/x-java-serialized-object, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=myFanoutExchange, receivedRoutingKey=, deliveryTag=1, consumerTag=amq.ctag-ncVmsRM7xHLZ0iAJT2tSTg, consumerQueue=fanout-queue-2])  - FANOUT消费者[1]收到消息  : (Body:"{messageId=a4bf1931-1db8-4cb9-8b01-397f43a82660, messageData=Hi Fanout}" MessageProperties [headers={}, contentType=application/x-java-serialized-object, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=myFanoutExchange, receivedRoutingKey=, deliveryTag=1, consumerTag=amq.ctag-zR3Oi0MVESq8qushlAMa3Q, consumerQueue=fanout-queue-1])  - FANOUT消费者[1]收到消息  : (Body:"{messageId=51f66720-35dd-4abf-9d33-24acf7786ed8, messageData=666}" MessageProperties [headers={}, contentType=application/x-java-serialized-object, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=myFanoutExchange, receivedRoutingKey=, deliveryTag=2, consumerTag=amq.ctag-zR3Oi0MVESq8qushlAMa3Q, consumerQueue=fanout-queue-1])  - FANOUT消费者[2]收到消息  : (Body:"{messageId=51f66720-35dd-4abf-9d33-24acf7786ed8, messageData=666}" MessageProperties [headers={}, contentType=application/x-java-serialized-object, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=myFanoutExchange, receivedRoutingKey=, deliveryTag=2, consumerTag=amq.ctag-ncVmsRM7xHLZ0iAJT2tSTg, consumerQueue=fanout-queue-2])
  5 通配符模式Topics
  在java配置文件DirectRabbitConfig中先声明一个Topic交换机、两个工作队列和三个通配绑定键,其中一个队列通过两个不同通配绑定键与交换机绑定,另外一个队列用第三个绑定键进行绑定。 public static final String WORK_QUEUE = "work-queue"; // 工作队列   /******************************* Work Queue ******************************/ @Bean public Queue workQueue() {     return new Queue(WORK_QUEUE,true); }
  通过rabbitmq管理页面我们可以看到交换机与队列的绑定变化,可以看到队列1车工绑定了两个通配键
  创建一个消费者类TopicConsumers。创建两个消费者分别对两个队列做监听。 @Component public class WorkConsumers extends Base {      @RabbitListener(queues = DirectRabbitConfig.WORK_QUEUE)     public void consumer1(Object testMessage) {         logger.debug("work消费者[1]收到消息  : " + testMessage.toString());     }      @RabbitListener(queues = DirectRabbitConfig.WORK_QUEUE)     public void consumer2(Object testMessage) {         logger.debug("work消费者[2]收到消息  : " + testMessage.toString());     } }
  创造一个消息生产者。发送3条不同的消息,分别带上三个不同的路由键 /**  * 【Topic通配符模式】  * @param message 消息内容  **/ @PostMapping("/topic/{message}") public String sendTopicMessage(@PathVariable("message") String message) {      Map map = new HashMap<>();      /* 直接跟交换机MY_FANOUT_EXCHANGE交互 */     rabbitTemplate.setExchange(DirectRabbitConfig.MY_TOPIC_EXCHANGE);      map.put("messageId", String.valueOf(UUID.randomUUID()));     map.put("messageData", message + "TEST1");     rabbitTemplate.convertAndSend(DirectRabbitConfig.TOPIC_ROUTING_KEY_ONE,map);      map.put("messageId", String.valueOf(UUID.randomUUID()));     map.put("messageData", message + "TEST2");     rabbitTemplate.convertAndSend(DirectRabbitConfig.TOPIC_ROUTING_KEY_TWO,map);      map.put("messageId", String.valueOf(UUID.randomUUID()));     map.put("messageData", message + "TEST3");     rabbitTemplate.convertAndSend(DirectRabbitConfig.TOPIC_ROUTING_KEY_THREE,map);      return "ok"; }
  路由键声明如下: public static final String TOPIC_ROUTING_KEY_ONE = "topic.a1.b1.c1"; // topic路由键1 public static final String TOPIC_ROUTING_KEY_TWO = "topic.a1.b1";    // topic路由键2 public static final String TOPIC_ROUTING_KEY_THREE = "topic.a2.b1";  // topic路由键3
  启动项目,调用生产者的接口,查看两个消费者的消费情况。 - TOPIC消费者[2]收到消息  : (Body:"{messageId=82abd282-1110-4f1a-b09e-ae9a43c560c3, messageData=hi topic! TEST1}" MessageProperties [headers={}, contentType=application/x-java-serialized-object, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=myTopicExchange, receivedRoutingKey=topic.a1.b1.c1, deliveryTag=1, consumerTag=amq.ctag-wlRVC5xWiN8glrtA2_i6uA, consumerQueue=topic-queue-2])  - TOPIC消费者[1]收到消息  : (Body:"{messageId=b2039557-75d8-47d5-93a0-2a03a38fabc7, messageData=hi topic! TEST2}" MessageProperties [headers={}, contentType=application/x-java-serialized-object, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=myTopicExchange, receivedRoutingKey=topic.a1.b1, deliveryTag=1, consumerTag=amq.ctag-F6ByjknEnCjh7XVolNfmcg, consumerQueue=topic-queue-1])  - TOPIC消费者[2]收到消息  : (Body:"{messageId=b2039557-75d8-47d5-93a0-2a03a38fabc7, messageData=hi topic! TEST2}" MessageProperties [headers={}, contentType=application/x-java-serialized-object, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=myTopicExchange, receivedRoutingKey=topic.a1.b1, deliveryTag=2, consumerTag=amq.ctag-wlRVC5xWiN8glrtA2_i6uA, consumerQueue=topic-queue-2])  - TOPIC消费者[1]收到消息  : (Body:"{messageId=3a8f3164-706f-4523-bd2a-4fee73595fbb, messageData=hi topic! TEST3}" MessageProperties [headers={}, contentType=application/x-java-serialized-object, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=myTopicExchange, receivedRoutingKey=topic.a2.b1, deliveryTag=2, consumerTag=amq.ctag-F6ByjknEnCjh7XVolNfmcg, consumerQueue=topic-queue-1])
  可以看到,路由键前缀为topic.a1的信息都可以被绑定了topic.a1.#的队列接收到,而绑定了topic.a1.*的队列只能接收到topic.a1后面带一个单词的信息,由于队列1还通过topic.*.b1绑定交换机,因此携带路由键"topic.a2.b1"的信息同样也被队列1接收 topic交换机是direct交换机做的改造的。两者的区别主要体现在路由键和绑定键格式上的限制不同。
  路由键 :必须是由点分隔的单词列表。单词形式不限。比如一个主题建:<主题1>.<主题2>.<主题3>
  绑定键 :格式上和路由键一致,但多了两个通配符*和#,#代表任意数量的单词,包括0个。*标识一个单词。
  使用上,一个绑定键,我们可以看成是对一类具有多个特征的物体的一个抽象,由点分割的每个单词,我们可以看成一个主题或是一个特征。因此只要做好消息特征的归纳抽象,加上通配符的使用,我们就有很高的自由度去处理任意类型的消息
  总结#
  以上就是关于RabbitMQ五种队列模式的实战演练,关于RabbitMQ其它实战与知识理解后续会相继分享,感兴趣的同学欢迎留言讨论

拯救者电竞手机Pro正式发布3499元起今日开售7月22日,联想召开了以架构革命为战而生为主题的新品线上发布会。拯救者电竞手机Pro正式发布。联想集团副总裁移动游戏业务总经理赵允明表示为战而生是拯救者不变的初心,代表着拯救者对游超乎预料的声音OPPOEncoM31林氏评测前阵子,家里有个老同学找我推荐耳机,指明要颈挂人家是医生,医院大家懂的,闲时倒是可以听会儿歌,但不定什么时候就得摘下来忙,忙起来恨不得晕头转向,这时候真无线就很容易丢,颈挂则不存在极富辨识度的声音飞朵小行星(1234)林氏评测我们越来越习惯于碎片时间了对不对?我们在超市排队等付款的时候会低头刷两条微博,在家稍有闲暇就会打开B站或是抖音,想要耐心的看完一本书却发现自己很难静下心扎进纸墨间,想把一张专辑完整偷拍?一念之差的悲哀!生而为人,教养的缺失9月一个充满希望的名称!我只辉煌了一刹那昙花的梦随着开学季节的到来,有些人刚刚进入学校大门,而湖北的一位谦谦学子的校园生涯已经结束。近日,有网友发文湖北工业大学举办开学典礼时一名大手机摄像头越多越好?那可不一定,摄像头的组成决定拍照效果自从华为P9开启双摄的模式之后,众多厂商纷纷效仿,多摄像头的配置早已成为旗舰机的标配,甚至千元机都会搭载多摄像头,以吸引更多的消费者。虽然华为手机并不是首款双摄手机,但它却引领了多三款3000元档新机来袭,荣耀20红米K20PRO一加7优缺点对比?最近,不少品牌纷纷发布新款机型,在手机的战场上又迎来了新一轮的竞争。临近电商的年中活动,各大手机厂商已纷纷进行补贴与优惠大战,也是一年之中入手新机的好机会。不过,现在很多品牌都主打还记得那个借郑州暴雨机会涨价的酒店吗?最新处理结果已出据郑州市场监管微信号23日凌晨消息,郑州市市场监管局对暴雨期间郑州希岸酒店(高铁站店)借机涨价行为作出50万元行政处罚。郑州市场监管微信号截图据悉,近日,为维护暴雨期间郑州市区酒店华为Nova5pro凭什么比荣耀20贵300元,买手机贵的就一定好吗?最近,关于华为的新闻不断的充斥着我们的眼球,5G鸿蒙新操作系统方舟编译器等不断有新的研发让我们兴奋。华为新机的发布步伐也越来越快,先是荣耀20系列发布,再到刚发布不久的华为Nova这款起步价就卖3999元的一加7Pro与同价的华为P30,怎么选?现在,市面上的手机通常有几个价格分布,1000元以下的老人机,1699元左右的中低端机,2000元的中端机,2699元的性价比旗舰机,这些价格受众群体多,也是厂商竞争最激烈档位。在同为2799元档,骁龙855游戏电竞手机,黑鲨2iQOO优缺点对比现在,各大品牌的旗舰手机,都把性能与配置发挥到极致,每每新机发布,都能让人兴奋一把,都有立刻就想拥有的冲动。在手机的性能之中,除了人们日常重视的拍照功能,游戏性能是不少男生选择手机再谈千元机,性能过剩的年代,魅族16XsvivoZ5X同样值得考虑说起千元机,它似乎和性能扯不上关系,相比旗舰机,它有着更多的不足,看起来总是不那么的完美。但现在,手机等数码产品硬件更新极快,硬件的性能相对过剩,就算不是什么极致的性能,用起来也丝
被誉为新四大发明的共享单车尸横遍野,现在还是国人的骄傲吗2015年,共享单车突然在中国各个城市的角落火了,大街小巷各种颜色的共享单车非常多,而且共享单车推出了,解决出行最后一公里的麻烦的理念,因此共享单车确实给很多人带来生活上的方便,受iPhone换安卓?再贵我也不会买我发现随着iPhone13的缓慢崛起,曾经抱怨iPhone无聊的同学开始选择拥抱它。许多人在字典中听到了真相。如果能把120Hz的高速刷分出来,我觉得今年还是值得换个的。但近年来,花费三年耗资五亿全为一款全面屏,小米MIX4值得在全面屏的领域,小米算是行业中的领先品牌了。以至于现在提到全面屏手机,其实很多消费者会不由自主地想到小米,而且作为全面屏手机的开创者,小米其实从第一代全面屏开始,一直都在探索,非常晶晨系列CPU网络机顶盒刷机方法线刷方法晶晨系列CPU网络机顶盒刷机方法线刷方法过期网络机顶盒不能看电视了怎么办,刷机一下满血复活下面是我总结线刷方法1电脑端安装线刷工具USBBurningTool,注意安装过程中会进行首选推荐的网络电视机顶盒带你不同的体验近几年内的网络电视盒子层出不穷而且还都是各有各的特色在内,想要在这些众多电视盒子中挑选自己比较满意的一款着实不容易,今天我就要给大家推荐几款我觉得用起来很好的网络电视盒子,性能上是工业互联网时代,西门子网络信息安全制胜之道来源人民网汽油柴油航空燃料全线紧缺今年5月,一款危险的勒索病毒潜入美国最大成品油运输管道运营商ColonialPipeline公司内网,导致5500英里输油管道关闭,迫使美国东部十微软老板称赞索尼PS5手柄优秀未来要加入类似功能近日PS5手柄设计师介绍了手柄早期研发的细节,讲述了如何创造触觉反馈和自适应扳机两个特色功能,一起来了解下。随着索尼和微软新一代游戏机的推出,他们也更新了自家手柄,虽然他们各有优点腾讯80条证据状告字节,获赔60万腾讯又双叒叕把字节告了,还获得了60万元赔偿!原因是,游戏王者荣耀的玩家将自己玩游戏的过程保存为本地视频并发布到抖音等平台,获得了大量的传播与粉丝。腾讯方认为,抖音关联公司北京微播七喜手机衰亡史前老板套现8亿走人,转行后身价又升到130亿在2006年左右,一款品牌为七喜的手机被推入市场,很快获得了较高的市场响应度,因为七喜品牌知名度较高,而且是正规大厂出品,而且在各大手机品牌连锁店销售。那么,七喜手机与七喜饮料又有iQOO8即将使用E5材质的屏幕,会给我们的屏幕体验带来啥?感谢您的阅读!iQOO8即将使用E5材质的屏幕,会给我们的屏幕体验带来啥?屏幕很多时候,会给你带来的惊喜程度,远超过手机的性能带来的体验。很多人可能会忽略手机屏幕所带来的体验效果,俘获女神心,aigo推出高颜值移动电源,网友必须买移动电源作为我们日常生活中最常见的数码产品相信大家都不会陌生,尤其是对于手机用户来说几乎是人手一个,有些人甚至可能不止一个。最近女神大人手里的移动电源好像出了问题,无法给手机充电,