1、RabbitMQ概述
1、官方解释
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境。
2、个人理解
1、应用场景
同步请求过程中当遇到大规模并发时由于遇到DB吞吐瓶颈或遇到模块负载过高时,此时将会产生系统响应阻塞影响用户体验。 使用消息队列后当遇到大规模并发时直接判断库存是否足够后直接反馈成功失败信息,将耗时的DB读写操作放入消息队列中,由RabbitMQ下发消息给消息消费者异步处理。这样就避开耗时的DB操作给与用户及时的信息反馈增加用户体验。2、疑惑点
RabbitMQ 就是一个高并发消息队列,当看到消息队列的时候就想到了redis也能实现消息队列呀,参考了一些其他博客发现这两者还是有些区别的。
3、简单使用
1、使用docker-compose 安装RabbitMQ
version: '3.1'services: rabbitmq: restart: always image: rabbitmq:management container_name: rabbitmq ports: #服务端口 - 5672:5672 #web页端口 - 15672:15672 environment: RABBITMQ_DEFAULT_USER: rabbit RABBITMQ_DEFAULT_PASS: 123456 volumes: - ./data:/var/lib/rabbitmq复制代码
RabbitMQ web管理端地址 http:/ip:15672
2、spring boot 集成rabbitMQ
1、pom.xml
复制代码 org.springframework.boot spring-boot-starter-amqp
2、yml配置连接RabbitMQ
spring: rabbitmq: host: 119.3.252.69 port: 5672 username: rabbit password: 123456复制代码
3、使用bean配置创建一个消息队列
@Configurationpublic class RabbitMQConfig { /** * 创建一个消息队列 * @return */ @Bean public Queue queue(){ //创建名称为testRabbitQueue的消息队列 return new Queue("testRabbitQueue"); }}复制代码
4、创建消息生产者
/** * 消息生产者 */@RestControllerpublic class RabbitQMController { @Autowired private AmqpTemplate amqpTemplate; @RequestMapping(value = "sendMQ",method = RequestMethod.POST) public String sendMQ(String message){ //将消息放入队列 amqpTemplate.convertAndSend("testRabbitQueue", message); return "send"+message+"成功"; }}复制代码
5、创建消息消费者
/** * 消息消费者 */@Component@RabbitListener(queues = "testRabbitQueue")public class RabbitMQConsumer { @RabbitHandler public void process(String message){ System.out.println("我是消费者我要累死了这是消息内容-----"+message); }}复制代码
当消息队列中有数据时会将消息下发到各个消费者手上处理
2、Quartz 概述
Quartz 是一个任务调度框架
1、简单使用
1、pom.xml
复制代码 org.springframework.boot spring-boot-starter-quartz
2、创建定时任务
@Componentpublic class SendRabbitMQQuartz { @Autowired private RabbitQMController rabbitQMController; /** * 每分钟插入1000条消息 */ @Scheduled(cron = "0 0/1 * * * ? ") public void sendRabbitMQ(){ for (int i=0 ; i<1000 ; i++){ rabbitQMController.sendMQ("我是消息"+i); } System.out.println(new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date())); } /** * 每30秒打印信息 */ @Scheduled(cron = "0/30 * * * * ? ") public void printTime(){ System.out.println(new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date())); }}复制代码
3、启动类增加注解
@EnableScheduling
4、测试效果
3、Swagger 概述
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。
作用:
- 接口的文档在线自动生成。
- 功能测试。
1、简单使用
1、pom.xml
io.springfox springfox-swagger2 2.8.0 复制代码 io.springfox springfox-swagger-ui 2.8.0
2、启动类增加注解
@EnableSwagger2
3、创建bean配置类
@Configurationpublic class Swagger2Config { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() //接口所在包路径 .apis(RequestHandlerSelectors.basePackage("com.fjhckj.springcloudrabbitmq.controller")) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("rabbitMQ API 文档") .description("rabbitMQ API 接口文档") .version("1.0.0") .build(); }}复制代码
4、在消息生产者接口上标注接口说明
/** * 消息生产者 *///描述类@Api(value = "RabbitMQ消息生产者")@RestControllerpublic class RabbitQMController { @Autowired private AmqpTemplate amqpTemplate; //描述方法 @ApiOperation(value = "消息生成rest接口") //描述参数 @ApiImplicitParams({ @ApiImplicitParam(name = "message", value = "消息内容", required = true, dataTypeClass = String.class, paramType = "String"), }) @RequestMapping(value = "sendMQ",method = RequestMethod.POST) public String sendMQ(String message){ amqpTemplate.convertAndSend("testRabbitQueue", message); return "send"+message+"成功"; }}复制代码
@Api:用在类上,说明该类的作用。
@ApiOperation:注解来给API增加方法说明。
@ApiImplicitParams : 用在方法上包含一组参数说明。
@ApiImplicitParam:用来注解来给方法入参增加说明。
@ApiResponses:用于表示一组响应
@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
l code:数字,例如400l message:信息,例如"请求参数没填好"l response:抛出异常的类 复制代码
@ApiModel:描述一个Model的信息(一般用在请求参数无法使用@ApiImplicitParam注解进行描述的时候)
l @ApiModelProperty:描述一个model的属性复制代码
5、测试效果
:port/swagger-ui.html
结尾
这几个东西单纯记录下使用方式互相直接并无依赖关系。