日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

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

Spring Boot与消息

發(fā)布時(shí)間:2025/4/16 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot与消息 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先我們結(jié)合3個(gè)例子來(lái)說(shuō)說(shuō)消息在實(shí)際中的應(yīng)用,以建立起消息的概念:

1.異步處理:


用戶在注冊(cè)的時(shí)候,我們需要給用戶發(fā)送注冊(cè)郵件和注冊(cè)短信,如果使用串行處理,就會(huì)耗費(fèi)比較長(zhǎng)的時(shí)間,如果我們使用異步處理的話,就可以節(jié)約一些時(shí)間,如果使用消息隊(duì)列,又可以進(jìn)一步減少這些時(shí)間。

2.應(yīng)用解耦:


這個(gè)比較好理解,比如不同的系統(tǒng)之間使用消息隊(duì)列來(lái)解耦合,這樣就可以不用調(diào)用對(duì)方接口,減少耦合關(guān)系。

3.流量削峰:


比如我們有一個(gè)秒殺的業(yè)務(wù),如果每個(gè)用戶在秒殺的時(shí)候直接和系統(tǒng)打交道,這么大的用戶量,可能會(huì)導(dǎo)致系統(tǒng)卡死。這個(gè)時(shí)候我們可以使用消息隊(duì)列,比如只有100個(gè)商品,那么就把消息隊(duì)列大小設(shè)置為100,用戶請(qǐng)求直接放到消息隊(duì)列中,如果消息隊(duì)列滿了,我們就返回用戶秒殺失敗的信息,之后秒殺業(yè)務(wù)再?gòu)南㈥?duì)列中慢慢取數(shù)據(jù)處理。

消息服務(wù)中兩個(gè)重要概念:消息代理(message broker)和目的地(destination),當(dāng)消息發(fā)送者發(fā)送消息以后,將由消息代理接管,消息代理保證消息傳遞到指定目的地。消息隊(duì)列主要有兩種形式的目的地:

  • 使用隊(duì)列(queue):點(diǎn)對(duì)點(diǎn)消息通信(point-to-point),消息發(fā)送者發(fā)送消息,消息代理將其放入一個(gè)隊(duì)列中,消息接收者從隊(duì)列中獲取消息內(nèi)容,消息讀取后被移出隊(duì)列。消息只有唯一的發(fā)送者和接受者,但并不是說(shuō)只能有一個(gè)接收者,比如A發(fā)送了一個(gè)消息,接收者只能是B,C,D中的一個(gè)。
  • 使用主題(topic):發(fā)布(publish)/訂閱(subscribe)消息通信,發(fā)送者(發(fā)布者)發(fā)送消息到主題,多個(gè)接收者(訂閱者)監(jiān)聽(tīng)(訂閱)這個(gè)主題,那么就會(huì)在消息到達(dá)時(shí)同時(shí)收到消息。
  • 消息代理規(guī)范有兩種:

    • JMS(Java Message Service)JAVA消息服務(wù):基于JVM消息代理的規(guī)范。ActiveMQ、HornetMQ是JMS實(shí)現(xiàn)。
    • AMQP(Advanced Message Queuing Protocol),高級(jí)消息隊(duì)列協(xié)議,也是一個(gè)消息代理的規(guī)范,兼容JMS,RabbitMQ是AMQP的實(shí)現(xiàn)

    兩者具體差別如下:

    Spring Boot對(duì)兩種實(shí)現(xiàn)標(biāo)準(zhǔn)都做了支持,只需要導(dǎo)入相關(guān)的starter即可,如spring-boot-starter-amqp。

    RabbitMQ簡(jiǎn)介:

    RabbitMQ是一個(gè)由erlang開(kāi)發(fā)的AMQP(Advanved Message Queue Protocol)的開(kāi)源實(shí)現(xiàn)。

    核心概念

    • Message
      消息,消息是不具名的,它由消息頭和消息體組成。消息體是不透明的,而消息頭則由一系列的可選屬性組成,這些屬性包括routing-key(路由鍵)、priority(相對(duì)于其他消息的優(yōu)先權(quán))、delivery-mode(指出該消息可能需要持久性存儲(chǔ))等。

    • Publisher
      消息的生產(chǎn)者,也是一個(gè)向交換器發(fā)布消息的客戶端應(yīng)用程序。

    • Exchange
      交換器,用來(lái)接收生產(chǎn)者發(fā)送的消息并將這些消息路由給服務(wù)器中的隊(duì)列。

    • Queue
      消息隊(duì)列,用來(lái)保存消息直到發(fā)送給消費(fèi)者。它是消息的容器,也是消息的終點(diǎn)。一個(gè)消息可投入一個(gè)或多個(gè)隊(duì)列。消息一直在隊(duì)列里面,等待消費(fèi)者連接到這個(gè)隊(duì)列將其取走。

    • Binding
      綁定,用于消息隊(duì)列和交換器之間的關(guān)聯(lián)。一個(gè)綁定就是基于路由鍵將交換器和消息隊(duì)列連接起來(lái)的路由規(guī)則,所以可以將交換器理解成一個(gè)由綁定構(gòu)成的路由表。Exchange 和Queue的綁定可以是多對(duì)多的關(guān)系。

    • Connection
      網(wǎng)絡(luò)連接,比如一個(gè)TCP連接。

    • Channel
      信道,多路復(fù)用連接中的一條獨(dú)立的雙向數(shù)據(jù)流通道。信道是建立在真實(shí)的TCP連接內(nèi)的虛擬連接,AMQP 命令都是通過(guò)信道發(fā)出去的,不管是發(fā)布消息、訂閱隊(duì)列還是接收消息,這些動(dòng)作都是通過(guò)信道完成。因?yàn)閷?duì)于操作系統(tǒng)來(lái)說(shuō)建立和銷毀TCP 都是非常昂貴的開(kāi)銷,所以引入了信道的概念,以復(fù)用一條TCP 連接。

    • Consumer
      消息的消費(fèi)者,表示一個(gè)從消息隊(duì)列中取得消息的客戶端應(yīng)用程序。

    • Virtual Host
      虛擬主機(jī),表示一批交換器、消息隊(duì)列和相關(guān)對(duì)象。虛擬主機(jī)是共享相同的身份認(rèn)證和加密環(huán)境的獨(dú)立服務(wù)器域。每個(gè)vhost 本質(zhì)上就是一個(gè)mini 版的RabbitMQ 服務(wù)器,擁有自己的隊(duì)列、交換器、綁定和權(quán)限機(jī)制。vhost 是AMQP 概念的基礎(chǔ),必須在連接時(shí)指定,RabbitMQ 默認(rèn)的vhost 是/ 。

    • Broker
      表示消息隊(duì)列服務(wù)器實(shí)體

    他們之間的關(guān)系如下所示:

    RabbitMQ運(yùn)行機(jī)制如下:

    AMQP 中消息的路由過(guò)程和Java 開(kāi)發(fā)者熟悉的JMS 存在一些差別,AMQP 中增加了Exchange和Binding的角色。生產(chǎn)者把消息發(fā)布到Exchange 上,消息最終到達(dá)隊(duì)列并被消費(fèi)者接收,而B(niǎo)inding 決定交換器的消息應(yīng)該發(fā)送到那個(gè)隊(duì)列。

    Exchange分發(fā)消息時(shí)根據(jù)類型的不同分發(fā)策略有區(qū)別,目前共四種類型:direct、fanout、topic、headers 。headers 匹配AMQP 消息的header 而不是路由鍵,headers 交換器和direct 交換器完全一致,但性能差很多,目前幾乎用不到了,所以直接看另外三種類型:

    • direct類型:

    消息中的路由鍵(routing key)如果和Binding 中的binding key 一致,交換器就將消息發(fā)到對(duì)應(yīng)的隊(duì)列中。路由鍵與隊(duì)列名完全匹配,如果一個(gè)隊(duì)列綁定到交換機(jī)要求路由鍵為“dog”,則只轉(zhuǎn)發(fā)routing key 標(biāo)記為“dog”的消息,不會(huì)轉(zhuǎn)發(fā)“dog.puppy”,也不會(huì)轉(zhuǎn)發(fā)“dog.guard”等等。它是完全匹配、單播的模式。

    • fanout類型:

    每個(gè)發(fā)到fanout 類型交換器的消息都會(huì)分到所有綁定的隊(duì)列上去。fanout 交換器不處理路由鍵,只是簡(jiǎn)單的將隊(duì)列綁定到交換器上,每個(gè)發(fā)送到交換器的消息都會(huì)被轉(zhuǎn)發(fā)到與該交換器綁定的所有隊(duì)列上。很像子網(wǎng)廣播,每臺(tái)子網(wǎng)內(nèi)的主機(jī)都獲得了一份復(fù)制的消息。fanout 類型轉(zhuǎn)發(fā)消息是最快的。

    • topic類型:

    topic 交換器通過(guò)模式匹配分配消息的路由鍵屬性,將路由鍵和某個(gè)模式進(jìn)行匹配,此時(shí)隊(duì)列需要綁定到一個(gè)模式上。它將路由鍵和綁定鍵的字符串切分成單詞,這些單詞之間用點(diǎn)隔開(kāi)。它同樣也會(huì)識(shí)別兩個(gè)通配符:符號(hào)“#”和符號(hào)“*”。#匹配0個(gè)或多個(gè)單詞,*匹配一個(gè)單詞。類似有選擇的廣播。


    接下來(lái)我們?cè)赟pring Boot工程中使用rabbitmq,首先你需要拉取docker鏡像,并運(yùn)行這個(gè)鏡像。

    之后在工程中引入amqp:

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

    IDEA中使用Ctrl+N查找到RabbitAutoConfiguration類,可以看到它是使用RabbitProperties來(lái)封裝了RabbitMQ配置,如果需要自己配置,我們直接在配置文件中寫spring.rabbitmq.xxx即可,如:

    spring.rabbitmq.host=192.168.0.1 spring.rabbitmq.username=guest spring.rabbitmq.password=guest

    此外RabbitAutoConfiguration類還給我們注冊(cè)了RabbitTemplate來(lái)方便我們發(fā)送和接收消息。使用的時(shí)候自動(dòng)注入即可。更多的關(guān)于rabbitmq的操作,可以查看相關(guān)資料,這里就不一一講解了。

    總結(jié)

    以上是生活随笔為你收集整理的Spring Boot与消息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。