spring boot中使用rabbitMq        使用到的: spring boot,rabbitMq,redis,dubbo

创建分布式项目,项目截图:

spring boot中使用rabbitMq

sms:父工程

smsbaseconfig:注册rabbitMq的配置模块,所有的配置都写在这个模块中

smsconsumer:消费者,war包,提供api给前端调用的,是dubbo的消费者

smsprovider:提供者,war包,提供rpc远程接口,是dubbo的提供者,处理接收到消息的逻辑

 

sms的依赖:

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.hf</groupId>
    <artifactId>sms</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sms</name>
    <description>Demo project for Spring Boot</description>

    <modules>
        <module>smsconsumer</module>
        <module>smsprovider</module>
        <module>smsbaseconfig</module>
    </modules>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--消息队列依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

        <!--dubbo start-->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
        <!--dubbo end-->
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

smsprovinconsumer的依赖:

<?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>
    <parent>
        <artifactId>sms</artifactId>
        <groupId>com.hf</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.hf</groupId>
    <artifactId>smsconsumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>smsconsumer</name>
    <description>消费者</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Swagger依赖 start-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.6.1</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.6.1</version>
        </dependency>
        <!-- Swagger依赖 end-->
        <dependency>
            <groupId>com.hf</groupId>
            <artifactId>smsprovider</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.hf</groupId>
            <artifactId>smsbaseconfig</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

对应的application.yml的配置:

dubbo:
  application:
    name: my_consumer
  protocol:
    port: 20880
    name: dubbo
  provider:
    timeout:  60000
    retries:  0
  registry:
    address: zookeeper://127.0.01:2181
server:
  port: 9090

启动类:

package com.hf.smsconsumer;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDubbo
public class SmsconsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SmsconsumerApplication.class, args);
    }

}

smsbaseconfig的依赖:

<?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>
    <parent>
        <artifactId>sms</artifactId>
        <groupId>com.hf</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.hf</groupId>
    <artifactId>smsbaseconfig</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>smsbaseconfig</name>
    <description>这个模块专门用来启动rabbitMq的配置文件</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>
</project>

application.yml的配置: 没有配置,是jar包,只是注册一些bean到 ioc

 

smsprovider的依赖:

<?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>
    <parent>
       <artifactId>sms</artifactId>
        <groupId>com.hf</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.hf</groupId>
    <artifactId>smsprovider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>smsprovider</name>
    <description>提供者</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>com.hf</groupId>
            <artifactId>smsbaseconfig</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

application.yml的配置:

redis:
  host: 127.0.0.1
  port: 6379
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
spring:
  driver-class-name:  com.mysql.cj.jdbc.Driver
  url: jdbc:mysql://127.0.0.1:3306/mytest
  username: root
  password: root
dubbo:
  application:
    name: my_provider
  protocol:
    port: 20880
    name: dubbo
  provider:
    timeout:  60000
    retries:  0
  registry:
    address: zookeeper://127.0.0.1:2181
server:
  port: 9091

启动类:

package com.hf.smsprovider;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDubbo
public class SmsproviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(SmsproviderApplication.class, args);
    }

}

以上就是基本搭建完成的dubbo分布式架构,下面开始贴出具体代码:

 

smsbaseconfig模块:

spring boot中使用rabbitMq

rabbitMq队列的配置:

package com.hf.smsbaseconfig.config;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Description:
 * @Date: 2019/4/12
 * @Auther: 
 */
@Configuration
public class RabbitMqConfig {
    /**
     * 声明短信队列
     */
    @Bean
    public Queue smsQueue(){
        return new Queue("sms");
    }
}

smsprovider模块:

spring boot中使用rabbitMq

监听队列,也就是上面声明的sms队列,监听类为SmsListener:

package com.hf.smsprovider.rabbitmq;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @Description:  监听rabbitMq消息,专门针对本模块获取rabbitMq的消息
 * @Date: 2019/4/12
 * @Auther: 
 */
@Component
@RabbitListener(queues = "sms")
public class SmsListener {

    /**
     * 一旦有消息,将会自动执行这个方法的
     * 处理接收到的消息逻辑
     * @param msgMap
     */
    @RabbitHandler
    public void sendSms(Map<String,String> msgMap){
        System.out.println("手机号:"+msgMap.get("mobile"));
        System.out.println("验证码:"+msgMap.get("code"));
        System.out.println("处理收到的消息逻辑");
    }

}

生成短信内容,并放入rabbitMq中,一旦监听到消息,将自动执行上面的方法,完成逻辑

package com.hf.smsprovider.service;

/**
 * @Description:
 * @Date: 2019/4/12
 * @Auther:
public interface UserService {
     void sendMsg(String mobile);
}

实现类的逻辑:

package com.hf.smsprovider.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.hf.smsprovider.service.UserService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.Assert;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * @Description:
 * @Date: 2019/4/12
 * @Auther: 
 */
@Service(interfaceClass = UserService.class)
public class UserServiceImpl implements UserService {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Override
    public void sendMsg(String mobile){
        Assert.notNull(mobile,"mobile cannot be null...");
        //1.生成6位短信验证码
        Random random=new Random();
        int max=999999;
        int min=100000;
        int code = random.nextInt(max);
        if(code<min){
            code=code+min;
        }
        System.out.println(mobile+"收到验证码是:"+code);
        //2.将验证码放入redis
        redisTemplate.opsForValue().set("smscode_"+mobile, code+"");
        //3.将验证码和手机号发动到rabbitMQ中
        Map<String,String> map=new HashMap();
        map.put("mobile",mobile);
        map.put("code",code+"");
        rabbitTemplate.convertAndSend("sms",map);
    }
}

smsconsumer模块:

spring boot中使用rabbitMq

配置swagger:

package com.hf.smsconsumer.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * 启用swaggerapi
 */
@Configuration
@EnableSwagger2
public class Swagger2 {
    /**
     * basePackage可以指定生成api的包,指定的包下面的controller类中的requestMapping方法会生成api解释
     * @return
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.hf.smsconsumer.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring Boot中使用Swagger2构建RESTful APIs")
                .description("更多Spring Boot相关文章请关注:http://www.baidu.com/")
                .termsOfServiceUrl("http://www.baidu.com/")
                .contact("wm yu")
                .version("1.0")
                .build();
    }
}

提供给对外的controller接口:

package com.hf.smsconsumer.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.hf.smsprovider.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description:
 * @Date: 2019/4/12
 * @Auther: 
 */
@RestController
@Api(value = "用户信息", description = "用户信息")
public class UserController {
    @Reference
    private UserService userService;

    @GetMapping(value="/sendsms/{mobile}")
    @ApiOperation("消息发送")
    public String sendMsg(@PathVariable String mobile){
        userService.sendMsg(mobile);
        return "send success!";
    }
}

好了,项目搭建完成了,下面我们开始测试:

首先启动smsprovinder项目和smsconsumer项目:  注意啊,启动之前一定要先启动zookeeper啊,和启动RabbitMq啊

访问swagger页面:  地址为:   http://localhost:9090/swagger-ui.html

访问方法:控制台输出如下的信息:

spring boot中使用rabbitMq

说明正确的收到了消息,并且执行了逻辑

 

 

 

相关文章: