微服务中java保存elasticSearch实例

170 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

微服务中java保存elasticSearch实例

微服务中java保存elasticSearch实例

场景:

商品服务:product

elasticSearch服务:search

商品服务product需要存储的数据已经封装好了,通过feign调用search存储。

场景步骤带入
1 .封装好需要存储的结构
List<SkuEsModel> uoProducts
2.search服务配置
@Configuration
public class GuilimallElasticSearchConfig {

    public static final RequestOptions COMMON_OPTIONS;
    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
//        builder.addHeader("Authorization","Bearer"+TOKEN );
//        builder.setHttpAsyncResponseConsumerFactory(
//                new HttpAsyncResponseConsumerFactory
//                        .HeapBufferedResponseConsumerFactory(30*1024*1024*1024)
//        );
        COMMON_OPTIONS = builder.build();
    }


    @Bean
    public RestHighLevelClient esRestClient(){
//        RestHighLevelClient client = new RestHighLevelClient(
//                RestClient.builder(
//                        //多个es     new HttpHost("192.168.31.120",9200,"http"),
//                        new HttpHost("192.168.31.125",9200,"http")));
//        return client;
        RestClientBuilder builder = null;
        builder = RestClient.builder(new HttpHost("192.168.31.125",9200,"http"));
        RestHighLevelClient client = new RestHighLevelClient(builder);
        return client;
    }
3.search封装存储控制的逻辑
  控制器逻辑:
  //上架商品
    @PostMapping("/product")
    public R productStatusUp(@RequestBody List<SkuEsModel> skuEsModels){
        boolean b = false;
        try {
             b = productSaveService.productStatusUp(skuEsModels);
        }catch (Exception e){
            log.error("es上架错误{}",e);
            return R.error(BizCodeEnume.PRODUCT_UP_EXCEPTION.getCode(),BizCodeEnume.PRODUCT_UP_EXCEPTION.getMsg());
        }
        if(b){
            return R.ok();
        }else{
            return R.error(BizCodeEnume.PRODUCT_UP_EXCEPTION.getCode(),BizCodeEnume.PRODUCT_UP_EXCEPTION.getMsg());
        }

    }

实现类逻辑:
    
    public boolean productStatusUp(List<SkuEsModel> skuEsModels) throws IOException {
        //保存到es
        //1 给Es建立索引。 product 建立好索引映射关系 在Kibana建立索引 保存映射关系文件
        //2.给es 中保存数据 bulk(BulkRequest bulkRequest, RequestOptions options)
        BulkRequest bulkRequest = new BulkRequest();
        for (SkuEsModel model : skuEsModels) {
            //构造保存请求
            IndexRequest indexRequest = new IndexRequest(EsConstant.PRODUCT_INDEX);
            indexRequest.id(model.getSkuId().toString());
            String string = JSON.toJSONString(model);
           indexRequest.source(string,XContentType.JSON);
            bulkRequest.add(indexRequest);
        }
        //网络请求 存在不稳定性
        BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, GuilimallElasticSearchConfig.COMMON_OPTIONS);
        boolean b = bulk.hasFailures();
        List<String> collect = Arrays.stream(bulk.getItems()).map(item -> {
            return item.getId();
        }).collect(Collectors.toList());
        log.error("商品上架错误:{}",collect);
        return b;
    }
4.product书写feign逻辑

feign/SearchFeignService

@FeignClient("gulimall-search")
public interface SearchFeignService {

    @PostMapping("/search/save/product")
    R productStatusUp(@RequestBody List<SkuEsModel> skuEsModels);
}
5.product控制器引入及调用服务
@Autowired
SearchFeignService searchFeignService;
...
R r = searchFeignService.productStatusUp(uoProducts);
if(r.getCode() == 0){
   //远程调用成功
   //TODO 6 修改当前spu状态
   baseMapper.updateSpuStatus(spuId, ProductConstant.StatusEnum.SUP_UP);
}else {
   //远程调用失败
}