详解SpringCloud微服务技术栈:深入ElasticSearch(1)——数据聚合

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习
🌌上期文章:详解SpringCloud微服务技术栈:ElasticSearch实战(旅游类项目)
📚订阅专栏:微服务技术全家桶
希望文章对你们有所帮助

在之前已经了解了ElasticSearch的基本用法(DSL语句以及RestClient实现),并利用ElasticSearch做了一个旅游类项目加以巩固,现在要进行ElasticSearch更深入的内容,内容包括:

数据聚合:来对海量数据做统计和分析,结合kibana还能形成可视化的图形报表
自动补全:根据用户输入的部分关键字信息去补全关键字
数据同步:先分析MySQL与ElasticSearch的双写一致性问题,并给出对应的解决方案
集群:ES的集群和集群中不同角色的作用,并且搭建一个企业级的高可用的集群

数据聚合

聚合分类

聚合可以实现对文档数据的统计、分析和运算。常见聚合有3类:
在这里插入图片描述

DSL实现Bucket聚合

现在要统计所有数据中的酒店品牌有几种,此时可以根据酒店品牌的名称做聚合。
MySQL里面直接用group by,而这里需要用Bucket聚合,具体来说是用的term聚合:

# 对价格小于200的做聚合,也可以不限定聚合的范围(不写query)
GET /hotel/_search
{
	"query": {
		"range": {
			"price": {
				"lte": 200
			}
		}
	},
	"size": 0, # 设置size=0,表示结果中不包含文档,只包含聚合结果
	"aggs": { # 定义聚合
		"brandAgg": { # 给聚合起个名字
			"terms": { # 聚合的类型,按照品牌,因此选择term
				"field": "brand", # 参与聚合的字段
				"size": 20 # 希望获取的聚合结果的数量,默认10
			}
		}
	}
}

DSL实现Metrics聚合

获取每个品牌的用户评分的min、max、avg等值,因此要做聚合的嵌套,在每个bucket中做计算:

GET /hotel/_search
{
	"size": 0,
	"aggs": {
		"brandAgg": {
			"terms": {
				"field": "brand",
				"size": 20,
				"order": { # 做排序,需要指定排序的字段
				  "scoreAgg.avg": "desc"
				}
			},
			"aggs": { # 品牌聚合的自聚合,对每组分别做计算
			  "scoreAgg": { # 聚合名称
			    "stats": { # 聚合类型,stats可以计算min、max、avg
			      "field": "score" # 聚合字段
			    }
			  }
			}
		}
	}
}

RestClient实现聚合

依然是通过DSL语句来写java语句:
在这里插入图片描述
编写测试类:

	@Test
    void testAggregation() throws IOException {
        //1.准备request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        //2.1 设置size,不需要查看文档,只要看聚合结果
        request.source().size(0);
        //2.1 聚合
        request.source().aggregation(AggregationBuilders
                .terms("brandAgg") //聚合名称"brandAgg",类型terms
                .field("brand") //参与聚合的字段
                .size(10)
        );
        //3.发出请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //打印即可查看输出的结构,对照结构来做逐层做解析
        //System.out.println("response = " + response);
        //4.解析结果
        //4.1 获取聚合信息
        Aggregations aggregations = response.getAggregations();
        //4.2根据聚合名称获取聚合结果(之前是term类型这里返回的也是term类型)
        Terms brandTerms = aggregations.get("brandAgg");
        //4.3获取buckets
        List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();
        //4.4遍历buckets,取出每一个桶(分类)
        for (Terms.Bucket bucket : buckets) {
            String key = bucket.getKeyAsString();
            System.out.println("key = " + key);
        }
    }

在这里插入图片描述

多条件聚合

在IUserService接口中定义方法,实现对品牌、城市、星级的聚合(搜索页面的品牌、城市等信息不应该是在页面中写死的,而是通过聚合索引库中的酒店数据得来的)。

例如,我限定了价格的range为100-300,如果杭州不包含这样价位的酒店,那么导航栏上面的城市信息直接就不应该有杭州两个字

IUserService中声明方法:

	/**
     * 查询城市、星级、品牌的聚合效果
     * @return 聚合结果,格式:{"城市": {"上海", "北京"}, "品牌": {"如家", "希尔顿"}}
     */
    Map<String, List<String>> filters();

UserService实现方法体:

	@Override
    public Map<String, List<String>> filters() {
        try {
            //1.准备request
            SearchRequest request = new SearchRequest("hotel");
            //2.准备DSL
            //2.1设置size
            request.source().size(0);
            //2.2设置聚合
            buildAggregation(request);
            //3.发出请求
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            //4.解析响应
            Map<String, List<String>> result = new HashMap<>(); //存放解析后的结果
            Aggregations aggregations = response.getAggregations();
            result.put("brand", getAggByName(aggregations, "brandAgg"));
            result.put("city", getAggByName(aggregations, "cityAgg"));
            result.put("starName", getAggByName(aggregations, "starAgg"));
            return result;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private List<String> getAggByName(Aggregations aggregations, String aggName) {
        List<String> list = new ArrayList<>(); //存放每个桶的value
        Terms brandTerms = aggregations.get(aggName); //这里返回值不要默认,自行设置为Terms类型的
        List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();
        for (Terms.Bucket bucket : buckets) {
            String key = bucket.getKeyAsString();
            list.add(key);
        }
        return list;
    }

    private void buildAggregation(SearchRequest request) {
        request.source().aggregation(AggregationBuilders
                .terms("brandAgg")
                .field("brand")
                .size(100)
        );
        request.source().aggregation(AggregationBuilders
                .terms("cityAgg")
                .field("city")
                .size(100)
        );
        request.source().aggregation(AggregationBuilders
                .terms("starAgg")
                .field("starName")
                .size(100)
        );
    }

可以在测试类中注入IUserService,调用方法查看运行结果:

	@Resource
    private IHotelService hotelService;

    @Test
    void contextLoads() {
        Map<String, List<String>> filters = hotelService.filters();
        System.out.println("filters = " + filters);
    }

在这里插入图片描述

带过滤条件的聚合

聚合已经完成,但是聚合的结果还没有返回到前端,实际上前端页面会向服务端发起请求,查询品牌、城市、星级等字段的聚合结果,我们应当渲染完返还给前端。

查看前端的请求:
在这里插入图片描述
可以看到请求的参数和之前的list里面的是一样,这是因为需要限定一下范围,比如限定了城市为北京,搜索条件为“如家”,那么应该对北京的、名字带“如家”的酒店去做聚合,而不是所有的酒店,这样会大大提高效率。

1、编写controller接口,接受该请求

	@PostMapping("/filters")
    public Map<String, List<String>> getFilters(@RequestBody RequestParams params){
        return hotelService.filters(params);
    }

2、修改IUserService#getFilter()方法,添加RequestParam参数

Map<String, List<String>> filters(RequestParams params);

3、修改getFilters方法的业务,聚合时添加query条件
在这里插入图片描述
至此,数据聚合的实现已经完成。

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Spring Cloud Kubernetes 是一种将微服务进行容器化交付的解决方案。本文将介绍完整版的第11章内容,让我们一起来了解吧。 第11章主要涵盖以下三个内容,分别为监控与告警、日志与审计、压测。 在微服务架构中,监控与告警是非常重要的一环。Spring Cloud Kubernetes 提供了丰富的监控与告警功能,可帮助我们监控应用的运行状态和性能指标。我们可以使用 Prometheus 来收集应用的指标,并使用 Grafana 来进行可视化展示。此外,还介绍了如何设置监控的阈值,并通过 Alertmanager 发送告警通知。 日志与审计是另一个重要的方面。Spring Cloud Kubernetes 提供了集中式的日志管理和审计功能,可以将微服务的日志集中存储,并提供查询和分析的能力。我们可以使用 Elasticsearch 和 Kibana 来存储和展示日志数据,并使用 Filebeat 将应用的日志发送到 Elasticsearch 集群。 压测是测试微服务的性能和稳定性的一种方法。在本章中,我们介绍了如何使用 JMeter 进行压力测试。我们需要根据实际需求,编写合适的测试场景和脚本,并设置并发请求数量、持续时间等参数。通过压测,我们可以评估微服务的性能表现,并找出潜在的性能瓶颈。 综上所述,本章介绍了在使用 Spring Cloud Kubernetes 进行微服务容器化交付时,如何实现监控与告警、日志与审计、压测等功能。这些功能的引入可以帮助我们更好地了解和管理微服务的运行状态,提高应用的可靠性和稳定性。 ### 回答2: 【完整版11章】SpringCloud Kubernetes 微服务容器化交付实战是一本介绍在使用 SpringCloud 架构和 Kubernetes 容器化平台上进行微服务交付的实践指南。本书主要包括以下几个方面内容: 首先,本书介绍了 SpringCloud 和 Kubernetes 的基本概念和原理。SpringCloud 是一套用于构建分布式系统的框架,它提供了诸如服务注册与发现、负载均衡、断路器等功能。Kubernetes 是一个开源的容器编排平台,它可以自动化地管理和调度容器。了解这些基本概念有助于我们在后续的实践中更好地理解和应用。 接着,本书详细介绍了如何将 SpringCloud 微服务容器化并交付到 Kubernetes 平台上。这包括了如何使用 Docker 将微服务打包成容器镜像,如何使用 Kubernetes 部署和管理容器,以及如何通过 Kubernetes 提供的功能实现服务注册与发现、负载均衡等。 在介绍容器化部署和管理微服务的基础上,本书还深入讨论了如何在 Kubernetes 上进行微服务的监控和日志管理。通过使用 Prometheus 和 Grafana 进行监控、使用 ELK(Elasticsearch、Logstash、Kibana)进行日志管理,我们可以及时发现和解决微服务中的问题。 此外,本书还介绍了如何使用 Jenkins 持续集成/持续交付来实现自动化的构建、测试和部署。通过结合 Jenkins 和 Kubernetes 提供的功能,可以实现微服务的全自动化交付,从而提高开发、测试和部署的效率。 最后,本书还对在实际项目中容器化微服务的一些实践经验进行了总结和分享。这包括如何进行容器镜像的管理和版本控制、如何优化容器化微服务的资源使用、如何进行持续集成和部署的自动化等。 总的来说,【完整版11章】SpringCloud Kubernetes 微服务容器化交付实战是一本介绍在 SpringCloud 和 Kubernetes 平台上进行微服务容器化交付的实践指南。它详细介绍了容器化部署和管理微服务的方法,并分享了一些实际项目中的实践经验。这本书对于想要在分布式系统开发中运用微服务和容器化技术的开发人员和系统架构师来说,是一本非常有价值的参考书。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布布要成为最负责的男人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值