# 187. 商品详情页 OneService 系统:基于 Spring Cloud 构建 OneService 服务

创建新模块系统 eshop-one-service,端口号:9108,直接参考 eshop-datasync-service。

本章功能如下:

  • 提供通过产品 id 查询库存接口,通过 feign 调用库存服务

  • 提供通过产品 id 查询价格接口,通过 feign 调用价格服务

  • 改造库存和价格服务中的逻辑

    先从 redis 缓存获取,取不到再从数据库中查询返回,并写入数据库, 这里就是第一版中已经讲过的,缓存双写一致性,所以本次不具体考虑并发等问题,就简单的实现;

这里拿库存服务简单贴下实现代码,很简单。

OneService 中调用库存服务中的 feign cn.mrcode.cache.eshop.oneserver.service.InventoryService

@FeignClient(value = "eshop-inventory-service")
public interface InventoryService {
    @GetMapping("/product-inventory/findByProductId")
    String findByProductId(@RequestParam(value = "productId") Long productId);
}
1
2
3
4
5

库存服务中简单的实现,从缓存获取,取不到就从数据库中获取

public ProductInventory findByProductId(Long productId) {
    String key = "product_inventory_productId_" + productId;
    String json = redisTemplate.opsForValue().get(key);
    if (json != null) {
        return JSON.parseObject(json, ProductInventory.class);
    }
    ProductInventory productInventory = productInventoryMapper.findByProductId(productId);
    redisTemplate.opsForValue().set(key, JSON.toJSONString(productInventory));
    return productInventory;
}
1
2
3
4
5
6
7
8
9
10

简单测试两个调用是否有问题,cn.mrcode.cache.eshop.oneserver.web.controller.OneController


/**
 * @author : zhuqiang
 * @date : 2019/9/26 21:39
 */
@RestController
@RequestMapping("/one")
public class OneController {
    @Autowired
    private InventoryService inventoryService;
    @Autowired
    private PriceService priceService;

    @GetMapping("/inventory")
    public String findInventory(Long productId) {
        return inventoryService.findByProductId(productId);
    }

    @GetMapping("/price")
    public String findPrice(Long productId) {
        return priceService.findByProductId(productId);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  • 访问地址:http://localhost:9108/one/price?productId=1
  • 访问地址:http://localhost:9108/one/inventory?productId=1