主要内容:
1 、rabbitMq安装与SPringboot集成
2 、nginx水平扩展
3 、压测
6.1 接口秒杀优化
思路:
1、系统初始化,商品库存量加载到redis
2、收到请求,redis预先减少库存,库存不足直接返回失败。
3、请求入队,立即返回排队中
4、异步请求出队,生成订单,减少库存。
5、客户端通过轮询,是否秒杀成功。
6.2 安装rabbitmq
安装erlang -> 安装rabbitmq
vi /etc/profile: 修改环境变量 使erlang和rabbitmq添加到环境变量
6.3 springboot集成rabbitmq
1、添加依赖 spring-boot-starter-amqp,添加配置
2、创建消息消费者
3、创建消息生产者
添加的配置 requeue-rejected=true 表示处理失败是否重新进入队列
rety 充实参数
MqConfig新建一个队列
MqReceiver: 使用注解@RabbitLisetner(queue=“qeueu”)
MqSender: 自动注入AmqpTempalte注入, amqpTemplate.converAndsend(“queue”, msg) 消息入队
6.4 四种交换机模式
解决guest远程访问 在etc目录下新建配置文件 .config
Direct模式 直接指定队列完整名称
Topic模式 部分匹配主题 入队amqpTempalte.converAndSend(Exchange, router_key, msg)
消费:BindingBuilder.bind(topicQueue2()).to(topicExchange()).with(“topic.#”) #匹配0或1一个以上字符,*匹配一个字符。 通配符模式
Fanout模式 广播模式 一个消息发布到多个队列中 多点模式
Headers模式:同事满足才能放入queue里面,往队列发送message对象,成员properties的headers需要与Bing的Headers完全一致。(给消息添加headers并且需要headers完全一致)。
6.5 秒杀接口优化
改成异步下单,减少数据库的访问。
改代码 mybatis 在insert后会自动填充domain对象的id
写客户端轮询接口。
goodIsOver在redis缓存,通过商品id获取,如果已经秒杀完了,则获取-1,没有则获取0.
6.6 秒杀接口优化
商品库存被秒空的时候,使用一个hashmap存放布尔标记,下次访问先直接尝试从内存中读取。减少了redis访
问的开销,使用内存存放。
在交给spring的前后做一些初始化:
1、实现接口@RequestMapping("/miaosha")
public class MiaoshaController implements InitializingBean
2、重写方法: public void afterPropertiesSet() throws Exception
6.7 压力测试对比
Up_stream 配置nginx负载均衡。
lvs负载均衡。