1. 程式人生 > >SpringBoot使用RabbitMQ做訊息中介軟體

SpringBoot使用RabbitMQ做訊息中介軟體

說明

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
檢視狀態
service rabbitmq-server status
開啟管理UI:預設賬戶是guest,密碼是guest,訪問埠:15672
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

附:可以在官網找到更多用法和例子,戳->點選開啟連結