如题,我们要使用Spring Boot和RabbitMQ实现RPC远程调用,那么首先要了解RPC。RPC,即Remote Procedure Call Protocol 远程过程调用协议,在大型的公司,系统一般都是由大大小小的服务构成,不同的团队维护不同的代码,部署在不同的机器。但是在做开发时候往往要用到其它团队的方法,因为已经有了实现。但是这些服务部署不同的机器上,想要调用就需要网络通信,这些代码繁琐且复杂,一不小心就会写的很低效。RPC协议定义了规划,其它的公司都给出了不同的实现。而现在我们不使用其他公司的实现,直接使用消息中间件RabbitMQ进行实现。       现在有这样的一个业务场景,在一个商城系统中,用户在订单微服务中购买商品成功之后会给用户相应的积分,而积分系统是另外一个微服务,两个微服务之间的调用之前是使用ribbon+eureka+feign进行调用的,现在我们使用这样的逻辑,将它改造成使用RabbitMQ进行RPC调用:

1.创建工程
创建两个微服务工程order和integral,引入相同的依赖:

[XML] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
    <!-- 管理依赖 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.M7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- SpringBoot整合RabbitMQ客户端 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>


2.工程配置文件
在order微服务中创建配置文件application.yml:

[XML] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
server:
  port: 8010
spring:
  application:
    name: app-member
####  RabbitMq配置
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest


在 积分微服务integral中添加配置文件:

[XML] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
server:
  port: 8090
serviceId
spring:
  application:
    name: app-member
####  RabbitMq配置
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    listener:
      simple:
        retry:
          max-attempts: 3
          enabled: true


3.创建消息生产者和消费消息的监听者
在订单微服务order中创建消息生产者:

[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
@RestController
public class QueenSender {
    @Autowired
    private AmqpTemplate rabbiTemplate;
    /**
     *
     * @Title: sendMesage  
     * @Description: TODO发送消息
     * @param: @param message     
     * @return: void     
     * @throws
     */
    @RequestMapping("/testMq")
    public void sendMesage(String message) {
         
        System.out.println("购物成功,向积分系统发送消息:"+message+",添加积分");
        rabbiTemplate.convertAndSend("testExchange","testRabbitKey",message);
    }
 
}


创建启动类:

[Java] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
@SpringBootApplication
public class RabbitProviderApp {
 
    public static void main(String[] args) {
        SpringApplication.run(RabbitProviderApp.class, args);
    }
 
}

    

在积分微服务中创建消息监听者:

[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
@Component
public class RabbitMqListener {
 
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "hello", durable = "true"),
            exchange = @Exchange(value = "testExchange", type = "topic", durable = "true"),
            key = "testRabbitKey"))
    public void receiveMessage(String message) {
            System.out.println("这里是积分微服务,接收到消息:"+message);
    }
 
}


注意:使用@RabbitListener监听指定队列、指定exchange、指定routingKey的消息,同时@RabbitListener有建立队列、exchange、routingKey的功能
创建启动类:

[Java] 纯文本查看 复制代码
1
2
3
4
5
6
7
@SpringBootApplication
public class RabbitMQApp {
    public static void main(String[] args) {
        SpringApplication.run(RabbitMQApp.class, args);
    }
 
}


4.测试
先启动积分微服务,再启动订单微服务,在浏览器中输入http://localhost:8010/testMq?message=123,发现订单微服务控制台输出:
购物成功,向积分系统发送消息:123,添加积分
而在积分微服务的控制台输出:
这里是积分微服务,接收到消息:123
测试成功。

更多Java学习资料可关注:gzitcast