面试展示:网上商城项目搜索微服务模块展示

一、建立商品索引库

  1. 首先要分析商品的参数和页面上需要展示的内容来分析商品索引库字段,搜索出来的大图上展示的是每个spu部分信息以及每个spu下的各个sku部分信息,接着开始分析分词字段的内容,用户搜索的时候输入的是商品的标题、分类或是品牌,所以分词字段由商品的这三个属性拼接而成,选用的是ik_max_word分词器,接着设计用于过滤的字段,一些不适合作为索引的字段设置为index = false,再加入一些商品三级分类字段,价格字段便于页面的展示,最后调用创建索引库的api方法。
@Data
@Document(indexName = "goods", type = "docs", shards = 1, replicas = 0)
public class Goods implements Serializable {
   

    @Id
    private Long id; //spuId
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String all; //所有需要被搜索的信息,包含标题,分类,品牌

    //过滤条件
    private Long brandId; //品牌id
    private Map<String,Object> specs; //可搜索的规格参数,key是参数名,值是参数值,es可以放对象
    //不适合索引的字段
    @Field(type = FieldType.Keyword, index = false)
    private String skus; //sku信息的json结构
    @Field(type = FieldType.Keyword, index = false)
    private String subTitle; //卖点

    //便于页面的迅速展示
    private Long cid1; // 1级分类id
    private Long cid2; // 2级分类id
    private Long cid3; // 3级分类id
    private Date createTime; //创建时间
    private Set<Long> price; //价格

}
  1. 下面很重要的一步就是往索引库中添加添加数据,需要远程调用商品微服务中的方法获取数据,获取到数据之后将Spu对象传入buildGoods方法中,每100个商品对象作为一个集合调用loadData方法,最后在loadData方法中调用存索引集合的api方法。
public Goods buildGoods(Spu spu){
   
        //构建下面要完成的TODO
        //分类
        List<Category> categoryList = categoryClient.queryCategoryListByIds(Arrays.asList(
                spu.getCid1(),spu.getCid2(),spu.getCid3()
        ));
        if (CollectionUtils.isEmpty(categoryList)){
   
            throw new LyException(ExceptionEnum.CATEGORY_NOT_FOUND);
        }
        List<String> names = categoryList.stream().map(Category::getName).collect(Collectors.toList());

        //品牌
        Brand brand = brandClient.queryBrandById(spu.getBrandId());
        if (brand == null){
   
            throw new LyException(ExceptionEnum.BRAND_NOT_FOUND);
        }
        //搜索字段
        String all = spu.getTitle() +
                StringUtils.join(names," ") + brand.getName();
        //价格需要查询sku
        List<Sku> skuList = goodsClient.querySkusBySpuId(spu.getId());
        if (CollectionUtils.isEmpty(skuList)){
   
            throw new LyException(ExceptionEnum.GOODS_NOT_FOUND);
        }

        //对sku进行处理,不需要sku的所有数据
        List<Map<String,Object>> skus = new ArrayList<>();
        //价格集合
        Set<Long> priceList 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java微服务面试的问题非常广泛,以下是一些可能会被问到的问题和回答: 1. 微服务是什么?为什么使用微服务架构? 微服务是一种软件架构模式,它将一个大型应用程序拆分成一组小型、相互独立的服务。每个服务都有自己的业务逻辑和数据存储,可以独立开发、部署和扩展。微服务架构具有许多优点,包括灵活性、可扩展性、模块化和团队自治。 2. 在微服务中如何处理服务之间的通信? 微服务之间的通信可以使用RESTful API或消息队列来实现。RESTful API是一种基于HTTP协议的轻量级通信机制,它可以通过GET、POST、PUT和DELETE等HTTP方法来发送和接收数据。消息队列则可以实现异步通信,并提供更高的可靠性和可伸缩性。 3. 如何保证微服务架构的可靠性和容错性? 为了保证可靠性和容错性,可以使用负载均衡、故障转移和容错机制来处理微服务的请求。负载均衡可以将请求分发到多个服务实例上,以提高性能和可伸缩性。故障转移可以在某个服务实例失败时自动切换到备用实例。容错机制可以处理网络故障和服务不可用的情况。 4. 如何测试微服务? 在测试微服务时,可以使用单元测试、集成测试和端到端测试来确保每个服务的功能和性能都达到预期。单元测试可以测试单个服务的业务逻辑。集成测试可以测试多个服务之间的协作和通信。端到端测试可以模拟真实用户场景,并测试整个系统的功能和性能。 5. 在微服务中如何处理数据一致性? 于微服务之间的数据存储是分散的,确保数据一致性可能会成为一个挑战。可以使用分布式事务或事件驱动的架构来处理数据一致性。分布式事务可以确保多个服务在进行数据更新时的一致性。事件驱动的架构则可以通过发布和订阅事件来实现数据同步。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值