使用Feign 的远程调用,把mysql数据导入es

本文介绍了如何使用FeignClient和SpringBoot将9万多个商品从数据库分页查询后批量导入Elasticsearch,涉及接口定义、服务依赖注入、Feign扫描和数据导入过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要把数据库数据导入到elasticsearch中,包括下面几步:

1)将商品微服务中的分页查询商品接口定义为一个FeignClient,放到feign-api模块中

2)搜索服务编写一个测试业务,实现下面功能:

调用item-service提供的FeignClient,分页查询商品 PageDTO<Item>

将查询到的商品封装为一个ItemDoc对象,放入ItemDoc集合

将ItemDoc集合批量导入elasticsearch中

注意:数据库中的商品数量多达9万多个,不可查询索引导入。一定要分页导入。

第一步,分页查询item接口对外暴露,在feign-api中定义接口

 @FeignClient("itemservice")
public interface ItemFeignClient {

    @GetMapping(path = "/item/list")
    public ResponseEntity<PageDTO<Item>> list(@RequestParam(value = "page", defaultValue = "1") Integer page, @RequestParam(value = "size", defaultValue = "10") Integer size);

}


第二步 ,在es服务和数据服务分别引入fegin-api依赖

<dependency>
    <groupId>com.hmall</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>

es服务配置文件:

spring:
  application:
    name: searchservice
  elasticsearch:
    rest:
      uris: http://192.168.xxx.xxx:xxxx


第三步,es服务入口类中调用feign,要开启feign扫描

@SpringBootApplication
@EnableFeignClients(basePackages = "com.hmall.api")
public class SearchApplication {
    public static void main(String[] args) {
        SpringApplication.run(SearchApplication.class, args);
    }
}

第四步,编写一个测试类,分页查询并批量导入

@SpringBootTest
@RunWith(SpringRunner.class) //Junit 4 需要  ,  Junit 5 不需要
public class BulkItemImportTest {
 
    @Autowired
    private ItemFeignClient itemFeignClient;
 
    @Autowired
    private RestHighLevelClient restHighLevelClient;
 
    @Test
    public void bulkItemImportTest() throws IOException {
        Integer page = 1, size = 1000;
 
        while (true) {
            //1. 查询商品列表
            ResponseEntity<PageDTO<Item>> responseEntity = itemFeignClient.list(page, size);
            PageDTO<Item> pageDTO = responseEntity.getBody();
            //如果查询的数据未空代表, 所有数据已经完成导入, 终止循环
            if (pageDTO.getList() == null || pageDTO.getList().size() == 0) {
                break;
            }
            //2. 导入数据到ES
            //2.1 创建请求对象
            BulkRequest request = new BulkRequest();
            //2.2 封装DSL语句
            pageDTO.getList().stream().forEach(item -> {
                ItemDoc itemDoc = new ItemDoc(item);
                request.add(new IndexRequest("hmall_item").id(item.getId() + "").source(JSON.toJSONString(itemDoc), XContentType.JSON));
            });
 
            //2.3 发送请求
            restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
 
            page++;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值