SpringBoot使用RabbitMQ做訊息中介軟體
阿新 • • 發佈:2019-01-29
說明
MQ全稱為Message Queue, 訊息佇列(MQ)是一種應用程式對應用程式的通訊方法。應用程式通過讀寫出入佇列的訊息(針對應用程式的資料)來通訊,而無需專用連線來連結它們。訊息傳遞指的是程式之間通過在訊息中傳送資料進行通訊,而不是通過直接呼叫彼此來通訊,直接呼叫通常是用於諸如遠端過程呼叫的技術。排隊指的是應用程式通過 佇列來通訊。佇列的使用除去了接收和傳送應用程式同時執行的要求。MQ是消費-生產者模型的一個典型的代表,一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取或者訂閱佇列中的訊息。MQ和JMS類似,但不同的是JMS是SUN JAVA訊息中介軟體服務的一個標準和API定義,而MQ則是遵循了AMQP協議的具體實現和產品。
RabbitMQ是一個在AMQP(高階訊息佇列協議)基礎上完成的,可複用的企業訊息系統。他遵循Mozilla Public License開源協議。作用:在專案中,將一些無需即時返回且耗時的操作提取出來,進行了非同步處理,而這種非同步處理的方式大大的節省了伺服器的請求響應時間,從而提高了系統的吞吐量
安裝
環境:CentOS 7.2
1 安裝Erlang
-y引數表示忽略回答安裝yes的過程yum install -y erlang
2 安裝RabbitMQ
切換到根目錄,然後下載(這裡演示下載3.6.6版,可在官網找不同版本的rpm的連結,戳->點選開啟連結)下載完成後安裝cd /root/ wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el7.noarch.rpm
yum install rabbitmq-server-3.6.6-1.el7.noarch.rpm
建立rabbitmq.config檔案cd /etc/rabbitmq/
vi rabbitmq.config
輸入:(注意最後一行有一個'.'號)[{rabbit, [{loopback_users, []}]}].
這裡的意思是開放使用,rabbitmq預設建立的使用者guest,密碼也是guest,這個使用者預設只能是本機訪問,localhost或者127.0.0.1,從外部訪問需要新增上面的配置。啟動
service rabbitmq-server start
檢視狀態開啟管理UI:預設賬戶是guest,密碼是guest,訪問埠:15672service rabbitmq-server status
rabbitmq-plugins enable rabbitmq_management
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload
也可以直接使用命令列新增使用者:rabbitmqctl add_user yunlingfly yunlingfly //新增使用者,後面兩個引數分別是使用者名稱和密碼
rabbitmqctl set_permissions -p / yunlingfly ".*" ".*" ".*" //新增許可權
rabbitmqctl set_user_tags yunlingfly administrator //修改使用者角色
注:如果出現FirewallD is not running的問題則是防火牆沒有開啟,使用如下命令:systemctl start firewalld
systemctl status firewalld
然後就可以遠端訪問了,然後可直接配置使用者許可權等資訊。 登入:http://ip:15672,輸入使用者名稱guest密碼guest或者是我配置的yunlingfly密碼yunlingfly,見到下面的圖說明配置正確,可以進行下一步操作了
注意事項:需要開啟伺服器相應的埠號,然後新增進防火牆,否則外網無法訪問
附RabbitMQ常用操作命令:開啟:
service rabbitmq-server strat
關閉:service rabbitmq-server stop
重啟:
service rabbitmq-server restart
檢視狀態:
service rabbitmq-server status
開機自啟:
chkconfig rabbitmq-server on
新增使用者:
rabbitmqctl add_user username password //新增使用者,後面兩個引數分別是使用者名稱和密碼
rabbitmqctl set_permissions -p / username ".*" ".*" ".*" //新增許可權
rabbitmqctl set_user_tags username administrator //修改使用者角色
使用SpringBoot整合
環境:IDEA2017,jdk1.8,SpringBoot1.5.10.RELEASE
說明:一般來說訊息傳送者和訊息接收者不是同一個,為了演示方便將二者放在了一個專案下,但是可以發現二者沒有耦合,隨時可以分開成兩個專案
首先給出專案結構:
1 配置pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>yunlingfly</groupId>
<artifactId>springcloud-rabbitmq</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springcloud-rabbitmq</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2 編寫啟動類
package yunlingfly.springcloudrabbitmq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringcloudRabbitmqApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudRabbitmqApplication.class, args);
}
}
3 配置檔案application.yml
spring:
application:
name: rabbitMQ
rabbitmq:
#配置連線IP地址,本機安裝的RabbitMQ的話可以用localhost
host: xxx.xxx.xxx.xxx
#這裡配置的是RabbitMQ的連線埠,是5672哦不是15672
port: 5672
username: yunlingfly
password: yunlingfly
server:
#這裡配置的是該專案的啟動埠
port: 8765
info:
app:
name: RabbitMQ測試連線
version: 0.0.1
4 編寫訊息傳送者
package yunlingfly.springcloudrabbitmq.mqsender;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class Sender1 {
/**
* 注入AmqpTemplate,然後利用AmqpTemplate向一個名為hello的訊息佇列中傳送訊息。
*/
@Autowired
private AmqpTemplate rabbitTemplate;
public void send(){
String msg="hello rabbitMQ:"+new Date()+" 你好,高階訊息佇列使用ing~";
System.out.println("單對單傳送引數。Sender發出了訊息:"+msg);
this.rabbitTemplate.convertAndSend("hello",msg);
// 第一個引數表示交換機,第二個引數表示routing key,第三個引數即訊息,Topic方式
// this.rabbitTemplate.convertAndSend("topicExchange","key.da",msg);
}
}
5 編寫佇列
package yunlingfly.springcloudrabbitmq.mqqueue;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
@Bean
public Queue helloQueue(){
return new Queue("hello");
}
}
6 編寫訊息接收者package yunlingfly.springcloudrabbitmq.mqreceiver;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@RabbitListener(queues = "hello")
public class Receiver1 {
@RabbitHandler
public void process(String msg){
System.out.println("Receiver收到了訊息:"+msg);
}
}
7 編寫控制層package yunlingfly.springcloudrabbitmq.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import yunlingfly.springcloudrabbitmq.mqsender.Sender1;
@RestController
public class RabbitMQController {
@Autowired
private Sender1 sender;
@RequestMapping(value = "/helloRabbit",method = RequestMethod.GET)
public String sendMQ(){
System.out.println("準備傳送訊息。。。");
sender.send();
return "success";
}
}
8 執行
[INFO]Created new connection: rabbitConnectionFactory表示連線成功
9 外網訪問輸入:http://localhost:8765/helloRabbit
看到控制檯輸出:檢視RabbitMQ可以看到有了一個hello queue
附:可以在官網找到更多用法和例子,戳->點選開啟連結