美文网首页
13.服务治理-Eureka-电商系统集成Eureka - 商品

13.服务治理-Eureka-电商系统集成Eureka - 商品

作者: 溅十三 | 来源:发表于2020-05-01 08:56 被阅读0次

    接口层实现

    1.ItemService的修改

    1.创建foodie-item-api接口层

    供其他微服务发起调用的,接口层依赖尽量纯净、少,这样,在别人在引用时就不会发生大量冲突

    2.引入pom依赖

    <?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">
        <parent>
            <artifactId>foodie-cloud</artifactId>
            <groupId>com.imooc</groupId>
            <version>1.0-SNAPSHOT</version>
            <relativePath>../../../pom.xml</relativePath>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>foodie-item-api</artifactId>
        <dependencies>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>foodie-cloud-shared-pojo</artifactId>
                <version>${project.version}</version>
            </dependency>
    
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>foodie-item-pojo</artifactId>
                <version>${project.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!-- TODO Feign dependencies-->
    
        </dependencies>
    
    
    </project>
    

    3.移植ItemService到com.imooc.item.service
    4.修改ItemService的内容

    • 加@RequestMapping("item-api")的内容,添加请求路径
    • 入参起名字:如果用fen进行调用的话,并且没有指定RequestParam的属性名,那么会报错的,所以要给入参起名字

    加@RequestMapping("item-api") 这样做有什么好处呢?
    a.@RequestMapping写在接口上,就可以声明在实现类当中
    b.当服务器间调用时,下游服务通过fen组件调用item service时,这时,如果接口上申明了RequestMapping,那调用方直接拿到接口就可以直接寻址了,这时,这样就避免了下游服务还得再单独配置一套寻址路径
    c.RestApi时,是否还需要定义GET?不需要,rest已经声明了

    4.注释掉商品搜索代码

    2.ItemCommentsService的修改

    1.copy ItemCommentsService到service目录下
    2.和订单强绑定的内容,放在订单域
    3.添加saveComments的方法,会被订单中心调用

    package com.imooc.item.service;
    
    import com.imooc.pojo.PagedGridResult;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.Map;
    
    /**
     * Created by 半仙.
     */
    @RequestMapping("item-comments-api")
    public interface ItemCommentsService {
    
        /**
         * 我的评价查询 分页
         * @param userId
         * @param page
         * @param pageSize
         * @return
         */
        @GetMapping("myComments")
        public PagedGridResult queryMyComments(@RequestParam("userId") String userId,
                                               @RequestParam(value = "page", required = false) Integer page,
                                               @RequestParam(value = "pageSize", required = false)Integer pageSize);
    
        @PostMapping("saveComments")
        public void saveComments(@RequestBody Map<String, Object> map);
    
    }
    
    
    3.创建api的上一层service

    1.创建foodie-item-service的项目
    2.包管理及删除搜索的函数内容
    3.@Service注解需要声明成@RestController
    4.ItemServiceI的实现类ItemServiceImpl
    5.ItemCommentsService的实现类ItemCommentsServiceImpl

    package com.imooc.item.service.impl;
    
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    import com.imooc.enums.CommentLevel;
    import com.imooc.enums.YesOrNo;
    import com.imooc.item.mapper.*;
    import com.imooc.item.pojo.*;
    import com.imooc.item.pojo.vo.CommentLevelCountsVO;
    import com.imooc.item.pojo.vo.ItemCommentVO;
    import com.imooc.item.pojo.vo.ShopcartVO;
    import com.imooc.item.service.ItemService;
    import com.imooc.utils.DesensitizationUtil;
    import com.imooc.pojo.PagedGridResult;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Propagation;
    import org.springframework.transaction.annotation.Transactional;
    import org.springframework.web.bind.annotation.RestController;
    import tk.mybatis.mapper.entity.Example;
    
    import java.util.*;
    
    @RestController
    @Slf4j
    public class ItemServiceImpl implements ItemService {
    
        @Autowired
        private ItemsMapper itemsMapper;
        @Autowired
        private ItemsImgMapper itemsImgMapper;
        @Autowired
        private ItemsSpecMapper itemsSpecMapper;
        @Autowired
        private ItemsParamMapper itemsParamMapper;
        @Autowired
        private ItemsCommentsMapper itemsCommentsMapper;
        @Autowired
        private ItemsMapperCustom itemsMapperCustom;
    
        @Transactional(propagation = Propagation.SUPPORTS)
        @Override
        public Items queryItemById(String itemId) {
            return itemsMapper.selectByPrimaryKey(itemId);
        }
    
        @Transactional(propagation = Propagation.SUPPORTS)
        @Override
        public List<ItemsImg> queryItemImgList(String itemId) {
            Example itemsImgExp = new Example(ItemsImg.class);
            Example.Criteria criteria = itemsImgExp.createCriteria();
            criteria.andEqualTo("itemId", itemId);
    
            return itemsImgMapper.selectByExample(itemsImgExp);
        }
    
        @Transactional(propagation = Propagation.SUPPORTS)
        @Override
        public List<ItemsSpec> queryItemSpecList(String itemId) {
            Example itemsSpecExp = new Example(ItemsSpec.class);
            Example.Criteria criteria = itemsSpecExp.createCriteria();
            criteria.andEqualTo("itemId", itemId);
    
            return itemsSpecMapper.selectByExample(itemsSpecExp);
        }
    
        @Transactional(propagation = Propagation.SUPPORTS)
        @Override
        public ItemsParam queryItemParam(String itemId) {
            Example itemsParamExp = new Example(ItemsParam.class);
            Example.Criteria criteria = itemsParamExp.createCriteria();
            criteria.andEqualTo("itemId", itemId);
    
            return itemsParamMapper.selectOneByExample(itemsParamExp);
        }
    
        @Transactional(propagation = Propagation.SUPPORTS)
        @Override
        public CommentLevelCountsVO queryCommentCounts(String itemId) {
            Integer goodCounts = getCommentCounts(itemId, CommentLevel.GOOD.type);
            Integer normalCounts = getCommentCounts(itemId, CommentLevel.NORMAL.type);
            Integer badCounts = getCommentCounts(itemId, CommentLevel.BAD.type);
            Integer totalCounts = goodCounts + normalCounts + badCounts;
    
            CommentLevelCountsVO countsVO = new CommentLevelCountsVO();
            countsVO.setTotalCounts(totalCounts);
            countsVO.setGoodCounts(goodCounts);
            countsVO.setNormalCounts(normalCounts);
            countsVO.setBadCounts(badCounts);
    
            return countsVO;
        }
    
        @Transactional(propagation = Propagation.SUPPORTS)
        Integer getCommentCounts(String itemId, Integer level) {
            ItemsComments condition = new ItemsComments();
            condition.setItemId(itemId);
            if (level != null) {
                condition.setCommentLevel(level);
            }
            return itemsCommentsMapper.selectCount(condition);
        }
    
        @Transactional(propagation = Propagation.SUPPORTS)
        @Override
        public PagedGridResult queryPagedComments(String itemId,
                                                  Integer level,
                                                  Integer page,
                                                  Integer pageSize) {
    
            Map<String, Object> map = new HashMap<>();
            map.put("itemId", itemId);
            map.put("level", level);
    
            // mybatis-pagehelper
    
            /**
             * page: 第几页
             * pageSize: 每页显示条数
             */
            PageHelper.startPage(page, pageSize);
    
            List<ItemCommentVO> list = itemsMapperCustom.queryItemComments(map);
            for (ItemCommentVO vo : list) {
                vo.setNickname(DesensitizationUtil.commonDisplay(vo.getNickname()));
            }
    
            return setterPagedGrid(list, page);
        }
        private PagedGridResult setterPagedGrid(List<?> list, Integer page) {
            PageInfo<?> pageList = new PageInfo<>(list);
            PagedGridResult grid = new PagedGridResult();
            grid.setPage(page);
            grid.setRows(list);
            grid.setTotal(pageList.getPages());
            grid.setRecords(pageList.getTotal());
            return grid;
        }
    
        @Transactional(propagation = Propagation.SUPPORTS)
        @Override
        public List<ShopcartVO> queryItemsBySpecIds(String specIds) {
    
            String ids[] = specIds.split(",");
            List<String> specIdsList = new ArrayList<>();
            Collections.addAll(specIdsList, ids);
    
            return itemsMapperCustom.queryItemsBySpecIds(specIdsList);
        }
    
        @Transactional(propagation = Propagation.SUPPORTS)
        @Override
        public ItemsSpec queryItemSpecById(String specId) {
            return itemsSpecMapper.selectByPrimaryKey(specId);
        }
    
        @Transactional(propagation = Propagation.SUPPORTS)
        @Override
        public String queryItemMainImgById(String itemId) {
            ItemsImg itemsImg = new ItemsImg();
            itemsImg.setItemId(itemId);
            itemsImg.setIsMain(YesOrNo.YES.type);
            ItemsImg result = itemsImgMapper.selectOne(itemsImg);
            return result != null ? result.getUrl() : "";
        }
    
        @Transactional(propagation = Propagation.REQUIRED)
        @Override
        public void decreaseItemSpecStock(String specId, int buyCounts) {
    
            // synchronized 不推荐使用,集群下无用,性能低下
            // 锁数据库: 不推荐,导致数据库性能低下
            // 分布式锁 zookeeper redis
    
            // lockUtil.getLock(); -- 加锁
    
            // 1. 查询库存
    //        int stock = 10;
    
            // 2. 判断库存,是否能够减少到0以下
    //        if (stock - buyCounts < 0) {
            // 提示用户库存不够
    //            10 - 3 -3 - 5 = -1
    //        }
    
            // lockUtil.unLock(); -- 解锁
    
    
            int result = itemsMapperCustom.decreaseItemSpecStock(specId, buyCounts);
            if (result != 1) {
                throw new RuntimeException("订单创建失败,原因:库存不足!");
            }
        }
    }
    
    

    相关文章

      网友评论

          本文标题:13.服务治理-Eureka-电商系统集成Eureka - 商品

          本文链接:https://www.haomeiwen.com/subject/ladfghtx.html