黑马头条前置实战问题总结

1.Nginx前端界面配置

server {
        listen       9001;
        server_name  localhost;

        location / {
            root   html/hm-mall-admin;
            index  index.html index.htm;
        }
}

server {
        listen       9002;
        server_name  localhost;

        location / {
            root   html/hm-mall-portal;
            index  index.html index.htm;
        }
}

 listen部分配置端口号,分别走localhost:9001和localhost:9002;将前端的资源包放到Nginx下的html文件夹中,再在root部分配置具体的路径。

2.Nacos启动问题

Nacos安装目录下进入bin文件夹,启动cmd命令,输入指令:

startup.cmd -m standalone

不可以直接双击startup启动文件,直接单击会以默认的Cluster集群方式启动,需要使用standalone模式启动,如果想配置非8848默认端口参数,可以输入以下指令修改端口号启动:

startup.cmd -m standalone -Dserver.port=8848

3.MySQL数据库数据导入ES问题

当数据量过大时,应该分批进行数据导入,不可以一次性导入大量数据。具体实现中,借助商品模块中的分页功能,将全部数据分割成一页一页的等份存入ES,将商品模块的分页接口暴露出来,使用Feign远程调用商品模块。

    @Autowired
    private ItemFeignClient itemFeignClient;

    @Autowired
    private RestHighLevelClient client;

    @Test
    void testBulkRequest() throws IOException {
        // 设置每次导入的数据量大小
        Integer page = 1;
        Integer size = 1000;
        while (true) {
            PageDTO<Item> pageDTO = itemFeignClient.list(page, size);
            if (pageDTO.getList() == null || pageDTO.getList().size() == 0) {
                break;
            }
            // 创建BulkRequest
            BulkRequest request = new BulkRequest();
            // 准备参数,添加多个新增的Request
            for (Item item : pageDTO.getList()) {
                // 转换为文档类型ItemDoc
                ItemDoc itemDoc = new ItemDoc(item);
                // 创建新增文档的Request对象
                request.add(new IndexRequest("hmall")
                        .id(itemDoc.getId().toString())
                        .source(JSON.toJSONString(itemDoc), XContentType.JSON));
            }
            // 发送请求
            client.bulk(request, RequestOptions.DEFAULT);
            page++;
        }
    }

使用while(true)而不用具体的for循环来改变page参数,在实际的业务中,不会去因为数据库内有多少条数据而去计算循环次数,所以使用for来控制次数是不符合实际业务的。

4.在从MySQL将数据导入ES的过程中,如果出现类似下面的报错:

org.springframework.beans.factory.UnsatisfiedDependencyException: 

Error creating bean with name 'com.hmall.search.ItemDocumentTest': Unsatisfied dependency expressed through field 'itemFeignClient'; nested exception is 

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.hmall.common.clients.ItemFeignClient': Unexpected exception during bean creation; 

nested exception is java.lang.IllegalStateException: 

No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-netflix-ribbon?

需要在ES模块中,添加Nacos服务发现依赖 

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

对于出现的其他问题:

检查Feign模块对应的客户端接口,保证注解声明的服务名和yml中声明的一致

@FeignClient("itemservice")

5.Feign远程调用依赖引入问题

关于Feign远程调用,只有Feign自身所在的模块需要引入起步依赖

        <!-- Feign起步依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

其他用到了远程调用的模块,只需要对应的Feign模块依赖

        <!-- Feign模块依赖 -->
        <dependency>
            <groupId>com.hmall</groupId>
            <artifactId>feign-api</artifactId>
            <version>1.0</version>
        </dependency>

6.RabbitMQ实现MySQL和ES数据同步问题

商品模块的业务包括:分页、根据id查询回显、新增、修改、删除、商品上下架

这里我们先来分析业务逻辑:所有的商品在上架之后,不可以进行修改删除操作,想要进行任何操作必须先进行下架;而当商品下架之后,我们应该将ES部分用户端的商品也同时下架,而对于ES的下架问题,实际实现就是删除索引库中的数据,所以我们得出结论,只要进行下架(即使进行新增,修改,删除等操作),我们直接删除ES中的数据;对于数据新增后不上架,依旧不需要更新ES中的数据,直到上架完成,我们才在ES中进行新增的操作。

通过分析我们可以操作代码,只需要在上下架方法处进行if判断,导向正确的消费者。

        // 进行上架操作(1),则新增ES数据 ;进行下架操作(2),则删除ES数据
        if (status == 1){
            rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_EXCHANGE, RabbitMQConfig.UPDATE, JSON.toJSONString(item1));

        }else if (status == 2){
            rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_EXCHANGE, RabbitMQConfig.REMOVE, JSON.toJSONString(id));
        }
    // ES数据新增方法
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = UPDATE_QUEUE),
            exchange = @Exchange(name = ITEM_EXCHANGE, type = ExchangeTypes.TOPIC),
            key = UPDATE
    ))
    public void updateES(String msg) throws IOException {
        Item item = JSON.parseObject(msg, Item.class);
        // 准备Request对象
        IndexRequest indexRequest = new IndexRequest("hmall")
                .id(item.getId().toString())
                .source(msg, XContentType.JSON);
        // 发送请求
        client.index(indexRequest, RequestOptions.DEFAULT);
    }

    // ES数据删除方法
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = REMOVE_QUEUE),
            exchange = @Exchange(name = ITEM_EXCHANGE, type = ExchangeTypes.TOPIC),
            key = REMOVE
    ))
    public void removeES(String id) throws IOException {
        // 准备Request对象
        DeleteRequest deleteRequest = new DeleteRequest("hmall", id);
        // 发送请求
        client.delete(deleteRequest, RequestOptions.DEFAULT);
    }

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue黑马头条项目的难点主要包括以下几个方面: 1. 数据流管理:在Vue黑马头条项目中,需要管理大量的数据,包括用户信息、新闻内容、评论等。如何有效地处理并管理这些数据,确保数据的正确性和一致性是一个难点。可以使用Vuex来进行全局的数据管理,并通过状态管理模式来统一管理数据的流动和变化。 2. 组件交互与通信:Vue黑马头条项目中使用了大量的组件,组件之间的交互与通信是其中一个难点。组件之间需要进行数据的传递、事件的派发与监听,如何高效地组织和管理这些组件之间的交互,提高项目的可维护性和扩展性是一个挑战。 3. 页面布局和样式:Vue黑马头条项目的页面比较复杂,需要考虑到不同屏幕尺寸的适配和响应式布局。同时,页面中的样式设计也需要符合美观和用户体验的要求。如何在保持页面布局的灵活性和可扩展性的同时,确保页面样式的一致性和用户友好性也是一个难点。 4. 请求与响应处理:Vue黑马头条项目需要与后台进行数据交互,包括获取新闻内容、发布评论等。在请求与响应处理中,需要考虑到网络请求的错误处理、数据的缓存和异步操作的管理等问题,确保用户在使用过程中的流畅性和体验。 5. 性能优化:Vue黑马头条项目中的数据量较大,页面频繁地进行数据的渲染和更新,对页面的性能和响应速度提出了要求。如何通过合理的数据缓存、懒加载、组件按需加载等方式进行性能优化,提高项目的执行效率和用户体验,是一个需要解决的难题。 通过了解和解决这些难点,可以更好地设计和实现Vue黑马头条项目,提高项目的开发效率和用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值