消息中间件(七)——RabbitMQ的工作模式(Publish/Subscribe)

9 篇文章 16 订阅
订阅专栏

RabbitMQ有以下几种工作模式 : 1、Work queues 2、Publish/Subscribe 3、Routing 4、Topics 5、Header 6、RPC

1、Work Queues模式

work queues与入门程序相比,多了一个消费端,两个消费端共同消费同一个队列中的消息。 ​

应用场景:对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度。

测试: ​ 1、使用 入门程序,启动多个消费者。 ​ 2、生产者发送多个消息。

特点:

1、一条消息只会被一个消费者接收; ​

2、RabbitMQ采用轮询的方式将消息是平均发送给消费者的; ​

3、消费者在处理完某条消息后,才会收到下一条消息。

2、Publish/Subscribe模式

Publish/Subscribe即发布订阅模式,它有如下特点:

1、每个消费者监听自己的队列

2、生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息

2.1 代码实现

代码还是编写在 入门程序的工程中

场景:当用户充值成功或转账完成系统通知用户,通知方式有短信、邮件多种方法 。

2.1.1 生产者代码

声明exchange_fanout_inform交换机

声明两个队列,并且绑定到此交换机,绑定时不需要指定routingkey ​

发送消息时不需要指定routingkey

package com.zdw.prodcure;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * Create By zdw on 2019/9/17
 * 这是发布订阅模式Publish/Subscribe的生成者
 */
public class PubSubProdcure {
    private static final String EXCHANGE_NAME="exchange_fanout_inform";//定义交换机名称
    private static final String QUEUE_MSG="queue_msg_inform";//短信队列名称
    private static final String QUEUE_EMAIL="queue_email_inform";//邮件队列名称

    public static void main(String[] args) {
        Connection connection = null;//定义连接对象
        Channel channel = null;//定义通道对象

        try {
            //创建连接工厂对象
            ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.setHost("127.0.0.1");
            connectionFactory.setPort(5672);
            connectionFactory.setUsername("guest");
            connectionFactory.setPassword("guest");
            connectionFactory.setVirtualHost("/");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服务

            connection = connectionFactory.newConnection();//得到与RabbitMQ服务的TCP连接

            channel = connection.createChannel();//从连接中得到与交换机的通道,一个连接可以创建多个通道,一个通道代表一个会话任务

            /**
             * 声明两个队列,String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
             * 参数明细:
             *  1、String queue:队列名称
             *  2、boolean durable:是否持久化,如果持久化,mq重启后队列还在
             *  3、exclusive :是否独占连接,队列只允许在该连接中访问,如果connection连接关闭队列则自动删除,如果将此参数设置true可用于临时队列的创建
             *  4、autoDelete 自动删除,队列不再使用时是否自动删除此队列,如果将此参数和exclusive参数设置为true就可以实现临时队列(队列不用了就自动删除)
             *  5、arguments 参数,可以设置一个队列的扩展参数,比如:可设置存活时间
             */
            channel.queueDeclare(QUEUE_MSG,true,false,false,null);
            channel.queueDeclare(QUEUE_EMAIL,true,false,false,null);

            /**
             * 声明交换机:
             * 参数:String exchange, BuiltinExchangeType type
             * 1、exchange:交换机名称
             * 2、type:交换机类型,主要有以下几种类型:
             *      fanout:对应的是发布订阅模式
             *      direct:对应的是routing模式
             *      topic:对应的是ropic模式
             *      headers 对应的是headers工作模式
             */
            channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);

            /**
             * 队列绑定到交换机
             * 参数:String queue, String exchange, String routingKey
             * 1、队列名称 2、交换机名称  3、路由key,作用是交换机根据路由key的值将消息转发到指定的队列中,在发布订阅模式中设置为空字符串
             */
            channel.queueBind(QUEUE_MSG,EXCHANGE_NAME,"");
            channel.queueBind(QUEUE_EMAIL,EXCHANGE_NAME,"");

            /**
             * 发送消息:String exchange, String routingKey, BasicProperties props, byte[] body
             * 参数明细:
             * 1、exchange 交换机 如果不指定将使用mq的默认交换机(设置为"")
             * 2、routingKey 路由key 交换机根据路由key来将消息转发到指定的队列,如果使用默认交换机,routingKey设置为队列的名称
             * 3、props 消息的属性
             * 4、body  消息主体
             * 这里没有指定交换机,消息将发送给默认交换机,每个队列也会绑定那个默认的交换机,但是不能显示绑定或解除绑定
             * 默认的交换机,routingKey等于队列名称
             */
            for(int i=0;i<5;i++) {
                //定义发送的消息内容
                String message = "send inform message to user:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ssSSS").format(new Date());
                //------------------发送消息
                channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());
                System.out.println("Send message to MQ:" + message);
            }

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(channel!=null){
                try {
                    channel.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

代码中声明了一个交换机和两个队列,两个队列都绑定到了交换机上面,生产者发送消息到RabbitMQ。

运行上面的程序,可以通过浏览器访问: http://localhost:15672 查看详情:

可以看到多了一个交换机,交换机的类型是fanout。

可以看到又多了两个队列,同时每个队列中都有待消费的5条消息。

2.1.2 消费者代码

我们上面的生产者发送消息的时候,绑定了一个交换机两个队列,那么意味着就会有两个消费者,每个消费者绑定不同的队列,只消费改队列中的消息。

2.1.2.1 短信消费者

package com.zdw.consumer;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * Create By zdw on 2019/9/18
 * 短信消费者
 */
public class PubSubConsumerMsg {
    private static final String EXCHANGE_NAME="exchange_fanout_inform";//定义交换机名称,一定要与生产者中相同
    private static final String QUEUE_MSG="queue_msg_inform";//短信队列名称,一定要与生产者中相同

    public static void main(String[] args) {
        Connection connection = null;//定义连接对象
        Channel channel = null;//定义通道对象

        try {
            //创建连接工厂对象
            ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.setHost("127.0.0.1");
            connectionFactory.setPort(5672);
            connectionFactory.setUsername("guest");
            connectionFactory.setPassword("guest");
            connectionFactory.setVirtualHost("/");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服务

            connection = connectionFactory.newConnection();//获取与RabbitMQ的tcp连接

            channel = connection.createChannel();//得到连接通道,一个连接可以创建多个通道,每个通道相当于一个会话任务

            channel.queueDeclare(QUEUE_MSG,true,false,false,null);//声明队列

            channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);//声明交换机

            channel.queueBind(QUEUE_MSG,EXCHANGE_NAME,"");//绑定队列到交换机

            //定义消费消息的方法
            DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
                /**
                 * 消费者接收消息后执行该方法
                 * @param consumerTag  消费者标签,用来标识消费者的,在监听队列时(channel.basicConsume)设置
                 * @param envelope     信封,通过envelope  消息包的内容,可从中获取消息id,消息routingkey,交换机,
                 *                     消息和重传标志(收到消息失败后是否需要重新发送)
                 * @param properties   消息属性
                 * @param body         消息内容
                 * @throws IOException
                 */
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    String exchange = envelope.getExchange();
                    String routingKey = envelope.getRoutingKey();
                    long msgId = envelope.getDeliveryTag();//消息id
                    String msg = new String(body,"utf-8");
                    System.out.println(exchange+"//"+routingKey+"//"+msgId+"//"+msg);
                }
            };

            //监听队列
            /** 参数:String queue, boolean autoAck, Consumer callback
             *  1、queue 队列名称
             *  2、autoAck 自动回复,当消费者接收到消息后要告诉mq消息已接收,如果将此参数设置为tru表示会自动回复mq,如果设置为false要通过编程实现回复
             *  3、callback,消费方法,当消费者接收到消息要执行的方法
             */
            channel.basicConsume(QUEUE_MSG,true,defaultConsumer);

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

2.1.2.2 邮件消费者

package com.zdw.consumer;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * Create By zdw on 2019/9/18
 * 邮件消费者
 */
public class PubSubConsumerEmail {
    private static final String EXCHANGE_NAME="exchange_fanout_inform";//定义交换机名称,一定要与生产者中相同
    private static final String QUEUE_EMAIL="queue_email_inform";//邮件队列名称,一定要与生产者中相同

    public static void main(String[] args) {
        Connection connection = null;//定义连接对象
        Channel channel = null;//定义通道对象

        try {
            //创建连接工厂对象
            ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.setHost("127.0.0.1");
            connectionFactory.setPort(5672);
            connectionFactory.setUsername("guest");
            connectionFactory.setPassword("guest");
            connectionFactory.setVirtualHost("/");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服务

            connection = connectionFactory.newConnection();//获取与RabbitMQ的tcp连接

            channel = connection.createChannel();//得到连接通道,一个连接可以创建多个通道,每个通道相当于一个会话任务

            channel.queueDeclare(QUEUE_EMAIL,true,false,false,null);//声明队列

            channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);//声明交换机

            channel.queueBind(QUEUE_EMAIL,EXCHANGE_NAME,"");//绑定队列到交换机

            //定义消费消息的方法
            DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
                /**
                 * 消费者接收消息后执行该方法
                 * @param consumerTag  消费者标签,用来标识消费者的,在监听队列时(channel.basicConsume)设置
                 * @param envelope     信封,通过envelope  消息包的内容,可从中获取消息id,消息routingkey,交换机,
                 *                     消息和重传标志(收到消息失败后是否需要重新发送)
                 * @param properties   消息属性
                 * @param body         消息内容
                 * @throws IOException
                 */
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    String exchange = envelope.getExchange();
                    String routingKey = envelope.getRoutingKey();
                    long msgId = envelope.getDeliveryTag();//消息id
                    String msg = new String(body,"utf-8");
                    System.out.println(exchange+"//"+routingKey+"//"+msgId+"//"+msg);
                }
            };

            //监听队列
            /** 参数:String queue, boolean autoAck, Consumer callback
             *  1、queue 队列名称
             *  2、autoAck 自动回复,当消费者接收到消息后要告诉mq消息已接收,如果将此参数设置为tru表示会自动回复mq,如果设置为false要通过编程实现回复
             *  3、callback,消费方法,当消费者接收到消息要执行的方法
             */
            channel.basicConsume(QUEUE_EMAIL,true,defaultConsumer);

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

运行了两个消费者之后,我们可以看到控制台打印的消息,并且也可以在后台管理页面看到,队列当中的消息已经被消费了。

Publish/Subscribe工作模式的特点:生产者发送若干条消息,每条消息都转发到各个队列,每个消费者都接收到了消息。

 

2.2 publish/subscribe与work queues比较

2.2.1 区别

1)work queues不用定义交换机,而publish/subscribe需要定义交换机。

2)publish/subscribe的生产方是面向交换机发送消息,work queues的生产方是面向队列发送消息(底层使用默认交换机)。

3)publish/subscribe需要设置队列和交换机的绑定,work queues不需要设置,实质上work queues会将队列绑定到默认的交换机 。

2.2.2 共同点

两者实现的发布/订阅的效果是一样的,多个消费端监听同一个队列不会重复消费消息。

代码下载: https://download.csdn.net/download/zengdongwen/11784368

深入详解高性能消息队列中间件 RabbitMQ
dvlinker的技术专栏
11-06 1万+
深入详解高性能消息队列中间件 RabbitMQ
消息中间件RabbitMQ工作模式
麦客子
05-04 553
一、工作模式 RabbitMQ有以下几种工作模式 : 1、Work queues 2、Publish/Subscribe 3、Routing 4、Topics 5、Header 6、RPC (一)Work queues work queues与入门程序相比,多了一个消费端,两个消费端共同消费同一个队列中的消息。 应用场景:对于 任务过重或任务较多情况使用工作队列可以提高任务处理的速度。 测试: ...
消息中间件-RabbitMQ(工作模式)
qq_41882485的博客
02-15 250
Pub/Sub(订阅模式) P:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给X(交换机) C:消费者,消息的接收者,会一直等待消息到来 Queue:消息队列,接收消息、缓存消息 Exchange:交换机(X)。一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。Exchange有常见以下3种类型: Fanout:广播,将消息交给所有绑定到交换机的队列 Direct:定向,把消息交给符
01RabbitMq--消息中间件基础知识及RabbitMq五种工作模式
niannujiao6的博客
12-17 1758
消息中间件 它是一种接收数据,接收请求,发送数据,存储数据等功能的技术服务。 消息中间件利用可靠的消息传递机制进行系统和系统之间的通讯。 通过提供消息传递和消息的排队机制,它可以在分布式系统环境下扩展进程之间的通讯 消息中间件核心组成部分 消息的协议 消息的持久化机制 消息的分布策略 消息的高可用 高可靠 消息的容错机制 协议 计算机底层操作系统与应用程序通讯之间共同遵守的一组约定,只有遵守了约定,两者才能互通交流。主要目的是让客户端(Java go…)可以进行沟通和通讯,和一般的网络应用程序不同,
RabbitMQ消息中间件的五种工作模式
weixin_46582710的博客
05-06 359
消息中间件的作用 • 应用解耦 • 弹性伸缩 • 冗余存储 • 流量削峰 • 异步通信 • 数据同步 1. 简单模式 个生产者将消息交给默认的交换机(AMQP default) 交换机获取消息后交给绑定这个生产者的队列(关系是通过队列名称完成) 监听当前队列的消费者获取消息,执行消费逻辑 应用场景:短信,聊天 2. 工作模式 生产者将消息交个交换机 交换机交给绑定的队列 队列由多个消费者同时监听,只有其中一个能够获取这一条消息,形成了资源的争抢,谁的资源空闲大,争抢到的可能越大; 应用场景:抢红
分布式、中间件、消息队列的工作模式
qfzhaohan的博客
11-09 754
1. 分布式 分布式的主要特点在于负载均衡和高可用。 负载均衡,简单来说就是"把原来一个人的事情分给多个人来干"。举个例子:比如原来有工作三份工作1、工作2、工作3。非分布式的情况下是需要A一个人完成1、2、3,这3件事情;分布式的情况下,找了3个人来干活。A做工作1、B做工作2、C做工作3。这样处理事情的速度变快了,并且整体的效率也提高了。 2. 消息队列 rabbit MQ是消息队列,顾名思义,就是一个队列,满足先进先出的队列特性。举个例子:排队打饭,A、B、C三个人排队打饭,打饭的时候仍然按照
RabbitMQPublish/Subscribe发布订阅模式详解
最新发布
关注我!带你一路 "狂飙" 到底!
08-24 6473
需要说明的是,使用@RabbitListener注解监听队列消息后,一旦服务启动且监听到指定的队列中有消息存在(目前两个队列中各有一条相同的消息),对应注解的方法就会立即接收并消费队列中的消息。而测试类中发送的是User实体类对象消息,所以发生异常。按照消息服务整合实现步骤,完成消息组件的定制后,还需要编写消息发送者和消息消费者,而在基于API的方式中已经实现了消息发送者和消息消费者,并且基于配置类方式定制的消息组件名称,和之前测试用的消息发送和消息消费组件名称都是一致的,所以这里我们可以直接重复使用。
p14消息中间件MJS+RabbitMQ.doc
12-10
2. 发布/订阅(Publish/Subscribe):在发布/订阅模式下,一个生产者可以发布消息到一个主题,多个消费者可以订阅这个主题并接收到消息。这种模式适用于一对多的消息广播场景。 RabbitMQ作为AMQP协议的领导者,支持...
RabbitMQ消息中间件视频教程
05-14
它支持多种消息发布订阅模式,包括简单模式(Simple)、工作队列模式(Work Queues)、发布/订阅模式(Publish/Subscribe)、路由模式(Routing)、RPC模式(Remote Procedure Call)、Fanout模式等。RabbitMQ具有高...
消息中间件的四种投递模式对比
xingduan5153的博客
11-25 728
原文出自田守枝的技术博客:https://mp.weixin.qq.com/s?__biz=MzA5MDA5Njk0NQ==&mid=2456618900&idx=1&sn=ebbd4a2f3f8f42f71fa0925b70a9fb1e&utm_source=tuicool&utm_medium=referral 欢迎关注专栏:Jav...
消息中间件 - RabbitMQ 六种模式
DJun的博客
08-24 904
官网链接 简单模式,work模式,Publish/Subscribe发布与订阅模式,Routing路由模式,Topics主题模式,RPC远程调用模式(远程调用,不太算MQ;不作介绍); 第一、简单模式(Simple) public class SimpleProducer { String SIMPLE_QUEUE_NAME = "hello"; public static void main(String[] args) throws Exception { Conne
消息中间件RabbitMQ-1(中间件、工作模式、整合等基础)
shining曙光的博客
11-24 357
消息中间件RabbitMQ》 1. 消息中间件概述 1.1. 什么是消息中间件 MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法。 为什么使用MQ ​ 在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。 开发中消息队列通常有如下应用场景: 1、任务异步处理 将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。 2
RabbitMQ之消息发布订阅与信息持久化技术
qq_29663071的博客
09-26 322
信息发布与订阅         Rabbit的核心组件包含Queue(消息队列)和Exchanges两部分,Exchange的主要部分就是对信息进行路由,通过将消息队列绑定到Exchange上,则可以实现订阅形式的消息发布及Publish/Subscribe在这种模式下消息发布者只需要将信息发布到相应的Exchange中,而Exchange则自动将信息分发到不同的Queue当中。
RabbitMQ工作模式之Work queues和Publish/Subscribe
03-18 461
RabbitMQ有以下几种工作模式 :    1、Work queues    2、Publish/Subscribe 发布订阅模式    3、Routing    4、Topics    5、Header    ...
RabbitMQ-----发布订阅模式
weixin_46685039的博客
01-17 1405
1、声明和生产者端一样的交换机。 2、注意binding queue的时候,channel.queueBind()的第三个参数Routing key为空,即所有的消息都接收。如果这个值不为空,在exchange type为“fanout”方式下该值被忽略! 3、消息队列和交换机绑定
RabbitMQ--基础--7.3--工作模式--发布/订阅模式(fanout)
zhou920786312的博客
10-23 299
交换机类型为 fanout相对于Work queues模式多了一个交换机,此处的资源是共享的一个生产者对应多个消费者。会把所有发送到该交换机的消息路由到所有与该交换机绑定的队列中,无视 BindingKey。
消息队列 — RabbitMQ_02(workqueue_工作队列、publish/subscribe_发布订阅、routing_路由、topics_通配符、springboot整合RabbitMQ)
文泽路小男孩的博客
02-06 1150
文章目录3 工作模式3.1 Work queues3.1.1 特点3.2 Publish/Subscribe 发布订阅(不需要指定routingKey)3.2.1 特点3.2.2 代码3.2.2.1 生产者3.2.2.2 消费者3.2.3 publish/subscribe与work queues的区异同3.3 Routing 路由 (设置routingKey)3.3.1 特点3.3.2 代码3....
RabbitMQ消息中间件(四):工作模式之发布订阅模式 (Publish/subscribe
HaleyTiger的博客
12-16 940
一、生产者Module (1)pom.xml (2)生产者类 二、消费者Module (1)pom.xml (2)消费者类 三、测试 (1)先启动消费者类,消费监听生产者消息。 (2)在启动生产者类生产消息,消费者消息消息,即控制台输出: ...
RabbitMQ的六种工作模式
wei365456yin的博客
05-31 2145
RabbitMQ的六种工作模式 1.work queues 工作队列 应用场景:对于任务过重或者任务较多情况使用工作队列可以提高任务处理速度 工作模式:一个生产者,多个消费者,生产者发送多个消息 处理方式:一条消息只会被一个消费者接收,采用轮询的方式将消息平均发送给消费者,消费者在处理晚某一条消息后,才会收到一条消息 2.Publish/Subscribe 发布、订阅 应用场景:用户通知,消息推送,短信,邮件等 工作模式:每个消费者监听自己的想监听的队列,生产者将消息发送给broker,由交换机将消息
RabbitMQ工作模式
08-17
RabbitMQ是一个消息中间件,它支持多种工作模式来处理消息传递。以下是一些常见的RabbitMQ工作模式: 1. 简单模式(Simple Mode):一个生产者发送消息到一个队列,一个消费者从队列中接收和处理消息。 2. 工作...
写文章

热门文章

  • 微服务ServiceComb入门案例 37706
  • maven命令安装本地jar包到本地仓库和远程仓库 24147
  • MySQL高级(一) 12975
  • 消息中间件(三)——如何保证消息幂等性 10703
  • 消息中间件(四)——如何保证消息不丢失(可靠性传输) 10424

分类专栏

  • SpringMVC 4篇
  • Quartz 6篇
  • 面试 1篇
  • 数据结构与算法 1篇
  • CentOS7相关 1篇
  • SpringBoot Security 4篇
  • SpringBoot 17篇
  • SpringCloud2.2.0 14篇
  • MyBatis-3 5篇
  • POI 7篇
  • Spring4 5篇
  • GOF23设计模式 5篇
  • J2SE 14篇
  • OOP面向对象编程 3篇
  • 排序 2篇
  • Shiro 2篇
  • 分布式 1篇
  • Exception 2篇
  • SSM 1篇
  • 消息中间件MQ 9篇
  • java 6篇
  • maven
  • xuecheng
  • 微服务-ServiceComb
  • ServiceComb 1篇
  • JVM 3篇
  • Linux 2篇
  • MySQL 5篇
  • ORM 2篇
  • Netty 6篇
  • Oracle 2篇
  • Activiti 10篇
  • SaaS-HRM软件即服务—人力资源管理 10篇

最新评论

  • Exception异常堆栈信息转String,存数据库

    mango_233: 超棒!完美解决我的问题

  • 消息中间件(三)——如何保证消息幂等性

    Qiu-Forever: 你好 博主 消费者不重复消费 存在redis 如果redis宕机了 怎么办呢?

  • 微服务ServiceComb入门案例

    白马非马·: 您好,这个项目包能发一份吗,非常感谢,2500498086@qq.com

  • 微服务ServiceComb入门案例

    白马非马·: 您好,这个项目包能发一份吗,非常感谢,2500498086@qq.com

  • 微服务ServiceComb入门案例

    holewritle: 苦sile

最新文章

  • 01-认识intern()方法
  • 2021-01-08
  • VirtualBox5安装CentOS7_宿主机和虚拟机可以互相ping通,多个虚拟机之间也能ping通
2021年2篇
2020年66篇
2019年78篇
2018年4篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家天津展会玻璃钢雕塑设计玻璃钢动物马雕塑现货供应安徽个性化玻璃钢雕塑方法邯郸玻璃钢海豚雕塑定制徐州商场开业美陈河南玻璃钢人物泡沫雕塑厂家佛山玻璃钢抽象雕塑珠海玻璃钢卡通雕塑直销价格南京商场美陈售价动漫玻璃钢雕塑加工厂三明玻璃钢仿真水果雕塑厂家沧州玻璃钢海豚雕塑定制奉贤区拉丝玻璃钢雕塑服务介绍山西玻璃钢人物雕塑定制扬州中式玻璃钢雕塑玻璃钢鹿雕塑制作深圳节庆商场美陈哪里买东莞市玻璃钢雕塑厂家纤维玻璃钢树脂雕塑做法定西玻璃钢雕塑价格定西人物玻璃钢雕塑订做四川特色商场美陈厂家供应台湾玻璃钢佛像雕塑玉溪玻璃钢雕塑商家常德玻璃钢雕塑制作价格四川大型玻璃钢雕塑工厂泉州玻璃钢雕塑公司玻璃钢雕塑定制小熊贵州玻璃钢喷水雕塑定做商场圣诞美陈策划方案香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化