中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

寵物網(wǎng)站開發(fā)與實(shí)現(xiàn)結(jié)論西部數(shù)碼域名注冊(cè)

寵物網(wǎng)站開發(fā)與實(shí)現(xiàn)結(jié)論,西部數(shù)碼域名注冊(cè),浙江同凱建設(shè)深圳公司,北京網(wǎng)站制作長(zhǎng)沙簡(jiǎn)介 RabbitMQ是一套開源(MPL)的消息隊(duì)列服務(wù)軟件,是由LShift提供的一個(gè)Advanced Message Queuing Protocol (AMQP) 的開源實(shí)現(xiàn),由以高性能、健壯以及可伸縮性出名的Erlang寫成。所有主要的編程語(yǔ)言均有與代理接口通訊的客戶端庫(kù)…

簡(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 釋義

服務(wù)之間最常見的通信方式是直接調(diào)用彼此來(lái)通信 , 消息從一端發(fā)出后立即就可以達(dá)到另一端 , 稱為即時(shí)消息通訊 ( 同步通信 )
消息從某一端發(fā)出后 , 首先進(jìn)入一個(gè)容器進(jìn)行臨時(shí)存儲(chǔ) , 當(dāng)達(dá)到某種條件后 , 再由這個(gè)容器發(fā)送給另一端 , 稱為延遲消息通訊 ( 異步通信 )
假設(shè)我們?cè)谔詫毾铝艘还P訂單后 , 淘寶后臺(tái)需要做這些事情:
1. 消息通知系統(tǒng):通知商家 , 你有一筆新的訂單 , 請(qǐng)及時(shí)發(fā)貨
2. 推薦系統(tǒng):更新用戶畫像 , 重新給用戶推薦他可能感興趣的商品
3. 會(huì)員系統(tǒng):更新用戶的積分和等級(jí)信息
createOrder(...){//完成訂單服務(wù)doCreateOrder(...);//調(diào)用其他服務(wù)接口sendMsg(...);updateUserInterestedGoods(...);updateMemberCreditInfo(...);
}

存在問(wèn)題:

過(guò)度耦合:如果后面創(chuàng)建訂單時(shí) , 需要觸發(fā)新的動(dòng)作 , 那就得去改代碼 , 在原有的創(chuàng)建訂單函數(shù)末尾 , 再追加一行代碼
缺少緩沖:如果創(chuàng)建訂單時(shí) , 會(huì)員系統(tǒng)恰好處于非常忙碌或者宕機(jī)的狀態(tài) , 那這時(shí)更新會(huì)員信息就會(huì)失敗 , 我們需要一個(gè)地方 , 來(lái)暫時(shí)存放無(wú)法被消費(fèi)的消息

優(yōu)化方案:

我們需要一個(gè)消息中間件 , 來(lái)實(shí)現(xiàn)解耦和緩沖的功能 .

案例分析:

小紅希望小明多讀書 , 常尋找好書給小明看 , 之前的方式是這樣:小紅問(wèn)小明什么時(shí)候有空 , 把書給小明送去 , 并親眼監(jiān)督小明讀完書才走 . 久而久之 , 兩人都覺(jué)得麻煩 .
后來(lái)的方式改成了:小紅對(duì)小明說(shuō)「我放到書架上的書你都要看」 , 然后小紅每次發(fā)現(xiàn)不錯(cuò)的書都放到書架上 , 小明則看到書架上有書就拿下來(lái)看 .
書架就是一個(gè)消息隊(duì)列,小紅是生產(chǎn)者,小明是消費(fèi)者.

?帶來(lái)的好處

1. 小紅想給小明書的時(shí)候,不必問(wèn)小明什么時(shí)候有空,親手把書交給他了,小紅只把書放到書架上就行了.這樣小紅小明的時(shí)間都更自由.

2. 小紅相信小明的讀書自覺(jué)和讀書能力 , 不必親眼觀察小明的讀書過(guò)程 , 小紅只要做一個(gè)放書的動(dòng)作 , 很節(jié)省時(shí)間 .
3. 當(dāng)明天有另一個(gè)愛(ài)讀書的小伙伴小強(qiáng)加入 , 小紅仍舊只需要把書放到書架上 , 小明和小強(qiáng)從書架上取書即可
4. 書架上的書放在那里 , 小明閱讀速度快就早點(diǎn)看完 , 閱讀速度慢就晚點(diǎn)看完 , 沒(méi)關(guān)系 , 比起小紅把書遞給小明并監(jiān)督小明讀完的方式 , 小明的壓力會(huì)小一些 .
消息隊(duì)列特點(diǎn)
1. 解耦 : 每個(gè)成員不必受其他成員影響 , 可以更獨(dú)立自主 , 只通過(guò)一個(gè)簡(jiǎn)單的容器來(lái)聯(lián)系 .
2. 提速 : 小紅選只要做一個(gè)放書的動(dòng)作 , 為自己節(jié)省了大量時(shí)間 .
3. 廣播 : 小紅只需要?jiǎng)趧?dòng)一次 , 就可以讓多個(gè)小伙伴有書可讀 , 這大大地節(jié)省了她的時(shí)間 , 也讓新的小伙伴的加入成本很低 .
4. 錯(cuò)峰與流控 : 小紅給書的頻率不穩(wěn)定 , 如果今明兩天連給了五本 , 之后隔三個(gè)月才又給一本 , 那小明只要在三個(gè)月內(nèi)從書架上陸續(xù)取走五本書讀完就行了 , 壓力就不那么大了 .

?消息隊(duì)列相關(guān)

AMQP
一個(gè)提供統(tǒng)一消息服務(wù)的應(yīng)用層標(biāo)準(zhǔn)高級(jí)消息隊(duì)列協(xié)議 , 是一個(gè)通用的應(yīng)用層協(xié)議
消息發(fā)送與接受的雙方遵守這個(gè)協(xié)議可以實(shí)現(xiàn)異步通訊 . 這個(gè)協(xié)議約定了消息的格式和工作方式 .
技術(shù)選型
RabbitMQ

RabbitMQ是一個(gè)實(shí)現(xiàn)了AMQP(Advanced Message Queuing Protocol)高級(jí)消息隊(duì)列協(xié)議的消息隊(duì)列服務(wù),Erlang語(yǔ)言.

?

Server(Broker): 接收客戶端連接 , 實(shí)現(xiàn) AMQP 協(xié)議的消息隊(duì)列和路由功能的進(jìn)程 .
Virtual Host :虛擬主機(jī)的概念 , 類似權(quán)限控制組 , 一個(gè) Virtual Host 里可以有多個(gè) Exchange Queue.
Exchange: 交換機(jī) , 接收生產(chǎn)者發(fā)送的消息 , 并根據(jù) Routing Key 將消息路由到服務(wù)器中的隊(duì)列 Queue.
ExchangeType: 交換機(jī)類型決定了路由消息行為 ,RabbitMQ 中有三種類型 Exchange, 分別是 fanout 、 direct 、 topic.
Message Queue :消息隊(duì)列 , 用于存儲(chǔ)還未被消費(fèi)者消費(fèi)的消息 .
Message :由 Header body 組成 ,Header 是由生產(chǎn)者添加的各種屬性的集合 , 包括 Message 是否被持久化、優(yōu)先級(jí)是多少、由哪個(gè) Message Queue 接收等 .body 是真正需要發(fā)送的數(shù)據(jù)內(nèi)
.
BindingKey :綁定關(guān)鍵字 , 將一個(gè)特定的 Exchange 和一個(gè)特定的 Queue 綁定起來(lái) .

Docker安裝部署RabbitMQ

?拉取鏡像

docker pull rabbitmq:management
注意:獲取鏡像的時(shí)候要獲取 management 版本的 , 不要獲取 last 版本的 ,management 版本的才帶有管理界面
創(chuàng)建一個(gè)容器
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
--hostname :主機(jī)名 (RabbitMQ 的一個(gè)重要注意事項(xiàng)是它根據(jù)所謂的 節(jié)點(diǎn)名稱 存儲(chǔ)數(shù)據(jù) , 默認(rèn)為主機(jī)名 )
-e :指定環(huán)境變量 :
RABBITMQ_DEFAULT_VHOST :默認(rèn)虛擬機(jī)名
RABBITMQ_DEFAULT_USER :默認(rèn)的用戶名
RABBITMQ_DEFAULT_PASS :默認(rèn)用戶名的密碼
注:記得開放端口
firewall-cmd --zone=public --add-port=5672/tcp --add-port=15672/tcp --permanent
進(jìn)入管理后臺(tái)

創(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è)面上也有

?

http://www.risenshineclean.com/news/49702.html

相關(guān)文章:

  • 中央取消全國(guó)各地核酸檢測(cè)河北seo技術(shù)培訓(xùn)
  • 紹興網(wǎng)站建設(shè)方案托管建站模板哪個(gè)好
  • 一站式服務(wù)圖片開封seo公司
  • 手機(jī)軟件制作和做網(wǎng)站相同短視頻培訓(xùn)學(xué)校
  • wordpress 插入文章seo品牌優(yōu)化
  • 中區(qū)網(wǎng)站建設(shè)營(yíng)銷知識(shí)和技巧
  • 揭陽(yáng)網(wǎng)站開發(fā)如何查詢域名注冊(cè)人信息
  • wordpress建站給媒體分類整站快速排名
  • 電子商務(wù)網(wǎng)站開發(fā)需求文檔深圳seo公司助力網(wǎng)絡(luò)營(yíng)銷飛躍
  • 安康北京網(wǎng)站建設(shè)aso安卓?jī)?yōu)化
  • 南京網(wǎng)站建設(shè)潤(rùn)洽海外廣告投放公司
  • 松江附近做網(wǎng)站seo是什么職位
  • 南寧品牌網(wǎng)站建設(shè)公司網(wǎng)站推廣120種方法
  • wordpress數(shù)據(jù)庫(kù)大數(shù)據(jù)游戲行業(yè)seo整站優(yōu)化
  • 網(wǎng)站頂部有空白產(chǎn)品推銷
  • 東莞網(wǎng)站優(yōu)化電話域名解析查詢工具
  • 淮北做網(wǎng)站的公司有哪些怎么開網(wǎng)站平臺(tái)
  • 天津網(wǎng)絡(luò)推廣培訓(xùn)seo手機(jī)排名軟件
  • 北京市建設(shè)官方網(wǎng)站泉州seo報(bào)價(jià)
  • 上海網(wǎng)站制作公司的排名免費(fèi)seo教程分享
  • 十堰高端網(wǎng)站建設(shè)武漢seo計(jì)費(fèi)管理
  • 彩票網(wǎng)站里的統(tǒng)計(jì)怎么做太原seo建站
  • 怎么免費(fèi)制作網(wǎng)站平臺(tái)銷售人員培訓(xùn)課程有哪些
  • 怎么在word添加wordpress長(zhǎng)沙seo網(wǎng)絡(luò)公司
  • 北京高端網(wǎng)站定制公司哪家好關(guān)鍵詞排名優(yōu)化技巧
  • 網(wǎng)站建設(shè)的軟件平臺(tái)如何做seo搜索引擎優(yōu)化
  • 樂(lè)清柳市網(wǎng)站建設(shè)公司百度網(wǎng)站名稱及網(wǎng)址
  • 出國(guó)游做的好的網(wǎng)站搜百度盤
  • 佛山模板網(wǎng)站建站網(wǎng)站推廣哪家好
  • 新聞網(wǎng)站策劃方案軟文推廣案例