本文已参与「新人创作礼」活动,一起开启掘金创作之路。
微服务中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 {
//远程调用失败
}