添加商品sku到购物车,我们需要用fegin调用商品微服务完成根据商品id查询商品sku的操作
**
【商品微服务】把根据商品id查询商品sku的操作定义出来
用fegin对外暴露
【订单微服务】操作添加购物车
**
fegin功能接口:
fegin的调用
购物车接口
购物车实现
@Service
public class CartServiceImpl implements CartService {
private static final String CART="cart_";
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private SkuFeign skuFeign;
@Autowired
private SpuFeign spuFeign;
@Override
public void addCart(String skuId, Integer num, String username) {
//1.查询redis中相对应的商品信息
OrderItem orderItem = (OrderItem) redisTemplate.boundHashOps(CART+username).get(skuId);
if (orderItem != null){
//2.如果当前商品在redis中的存在,则更新商品的数量与价钱
orderItem.setNum(orderItem.getNum()+num);
if (orderItem.getNum()<=0){
//删除该商品
redisTemplate.boundHashOps(CART+username).delete(skuId);
return;
}
orderItem.setMoney(orderItem.getNum()*orderItem.getPrice());
orderItem.setPayMoney(orderItem.getNum()*orderItem.getPrice());
}else {
//3.如果当前商品在redis中不存在,将商品添加到redis中
Sku sku = skuFeign.findById(skuId).getData();
Spu spu = spuFeign.findSpuById(sku.getSpuId()).getData();
//封装orderItem
orderItem = this.sku2OrderItem(sku,spu,num);
}
//3.将orderitem添加到redis中
redisTemplate.boundHashOps(CART+username).put(skuId,orderItem);
}
//查询购物车列表数据
@Override
public Map list(String username) {
Map map = new HashMap();
List<OrderItem> orderItemList = redisTemplate.boundHashOps(CART + username).values();
map.put("orderItemList",orderItemList);
//商品的总数量与总价格
Integer totalNum = 0;
Integer totalMoney = 0;
for (OrderItem orderItem : orderItemList) {
totalNum+=orderItem.getNum();
totalMoney+=orderItem.getMoney();
}
map.put("totalNum",totalNum);
map.put("totalMoney",totalMoney);
return map;
}
private OrderItem sku2OrderItem(Sku sku, Spu spu, Integer num) {
OrderItem orderItem = new OrderItem();
orderItem.setSpuId(sku.getSpuId());
orderItem.setSkuId(sku.getId());
orderItem.setName(sku.getName());
orderItem.setPrice(sku.getPrice());
orderItem.setNum(num);
orderItem.setMoney(orderItem.getPrice()*num);
orderItem.setPayMoney(orderItem.getPrice()*num);
orderItem.setImage(sku.getImage());
orderItem.setWeight(sku.getWeight()*num);
//分类信息
orderItem.setCategoryId1(spu.getCategory1Id());
orderItem.setCategoryId2(spu.getCategory2Id());
orderItem.setCategoryId3(spu.getCategory3Id());
return orderItem;
}
}
web
server:
port: 9011
spring:
application:
name: order-web
main:
allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册
thymeleaf:
cache: false
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka
instance:
prefer-ip-address: true
feign:
hystrix:
enabled: true
client:
config:
default: #配置全局的feign的调用超时时间 如果 有指定的服务配置 默认的配置不会生效
connectTimeout: 60000 # 指定的是 消费者 连接服务提供者的连接超时时间 是否能连接 单位是毫秒
readTimeout: 80000 # 指定的是调用服务提供者的 服务 的超时时间() 单位是毫秒
#hystrix 配置
hystrix:
command:
default:
execution:
timeout:
#如果enabled设置为false,则请求超时交给ribbon控制
enabled: true
isolation:
strategy: SEMAPHORE
thread:
# 熔断器超时时间,默认:1000/毫秒
timeoutInMilliseconds: 80000
#请求处理的超时时间
ribbon:
ReadTimeout: 4000
#请求连接的超时时间
ConnectTimeout: 3000