寵物網(wǎng)站開發(fā)與實(shí)現(xiàn)結(jié)論西部數(shù)碼域名注冊(cè)
簡(jiǎn)介
RabbitMQ是一套開源(MPL)的消息隊(duì)列服務(wù)軟件,是由LShift提供的一個(gè)Advanced Message Queuing Protocol (AMQP) 的開源實(shí)現(xiàn),由以高性能、健壯以及可伸縮性出名的Erlang寫成。所有主要的編程語(yǔ)言均有與代理接口通訊的客戶端庫(kù)。RabbitMQ由Rabbit科技有限公司開發(fā),并提供對(duì)其的支持。起初,Rabbit科技是LSHIFT和CohesiveFT在2007年成立的合資企業(yè),2010年4月被VMware旗下的SpringSource收購(gòu)。RabbitMQ在2013年5月成為GoPivotal的一部分。
AMQP:高級(jí)消息隊(duì)列協(xié)議,是應(yīng)用層協(xié)議的一個(gè)開放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計(jì)。?消息中間件主要用于組件之間的解耦,消息的發(fā)送者無(wú)需知道消息使用者的存在,反之亦然。?AMQP的主要特征是面向消息、隊(duì)列、路由(包括點(diǎn)對(duì)點(diǎn)和發(fā)布/訂閱)、可靠性、安全。RabbitMQ是一個(gè)開源的AMQP實(shí)現(xiàn),服務(wù)端用erlang語(yǔ)言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS,支持AJAX等。用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,在易用性、擴(kuò)展性、高可用性等方面表現(xiàn)較好。
特性
1、可靠性(Reliability)
rabbitmq使用一些機(jī)制來(lái)保證可靠性,如持久化、傳輸確認(rèn)、發(fā)布確認(rèn)。
2、靈活的路由(Flexible Routing)
在消息進(jìn)入隊(duì)列之前,是通過(guò)Exchange來(lái)路由信息的。對(duì)于典型的路由功能,rabbitmq已經(jīng)提供了一些內(nèi)置的Exchange來(lái)實(shí)現(xiàn)。針對(duì)更復(fù)雜的路由功能,可以將多個(gè)Exchange綁定在一起,也可以通過(guò)插件機(jī)制實(shí)現(xiàn)自己的Exchange。
3、消息集群(Clustering)
多個(gè)RabbitMQ服務(wù)器可以組成一個(gè)集群,形成一個(gè)邏輯Broker(服務(wù))。
4、高可用(Highly Available)
隊(duì)列可以在集群中的機(jī)器上進(jìn)行鏡像,使得在部分節(jié)點(diǎn)出問(wèn)題的情況下隊(duì)列仍然可用,也就是具有可伸縮性。
5、多種協(xié)議(Multi-protocol)
rabbitmq支持多種消息隊(duì)列協(xié)議,如STOMP、MQIT等。
6、多語(yǔ)言客戶端(Many Clients)
rabbitmq幾乎支持所有的常用語(yǔ)言,如Java、.net、Ruby、Python等。
7、管理界面(Mangement UI)
rabbitmq提供了一個(gè)易用的用戶界面,使得用戶可以監(jiān)控和管理消息Broker的許多方面。
8、跟蹤機(jī)制(Tracing)
如果消息異常,rabbitmq提供了消息跟蹤機(jī)制,使用者可以找出發(fā)生了什么。
9、插件機(jī)制(Plugin System)
rabbitmq提供了許多插件來(lái)從多方面進(jìn)行擴(kuò)展,使用者也可以編寫自己的插件。
消息隊(duì)列?
Message queue 釋義
createOrder(...){//完成訂單服務(wù)doCreateOrder(...);//調(diào)用其他服務(wù)接口sendMsg(...);updateUserInterestedGoods(...);updateMemberCreditInfo(...);
}
存在問(wèn)題:
優(yōu)化方案:
案例分析:
?帶來(lái)的好處
1. 小紅想給小明書的時(shí)候,不必問(wèn)小明什么時(shí)候有空,親手把書交給他了,小紅只把書放到書架上就行了.這樣小紅小明的時(shí)間都更自由.
?消息隊(duì)列相關(guān)
AMQP
技術(shù)選型

RabbitMQ
RabbitMQ是一個(gè)實(shí)現(xiàn)了AMQP(Advanced Message Queuing Protocol)高級(jí)消息隊(duì)列協(xié)議的消息隊(duì)列服務(wù),用Erlang語(yǔ)言.
?
Docker安裝部署RabbitMQ
?拉取鏡像
docker pull rabbitmq:management
docker run -itd \
--name my-rabbitmq \
-p 5672:5672 -p 15672:15672 \
--hostname my-rabbitmq-host \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \rabbitmq:management
firewall-cmd --zone=public --add-port=5672/tcp --add-port=15672/tcp --permanent

創(chuàng)建一個(gè)用戶賦予權(quán)限
賦予訪問(wèn)虛擬機(jī)的權(quán)限
spring連接配置?
準(zhǔn)備工作
先搭建一個(gè)空項(xiàng)目作為我們的父項(xiàng)目,再創(chuàng)建兩個(gè)子項(xiàng)目,分別為生產(chǎn)者和消費(fèi)者,并且勾選我們所需要的依賴
修改yml配置文件
生產(chǎn)者:
server:port: 8888
spring:rabbitmq:host: 192.168.169.131password: 123456port: 5672username: springvirtual-host: my_vhost
消費(fèi)者;
?
server:port: 9999
spring:rabbitmq:host: 192.168.169.131password: 123456port: 5672username: springvirtual-host: my_vhost
在生產(chǎn)者編寫一個(gè)config類
package com.example.publisher;import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@SuppressWarnings("all")
public class RabbitConfig{@Beanpublic Queue firstQueue(){return new Queue("firstQueue");}@Beanpublic Queue secondQueue(){return new Queue("secondQueue");}
}
再編寫一個(gè)控制類
package com.example.publisher;import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@SuppressWarnings("all")
public class TestController {@Autowiredprivate AmqpTemplate template;@Autowiredprivate ObjectMapper objectMapper;@RequestMapping("/send1")public String send1(){template.convertAndSend("firstQueue","hello world");return "😒";}@RequestMapping("/send2")public String send2 () throws Exception{User yhx=new User("yhx","520");String json = objectMapper.writeValueAsString(yhx);template.convertAndSend("secondQueue",yhx);return "😒";}
}
然后在消費(fèi)者編寫一個(gè)Receiver
package com.example.consumer;import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues="firstQueue")
public class Receiver {@Autowiredprivate ObjectMapper objectMapper;@RabbitHandlerpublic void process(String json) throws Exception{Object user = objectMapper.readValue(json, User.class);log.warn("接收到:" + user);}
}
再編寫一個(gè)User完成自定義數(shù)據(jù)發(fā)送
package com.example.publisher;import lombok.*;import java.io.Serializable;@SuppressWarnings("all")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {private String username;private String userpwd;
}
在網(wǎng)頁(yè)上訪問(wèn)一下
我們可以發(fā)現(xiàn)RabbitMQ管理頁(yè)面上也有
?