微服务理论基础知识点

文章目录

  • 微服务
    • 介绍
    • 微服务技术栈
    • 分布式架构
      • 介绍
      • 分布式架构需考虑的问题
    • 微服务特点总结
    • 微服务技术对比
      • 技术对比
      • 企业需求
    • SpringCloud
      • 介绍
      • 版本兼容
    • 服务拆分与远程调用
      • 微服务远程调用
      • 提供者与消费者
    • Eureka注册中心
      • 服务调用出现的问题
      • Eureka的作用
      • Eureka注册中心配置搭建
      • 注册user-service
      • 启动一个项目的多个实例
      • 服务拉取
      • 总结
    • 负载均衡:
      • 负载均衡流程:
      • 负载均衡策略:
      • 自定义负载均衡策略:
      • 饥饿加载:
      • 总结:
    • Nacos注册中心
      • Nacos下载安装与启动
      • 配置总结:
      • Nacos服务分级存储模型:
      • 分级模型总结:
      • Nacos负载均衡总结
      • 根据权重负载均衡
      • 环境隔离
      • Nacos注册中心原理
      • Nacos对比Eureka总结:
    • Nacos配置管理
      • 配置步骤:
      • 读取配置:
      • 配置热更新:
        • 总结:
      • 多环境配置共享:
        • 配置优先级:
        • 总结:
      • nacos集群搭建:
    • 基于Feign的远程调用:
      • RestTemplate存在的问题:
      • Feign:
      • Feign使用步骤:
      • 自定义Feign的配置:
      • Feign的性能优化:
        • 性能优化介绍:
        • 性能优化操作步骤:
        • 总结:
      • Feign的最佳实践
        • 方式一(继承):
        • 方式二(抽取):
        • 方式二的实现:
          • 总结:
    • 统一网关Gateway:
      • 网关功能:
        • 功能总结:
      • 网关搭建:
      • 路由断言工厂:
        • 总结:
      • 路由的过滤器配置:
      • 全局过滤器GlobalFilter:
        • 全局过滤器配置步骤:
      • 过滤器执行顺序:
      • 网关跨域cors的配置:
        • 总结:
    • Docker
      • 项目部署的问题
      • 工作原理:
        • 工作原理总结:
        • Docker对比虚拟机:
      • 镜像和容器:
      • Docker整体架构:
        • Docker架构总结:
    • 遇到的问题:
      • 1.Failed to download metadata for repo ‘docker-ce-stable‘: Cannot download repomd.xml
      • 2.启动docker容器报错No chain/target/match by that name.
      • 3.关于SpringBootTest与RunWith注解
    • Docker的安装:
    • Docker基本操作:
      • Docker基本操作-镜像:
        • 打包镜像到文件
        • 加载镜像
        • Docker基本操作-镜像命令总结:
      • Docker基本操作-容器:
        • 创建运行一个Nginx容器
        • 修改容器内容:
        • 总结:
        • redis容器操作:
    • 数据卷:
      • 数据卷总结1:
      • 挂载数据卷:
      • 数据卷挂载案例:
    • 自定义镜像:
    • Dockerfile:
      • Dockerfile案例:
      • 总结:
    • DockerCompose:
    • 微服务部署:
    • Docker镜像仓库:
    • 服务异步通讯:RabbitMQ:
      • 安装:
      • 同步通讯的优缺点:
      • 异步通讯的优缺点:
      • RabbitMQ介绍和安装:
      • 消息模型介绍:
    • SpringAMQP:
      • 简介:
      • 发送消息:
      • 接收消息:
      • WorkQueue工作队列:
      • 发布订阅模型:
      • Fanout Exchange:
        • 简介:
        • 操作步骤:
        • 总结:
      • Direct Exchange:
        • 介绍:
        • 操作步骤:
        • 总结:
      • Topic Exchange:
        • 介绍:
        • 操作步骤:
        • 总结:
      • 消息转换器:
        • 发送消息:
        • 接收消息:
        • 总结:
    • ElasticSearch:
      • 简介:
      • 倒排索引:
      • 文档:
      • 索引:
      • ES对比Mysql:
      • ES的安装:
      • Kibana的安装:
      • 分词器:
      • IK分词器的拓展和停用词典:
      • 索引库操作:
      • 创建索引库:
      • 操作索引库:
      • 文档操作:
    • RestClient基本用法:
      • RestClient操作索引库:
        • RestClient创建索引库:
        • RestClient删除索引库:
        • 总结:
      • RestClient操作文档:
        • 客户端初始化:
        • 新增文档:
        • 批量新增文档:
        • 查询文档:
        • 修改文档:
        • 删除文档:
        • 总结:
    • DSL查询语法:
      • 查询分类和基本语法:
      • 全文检索查询:
      • 精确查询:
      • 地理查询:
        • 第一种:
        • 第二种:
      • 复合查询
        • 介绍:
        • 相关性得分:
        • 复合查询---Function score Query:
        • 复合查询---Boolean Query:
    • 搜索结果处理-排序:
      • 介绍:
      • 案例:
    • 搜索结果处理-分页:
      • 介绍与应用:
      • 深度分页问题:
    • 搜索结果处理-高亮:
      • 简介
    • 搜索结果处理-总结:
    • RestClient查询文档:
      • 入门介绍:
      • 注意点一:
      • 注意点二:
      • 总结:
    • RestClient查询-match、term、range、bool查询:
    • RestClient查询-排序和分页:
    • RestClient查询-高亮:
      • 高亮请求:
      • 高亮结果解析:
      • **java代码:**
      • 总结:
    • 旅游项目案例:
      • 搜索和分页:
      • 条件过滤:
      • 我附近的酒店:
      • 广告置顶:
    • 数据聚合:
      • DSL实现bucket聚合:
      • DSL实现Metrics聚合:
      • RestClient实现聚合:
      • 多条件聚合:
      • 带过滤条件的聚合:
    • 自动补全:
      • 简介及用法:
      • 总结:
      • DSL实现自动补全:
      • 酒店数据自动补全:
      • RestAPI实现自动补全:

微服务

介绍

微服务理论基础知识点_第1张图片

微服务技术栈

微服务理论基础知识点_第2张图片

微服务理论基础知识点_第3张图片

微服务理论基础知识点_第4张图片

微服务理论基础知识点_第5张图片

分布式架构

介绍

微服务理论基础知识点_第6张图片

分布式架构需考虑的问题

微服务理论基础知识点_第7张图片

微服务特点总结

微服务理论基础知识点_第8张图片

微服务技术对比

微服务理论基础知识点_第9张图片

技术对比

微服务理论基础知识点_第10张图片

企业需求

微服务理论基础知识点_第11张图片

SpringCloud

介绍

微服务理论基础知识点_第12张图片

版本兼容

在这里插入图片描述

服务拆分与远程调用

微服务理论基础知识点_第13张图片

微服务远程调用

okHttpApi也可以进行远程调用

RestTemplate:是Spring提供的用于访问Rest服务的客户端

微服务理论基础知识点_第14张图片

微服务理论基础知识点_第15张图片

提供者与消费者

微服务理论基础知识点_第16张图片

服务者与消费者的角色是相对的。一个服务可以同时是服务提供者和服务消费者。

Eureka注册中心

服务调用出现的问题

微服务理论基础知识点_第17张图片

Eureka的作用

微服务理论基础知识点_第18张图片

微服务理论基础知识点_第19张图片

Eureka注册中心配置搭建

微服务理论基础知识点_第20张图片

注册user-service

微服务理论基础知识点_第21张图片

启动一个项目的多个实例

微服务理论基础知识点_第22张图片

服务拉取

微服务理论基础知识点_第23张图片

总结

微服务理论基础知识点_第24张图片

负载均衡:

负载均衡流程:

微服务理论基础知识点_第25张图片

微服务理论基础知识点_第26张图片

负载均衡策略:

微服务理论基础知识点_第27张图片

自定义负载均衡策略:

微服务理论基础知识点_第28张图片

第一种:是全局配置,orderservice这个消费者访问任何服务的时候均会按照配置的这个随机选择策略。

第二种:是局部配置,先指定服务名再配置用户希望的负载均衡策略。

饥饿加载:

微服务理论基础知识点_第29张图片

总结:

微服务理论基础知识点_第30张图片

Nacos注册中心

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件 。相比Eureka功能更为丰富,在国内受欢迎程度较高。

Nacos下载安装与启动

下载地址:https://github.com/alibaba/nacos/releases/tag/1.4.1

启动方式:

D:\nacos\bin>startup.cmd -m standalone

配置总结:

微服务理论基础知识点_第31张图片

SpringCloud-common定义了统一的接口规范,所以只需要修改依赖即可。

首先:还得在父工程pom文件中,引入:

<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-alibaba-dependenciesartifactId>
    <version>2.2.5.RELEASEversion>
    <type>pomtype>
    <scope>importscope>
dependency>

Nacos服务注册发现客户端依赖:


<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>

Nacos服务分级存储模型:

微服务理论基础知识点_第32张图片

微服务理论基础知识点_第33张图片

分级模型总结:

注意:一种服务有多个集群时,先通过启动一个项目的多个实例,再分别通过修改yml文件配置并指定要启动的一个服务启动!

微服务理论基础知识点_第34张图片

配置负载均衡规则:消费者优先选择本地集群的服务者。

微服务理论基础知识点_第35张图片

Nacos负载均衡总结

微服务理论基础知识点_第36张图片

根据权重负载均衡

微服务理论基础知识点_第37张图片

微服务理论基础知识点_第38张图片

微服务理论基础知识点_第39张图片

作用:也可以用于服务器升级,将需要升级的服务器访问权重调小。

环境隔离

微服务理论基础知识点_第40张图片

微服务理论基础知识点_第41张图片

Nacos注册中心原理

微服务理论基础知识点_第42张图片

微服务理论基础知识点_第43张图片

Nacos对比Eureka总结:

微服务理论基础知识点_第44张图片

Nacos配置管理

微服务理论基础知识点_第45张图片

配置步骤:

微服务理论基础知识点_第46张图片

微服务理论基础知识点_第47张图片

读取配置:

微服务理论基础知识点_第48张图片

微服务理论基础知识点_第49张图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ziru2uvn-1688347828537)(C:\Users\25817\AppData微服务理论基础知识点_第50张图片

微服务理论基础知识点_第51张图片

配置热更新:

方式一:

微服务理论基础知识点_第52张图片

方式二:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gju9RwwJ-1688347828538)(C:\Users\25817\AppData\Roaming\Typora\typora-user-images\image-20230222205754222.png)]

总结:

微服务理论基础知识点_第53张图片

多环境配置共享:

开发、测试、生产环境相同的配置共享。

修改环境:

微服务理论基础知识点_第54张图片

微服务理论基础知识点_第55张图片
等价于上面配置

配置优先级:

微服务理论基础知识点_第56张图片

总结:

微服务理论基础知识点_第57张图片

nacos集群搭建:

Nacos的单例模式不推荐用在生产环境,所以需要对nacos服务做高可用,所以需要通过nacos集群来解决这个问题。

微服务理论基础知识点_第58张图片

微服务理论基础知识点_第59张图片

基于Feign的远程调用:

RestTemplate存在的问题:

微服务理论基础知识点_第60张图片

Feign:

微服务理论基础知识点_第61张图片

Feign使用步骤:

微服务理论基础知识点_第62张图片

微服务理论基础知识点_第63张图片

自定义Feign的配置:

微服务理论基础知识点_第64张图片

微服务理论基础知识点_第65张图片

微服务理论基础知识点_第66张图片

@EnableFeignClients	注解在启动类上;
@FeignClient		注解在client的配置接口;

微服务理论基础知识点_第67张图片

Feign的性能优化:

性能优化介绍:

微服务理论基础知识点_第68张图片

性能优化操作步骤:

微服务理论基础知识点_第69张图片

总结:

微服务理论基础知识点_第70张图片

Feign的最佳实践

方式一(继承):

微服务理论基础知识点_第71张图片

微服务理论基础知识点_第72张图片

方式二(抽取):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zaz31gzH-1688347828545)(C:\Users\25817\AppData\Roaming\Typora\typora-user-images\image-20230301224940083.png)]

方式二的实现:

微服务理论基础知识点_第73张图片

微服务理论基础知识点_第74张图片

总结:

微服务理论基础知识点_第75张图片

统一网关Gateway:

网关功能:

微服务理论基础知识点_第76张图片

微服务理论基础知识点_第77张图片

功能总结:

微服务理论基础知识点_第78张图片

网关搭建:

微服务理论基础知识点_第79张图片

微服务理论基础知识点_第80张图片

微服务理论基础知识点_第81张图片

微服务理论基础知识点_第82张图片

路由断言工厂:

微服务理论基础知识点_第83张图片

微服务理论基础知识点_第84张图片

微服务理论基础知识点_第85张图片

总结:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u6uw2vgU-1688347828550)(C:\Users\25817\AppData\Roaming\Typora\typora-user-images\image-20230302173925781.png)]

路由的过滤器配置:

微服务理论基础知识点_第86张图片

微服务理论基础知识点_第87张图片

默认过滤器配置,会对所有进入网关的请求路由进行配置

微服务理论基础知识点_第88张图片

微服务理论基础知识点_第89张图片

全局过滤器GlobalFilter:

微服务理论基础知识点_第90张图片

微服务理论基础知识点_第91张图片

全局过滤器配置步骤:

微服务理论基础知识点_第92张图片

微服务理论基础知识点_第93张图片

过滤器执行顺序:

微服务理论基础知识点_第94张图片

微服务理论基础知识点_第95张图片

微服务理论基础知识点_第96张图片

网关跨域cors的配置:

微服务理论基础知识点_第97张图片

在gateway服务的yml进行配置

微服务理论基础知识点_第98张图片

总结:

微服务理论基础知识点_第99张图片

Docker

微服务理论基础知识点_第100张图片

项目部署的问题

微服务理论基础知识点_第101张图片

工作原理:

类似Ubuntu和CentOS都是基于Linux内核,只是系统应用不同,提供的函数库有差异。

微服务理论基础知识点_第102张图片

工作原理总结:

微服务理论基础知识点_第103张图片

Docker对比虚拟机:

微服务理论基础知识点_第104张图片

Hypervisor可以模拟出计算机的硬件,cpu,内存等。

微服务理论基础知识点_第105张图片

镜像和容器:

镜像只能读,不能写。避免污染镜像。

微服务理论基础知识点_第106张图片

微服务理论基础知识点_第107张图片

Docker整体架构:

微服务理论基础知识点_第108张图片

Docker架构总结:

微服务理论基础知识点_第109张图片

遇到的问题:

1.Failed to download metadata for repo ‘docker-ce-stable‘: Cannot download repomd.xml

解决方案:原因是华为服务器内核的问题,云服务器切换操作系统即可:

微服务理论基础知识点_第110张图片

2.启动docker容器报错No chain/target/match by that name.

解决方案:

systemctl restart  docker

3.关于SpringBootTest与RunWith注解

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

@RunWith(SpringRunner.class) //是一个JUnit注解,它是用来指定运行测试用例的运行器
@SpringBootTest //加载SpringBoot应用程序的上下文
public class SpringAmqpTest {
    @Resource
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testSendMessage2SimpleQueue(){
        String queueName="simple.queue";
        String message="Hello,SpringAmqp3!";
        rabbitTemplate.convertAndSend(queueName,message);
    }
}

Docker的安装:

见docker安装文件

Docker基本操作:

微服务理论基础知识点_第111张图片

微服务理论基础知识点_第112张图片

Docker基本操作-镜像:

微服务理论基础知识点_第113张图片

打包镜像到文件

微服务理论基础知识点_第114张图片
这里去掉image

加载镜像

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d2zg7WKM-1688347828562)(C:\Users\25817\AppData\Roaming\Typora\typora-user-images\image-20230312193237810.png)]

Docker基本操作-镜像命令总结:

微服务理论基础知识点_第115张图片

Docker基本操作-容器:

微服务理论基础知识点_第116张图片

创建运行一个Nginx容器

微服务理论基础知识点_第117张图片

docker logs -f mn  #查看docker中的mn容器的日志,不间断的方式

微服务理论基础知识点_第118张图片

修改容器内容:

shell命令是bash命令的一部分

微服务理论基础知识点_第119张图片

#	修改nginx容器中的静态文件
sed -i 's#Welcome to nginx#Nginx欢迎您!--by TSW#g' index.html
sed -i 's###g' index.html

exit	#退出容器
docker ps		#显示运行中的容器的状态

docker ps -a	#显示所有容器的状态

docker rm mn	#删除非运行态的容器

docker rm -f mn	#强制删除运行的容器

docker stop 容器id # 停止指定容器的运行
总结:

微服务理论基础知识点_第120张图片

redis容器操作:
docker exec -it mr bash		#进入redis(name-mr)容器内部
redis -cli				   #连接redis客户端

docker ps -a				#该命令将显示所有容器的列表,包括正在运行和已停止的容器,并显示相应的状态信息

数据卷:

微服务理论基础知识点_第121张图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xO8xFhFz-1688347828565)(C:\Users\25817\AppData\Roaming\Typora\typora-user-images\image-20230329193850183.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vupbvb8z-1688347828566)(C:\Users\25817\AppData\Roaming\Typora\typora-user-images\image-20230329193954604.png)]

docker volume rm 数据卷名

数据卷总结1:

微服务理论基础知识点_第122张图片

挂载数据卷:

微服务理论基础知识点_第123张图片

微服务理论基础知识点_第124张图片

微服务理论基础知识点_第125张图片

数据卷挂载案例:

微服务理论基础知识点_第126张图片

微服务理论基础知识点_第127张图片

微服务理论基础知识点_第128张图片

远程mysql连接不上的问题,容器在创建的时候,密码输入格式不正确:

docker run \
--name mysql \
 -e MYSQL_ROOT_PASSWORD=123 \
 -p 3306:3306 \
 -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
 -v /etc/mysql/data:/var/lib/mysql \
 -d mysql:5.7.25

自定义镜像:

微服务理论基础知识点_第129张图片

微服务理论基础知识点_第130张图片

微服务理论基础知识点_第131张图片

Dockerfile:

微服务理论基础知识点_第132张图片

Dockerfile案例:

微服务理论基础知识点_第133张图片

微服务理论基础知识点_第134张图片

总结:

微服务理论基础知识点_第135张图片

DockerCompose:

微服务理论基础知识点_第136张图片

微服务理论基础知识点_第137张图片

微服务理论基础知识点_第138张图片

微服务部署:

微服务理论基础知识点_第139张图片

Docker镜像仓库:

具体用法:见文档

微服务理论基础知识点_第140张图片

微服务理论基础知识点_第141张图片

服务异步通讯:RabbitMQ:

安装:

微服务理论基础知识点_第142张图片

RabbitMQ的部署与安装:详见MyCoding笔记文件夹中的RabbitMQ部署指南!

同步通讯的优缺点:

微服务理论基础知识点_第143张图片

微服务理论基础知识点_第144张图片

微服务理论基础知识点_第145张图片

微服务理论基础知识点_第146张图片

异步通讯的优缺点:

微服务理论基础知识点_第147张图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lxh457ku-1688347828573)(C:\Users\25817\AppData\Roaming\Typora\typora-user-images\image-20230331205722766.png)]

微服务理论基础知识点_第148张图片

RabbitMQ介绍和安装:

见安装文档

微服务理论基础知识点_第149张图片

微服务理论基础知识点_第150张图片

消息模型介绍:

微服务理论基础知识点_第151张图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2GJPIFgu-1688347828576)(C:\Users\25817\AppData\Roaming\Typora\typora-user-images\image-20230331213407124.png)]

微服务理论基础知识点_第152张图片

SpringAMQP:

简介:

微服务理论基础知识点_第153张图片

发送消息:

微服务理论基础知识点_第154张图片

微服务理论基础知识点_第155张图片

微服务理论基础知识点_第156张图片

接收消息:

微服务理论基础知识点_第157张图片

微服务理论基础知识点_第158张图片

WorkQueue工作队列:

微服务理论基础知识点_第159张图片

其他的和简单消息队列一致,差别不大

微服务理论基础知识点_第160张图片

微服务理论基础知识点_第161张图片

发布订阅模型:

微服务理论基础知识点_第162张图片

Fanout Exchange:

简介:

微服务理论基础知识点_第163张图片

微服务理论基础知识点_第164张图片

操作步骤:

微服务理论基础知识点_第165张图片

微服务理论基础知识点_第166张图片

微服务理论基础知识点_第167张图片

微服务理论基础知识点_第168张图片

总结:

微服务理论基础知识点_第169张图片

Direct Exchange:

介绍:

微服务理论基础知识点_第170张图片

微服务理论基础知识点_第171张图片

操作步骤:

微服务理论基础知识点_第172张图片

微服务理论基础知识点_第173张图片

总结:

微服务理论基础知识点_第174张图片

Topic Exchange:

介绍:

微服务理论基础知识点_第175张图片

微服务理论基础知识点_第176张图片

操作步骤:

微服务理论基础知识点_第177张图片

微服务理论基础知识点_第178张图片

微服务理论基础知识点_第179张图片

总结:

微服务理论基础知识点_第180张图片

消息转换器:

发送消息:

微服务理论基础知识点_第181张图片

微服务理论基础知识点_第182张图片

MessageConverter在publisher中的启动类上声明!!!

发送消息,把对象序列化成字节!

接收消息:

微服务理论基础知识点_第183张图片

总结:

微服务理论基础知识点_第184张图片

ElasticSearch:

简介:

微服务理论基础知识点_第185张图片

微服务理论基础知识点_第186张图片

微服务理论基础知识点_第187张图片

微服务理论基础知识点_第188张图片

倒排索引:

微服务理论基础知识点_第189张图片

微服务理论基础知识点_第190张图片

微服务理论基础知识点_第191张图片

文档:

微服务理论基础知识点_第192张图片

索引:

微服务理论基础知识点_第193张图片

ES对比Mysql:

微服务理论基础知识点_第194张图片

微服务理论基础知识点_第195张图片

ES的安装:

详见MyCoding笔记文件夹中的ES安装指南!

Kibana的安装:

详见MyCoding笔记文件夹中的ES安装指南!

分词器:

微服务理论基础知识点_第196张图片
微服务理论基础知识点_第197张图片微服务理论基础知识点_第198张图片

IK分词器的拓展和停用词典:

微服务理论基础知识点_第199张图片

微服务理论基础知识点_第200张图片

其他的扩展词典,停用词等操作见参考资料

微服务理论基础知识点_第201张图片

索引库操作:

微服务理论基础知识点_第202张图片

微服务理论基础知识点_第203张图片

创建索引库:

微服务理论基础知识点_第204张图片

操作索引库:

微服务理论基础知识点_第205张图片

微服务理论基础知识点_第206张图片

微服务理论基础知识点_第207张图片

文档操作:

微服务理论基础知识点_第208张图片

微服务理论基础知识点_第209张图片

微服务理论基础知识点_第210张图片

微服务理论基础知识点_第211张图片

RestClient基本用法:

RestClient操作索引库:

微服务理论基础知识点_第212张图片

微服务理论基础知识点_第213张图片

微服务理论基础知识点_第214张图片

微服务理论基础知识点_第215张图片

注意:mapping的id只能为字符串类型,不能为integer,long。

微服务理论基础知识点_第216张图片

注意:步骤三里面的第二步需要强制指定ES的版本

RestClient创建索引库:

微服务理论基础知识点_第217张图片

RestClient删除索引库:

微服务理论基础知识点_第218张图片

总结:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b775DPjB-1688347828611)(C:\Users\25817\AppData\Roaming\Typora\typora-user-images\image-20230426181951279.png)]

RestClient操作文档:

微服务理论基础知识点_第219张图片

客户端初始化:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7O8UL2mH-1688347828611)(C:\Users\25817\AppData\Roaming\Typora\typora-user-images\image-20230426184540172.png)]

新增文档:

微服务理论基础知识点_第220张图片

批量新增文档:

微服务理论基础知识点_第221张图片

查询文档:

微服务理论基础知识点_第222张图片

修改文档:

微服务理论基础知识点_第223张图片

删除文档:

微服务理论基础知识点_第224张图片

总结:

微服务理论基础知识点_第225张图片
)]

DSL查询语法:

查询分类和基本语法:

微服务理论基础知识点_第226张图片

微服务理论基础知识点_第227张图片

全文检索查询:

微服务理论基础知识点_第228张图片

微服务理论基础知识点_第229张图片

微服务理论基础知识点_第230张图片

上面两种查询功能和结果一样。

微服务理论基础知识点_第231张图片

精确查询:

微服务理论基础知识点_第232张图片

微服务理论基础知识点_第233张图片

地理查询:

微服务理论基础知识点_第234张图片

第一种:

微服务理论基础知识点_第235张图片

第二种:

微服务理论基础知识点_第236张图片

复合查询

介绍:

微服务理论基础知识点_第237张图片

相关性得分:

微服务理论基础知识点_第238张图片

微服务理论基础知识点_第239张图片

微服务理论基础知识点_第240张图片

复合查询—Function score Query:

微服务理论基础知识点_第241张图片

微服务理论基础知识点_第242张图片


# function score 查询
GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "all": "外滩"
        }
      },
      "functions": [
        {
          "filter": {
            "term": {
              "brand": "如家"
            }
          },
          "weight": 10
        }
      ],
      "boost_mode": "sum"
    }
  }
}

term查询是精确查询。不是模糊查询(match)

微服务理论基础知识点_第243张图片

复合查询—Boolean Query:

微服务理论基础知识点_第244张图片

微服务理论基础知识点_第245张图片

微服务理论基础知识点_第246张图片

搜索结果处理-排序:

介绍:

微服务理论基础知识点_第247张图片

案例:

微服务理论基础知识点_第248张图片

DSL语句:

微服务理论基础知识点_第249张图片

微服务理论基础知识点_第250张图片

DSL语句:

微服务理论基础知识点_第251张图片

注意:如果对结果进行排序处理,则不会再进行相关性得分的计算

搜索结果处理-分页:

介绍与应用:

微服务理论基础知识点_第252张图片

深度分页问题:

微服务理论基础知识点_第253张图片

微服务理论基础知识点_第254张图片

微服务理论基础知识点_第255张图片

搜索结果处理-高亮:

简介

微服务理论基础知识点_第256张图片

DSL语句:

微服务理论基础知识点_第257张图片

搜索结果处理-总结:

微服务理论基础知识点_第258张图片

RestClient查询文档:

入门介绍:

微服务理论基础知识点_第259张图片

微服务理论基础知识点_第260张图片

注意点一:

微服务理论基础知识点_第261张图片

注意点二:

微服务理论基础知识点_第262张图片

总结:

微服务理论基础知识点_第263张图片

RestClient查询-match、term、range、bool查询:

Ctrl+Alt+M抽取代码,可提取出来当作一个方法

    private void handleResponse(SearchResponse response) {
        //        4.解析响应
        SearchHits searchHits = response.getHits();
//        4.1查询的总条数
        long value = searchHits.getTotalHits().value;
        System.out.println("总条数: "+value);
//        4.2查询的结果数组
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
//            4.3得到source
            String json = hit.getSourceAsString();
//            反序列化为对象
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println(hotelDoc);
        }
    }

微服务理论基础知识点_第264张图片

微服务理论基础知识点_第265张图片

微服务理论基础知识点_第266张图片

java代码

    /**
     * 复合查询:bool子查询
     * @throws IOException
     */
    @Test
    void testBoolMatch() throws IOException {
//        1.准备request
        SearchRequest request = new SearchRequest("hotel");
//        2.准备DSL
//        2.1准备BooleanQuery
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
//        2.2添加term
        boolQueryBuilder.must(QueryBuilders.termQuery("city","上海"));
//        2.3添加range
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").lte(250));
        request.source().query(boolQueryBuilder);
//        3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//        System.out.println(response);
        handleResponse(response);
    }

微服务理论基础知识点_第267张图片

RestClient查询-排序和分页:

微服务理论基础知识点_第268张图片

注意链式编程!

RestClient查询-高亮:

注意:高亮,必须针对带关键字的查询,不能用matchAll查询

高亮请求:

微服务理论基础知识点_第269张图片

高亮结果解析:

微服务理论基础知识点_第270张图片

java代码:

 /**
     * 高亮
     * @throws IOException
     */
    @Test
    void testHighlight() throws IOException {
//        1.准备request
        SearchRequest request = new SearchRequest("hotel");
//      全部查询
        request.source().query(QueryBuilders.matchQuery("all","如家"));
//        高亮
        request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
//        3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//        System.out.println(response);
        //        4.解析响应
        SearchHits searchHits = response.getHits();
//        4.1查询的总条数
        long value = searchHits.getTotalHits().value;
        System.out.println("总条数: "+value);
//        4.2查询的结果数组
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
//            4.3得到source
            String json = hit.getSourceAsString();
//            反序列化为对象
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
//            获取高亮结果
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
//            根据字段名获取高亮结果
            HighlightField highlightField = highlightFields.get("name");
            if(highlightField!=null){
                String name = highlightField.getFragments()[0].string();
                hotelDoc.setName(name);
            }
            System.out.println(hotelDoc);
        }
    }

总结:

微服务理论基础知识点_第271张图片

旅游项目案例:

注意:SpringBoot项目启动会自动访问resource文件夹下的static下的index.html

搜索和分页:

微服务理论基础知识点_第272张图片

微服务理论基础知识点_第273张图片

快捷键:Ctrl+Alt+T执行surround with

微服务理论基础知识点_第274张图片

主要代码java:

@MapperScan("cn.itcast.hotel.mapper")
@SpringBootApplication
public class HotelDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(HotelDemoApplication.class, args);

    }
    /**
     * 将RestHighLevelClient注册到bean
     * @return
     */
    @Bean
    public RestHighLevelClient client(){
        return new RestHighLevelClient(RestClient.builder(HttpHost.create(
                "http://123.60.61.97:9200")
        ));
    }
}

@RestController
@RequestMapping("/hotel")
public class HotelController {
    @Resource
    private IHotelService hotelService;
    @PostMapping("/list")
    public PageResult search(@RequestBody RequestParams requestParams){
        return hotelService.search(requestParams);
    }
}
package cn.itcast.hotel.service.impl;

import cn.itcast.hotel.mapper.HotelMapper;
import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.pojo.PageResult;
import cn.itcast.hotel.pojo.RequestParams;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
public class HotelService extends ServiceImpl<HotelMapper, Hotel> implements IHotelService {
    @Resource
    private RestHighLevelClient client;

    @Override
    public PageResult search(RequestParams requestParams)  {
        SearchResponse response = null;
        try {
//        1.准备request
            SearchRequest request = new SearchRequest("hotel");
//        2.准备DSL
//        2.1关键字全文搜索

//        若搜索为空,则执行全文查询
            String key = requestParams.getKey();
            if (key == null || key.equals("")) {
                request.source().query(QueryBuilders.matchAllQuery());
            } else {
                request.source().query(QueryBuilders.matchQuery("all", key));
            }
//        2.2分页
            request.source().from((requestParams.getPage() - 1) * requestParams.getSize()).size(requestParams.getSize());
//        3.发送请求
            response = client.search(request, RequestOptions.DEFAULT);
//            4.解析响应,返回结果
            return handleResponse(response);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
//        System.out.println(response);

    }

    private PageResult handleResponse(SearchResponse response) {
        //        4.解析响应
        SearchHits searchHits = response.getHits();
//        4.1查询的总条数
        long value = searchHits.getTotalHits().value;
        System.out.println("总条数: " + value);
//        4.2查询的结果数组
        SearchHit[] hits = searchHits.getHits();
        List<HotelDoc> hotelDocs = new ArrayList<>();
        for (SearchHit hit : hits) {
//            4.3得到source
            String json = hit.getSourceAsString();
//            反序列化为对象
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            hotelDocs.add(hotelDoc);
//            System.out.println(hotelDoc);
        }
//        4.4封装返回
        return new PageResult(value,hotelDocs);
    }
}

条件过滤:

微服务理论基础知识点_第275张图片

微服务理论基础知识点_第276张图片

java代码:

此处:Ctrl+Alt+M抽取了代码块作buildBasicQuery方法

    public PageResult search(RequestParams requestParams)  {
        SearchResponse response = null;
        try {
//        1.准备request
            SearchRequest request = new SearchRequest("hotel");
//        2.准备DSL
//        2.1关键字全文搜索
//        构建BooleanQuery
            buildBasicQuery(requestParams, request);

//        2.2分页
            request.source().from((requestParams.getPage() - 1) * requestParams.getSize()).size(requestParams.getSize());
//        3.发送请求
            response = client.search(request, RequestOptions.DEFAULT);
//            4.解析响应,返回结果
            return handleResponse(response);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
//        System.out.println(response);

    }

    private void buildBasicQuery(RequestParams requestParams, SearchRequest request) {
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        String key = requestParams.getKey();
//            关键字搜索
        //        若搜索为空,则执行全文查询
        if (key == null || key.equals("")) {
            boolQueryBuilder.must(QueryBuilders.matchAllQuery());
        } else {
            boolQueryBuilder.must(QueryBuilders.matchQuery("all", key));
        }
//         条件过滤:城市条件
        if(requestParams.getCity()!=null&&!requestParams.getCity().equals("")){
//                filter不参与算分
            boolQueryBuilder.filter(QueryBuilders.termQuery("city", requestParams.getCity()));
        }
//          条件过滤:品牌条件
        if(requestParams.getBrand()!=null&&!requestParams.getBrand().equals("")){
//                filter不参与算分
            boolQueryBuilder.filter(QueryBuilders.termQuery("brand", requestParams.getBrand()));
        }
//          条件过滤:星级条件
        if(requestParams.getStarName()!=null&&!requestParams.getStarName().equals("")){
//                filter不参与算分
            boolQueryBuilder.filter(QueryBuilders.termQuery("starName", requestParams.getStarName()));
        }
//          条件过滤:价格条件
        if(requestParams.getMinPrice()!=null&& requestParams.getMaxPrice()!=null){
//                filter不参与算分
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("price")
                    .gte(requestParams.getMinPrice())
                    .lte(requestParams.getMaxPrice()));
        }
        request.source().query(boolQueryBuilder);
    }

我附近的酒店:

微服务理论基础知识点_第277张图片

微服务理论基础知识点_第278张图片

java代码:

   2.3 添加排序
            String location = requestParams.getLocation();
            if(location!=null&&!location.equals("")){
                request.source().sort(SortBuilders
                        .geoDistanceSort("location",new GeoPoint(location))
                        .order(SortOrder.ASC)
                        .unit(DistanceUnit.KILOMETERS));
            }

//            解析附近酒店距离值  这块代码在封装的解析响应那块
            Object[] sortValues = hit.getSortValues();
            if(sortValues.length>0){
                Object sortValue = sortValues[0];
                hotelDoc.setDistance(sortValue);
            }

广告置顶:

微服务理论基础知识点_第279张图片

微服务理论基础知识点_第280张图片

filter:必须满足条件的文档才参与算分

java代码:

//        2.算分控制
        FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery(
//                原始查询
                boolQueryBuilder
//                function score的数组
                , new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
//                        其中的一个 function score元素
                        new FunctionScoreQueryBuilder.FilterFunctionBuilder(
//                        过滤条件
                                QueryBuilders.termQuery("isAD", true),
//                        算分函数
//
                                ScoreFunctionBuilders.weightFactorFunction(10)
                        )
                });
        request.source().query(functionScoreQuery);

数据聚合:

微服务理论基础知识点_第281张图片

微服务理论基础知识点_第282张图片

DSL实现bucket聚合:

微服务理论基础知识点_第283张图片

微服务理论基础知识点_第284张图片

DSL语句:

微服务理论基础知识点_第285张图片
微服务理论基础知识点_第286张图片

返回结果:

微服务理论基础知识点_第287张图片

微服务理论基础知识点_第288张图片

DSL实现Metrics聚合:

微服务理论基础知识点_第289张图片

DSL语句:

微服务理论基础知识点_第290张图片

返回结果:

微服务理论基础知识点_第291张图片

RestClient实现聚合:

微服务理论基础知识点_第292张图片

java代码:

请求响应+结果解析,请求三要素:类型,名称,字段

@Test
    void Aggregation() throws IOException {
    //    1.准备request
        SearchRequest request = new SearchRequest("hotel");
    //    2.准备dsl
    //    2.1设置size
        request.source().size(0);
    //    2.2聚合
        request.source().aggregation(AggregationBuilders
                .terms("brandAgg")
                .field("brand")
                .size(10)
        );
    //    3.发出请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //    4.解析结果
        Aggregations aggregations = response.getAggregations();
        //4.根据聚合名称获取聚合结果
        Terms brandTerms = aggregations.get("brandAgg");
        //4.2获取buckets
        List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();
        //4.3遍历
        for (Terms.Bucket bucket : buckets) {
            //4.4获取key
            System.out.println(bucket.getKey());
        }
        //System.out.println(response);
    }

多条件聚合:

微服务理论基础知识点_第293张图片

java代码:

surround with快捷键:Ctrl+Alt+T

/**
     *多条件聚合:品牌,城市,星级
     * @return
     */
    @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.解析结果
            //    4.1根据聚合名称获取结果
            Map<String, List<String>> result = new HashMap<>();
            Aggregations aggregations = response.getAggregations();
            List<String> brandList = getAggByName(aggregations,"brandAgg");
            List<String> cityList = getAggByName(aggregations,"cityAgg");
            List<String> starList = getAggByName(aggregations,"starAgg");
            //4.4放入map
            result.put("品牌",brandList);
            result.put("城市",cityList);
            result.put("星级",starList);
            return result;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private List<String> getAggByName(Aggregations aggregations,String aggName) {
        //4.1根据聚合名称获取聚合结果
        Terms brandTerms = aggregations.get(aggName);
        //4.2获取buckets
        List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();
        //4.3遍历
        List<String> brandList = new ArrayList<>();
        for (Terms.Bucket bucket : buckets) {
            //4.4获取key
            //System.out.println(bucket.getKey());
            brandList.add(bucket.getKeyAsString());
        }
        return brandList;
    }

    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)
        );
    }

带过滤条件的聚合:

微服务理论基础知识点_第294张图片

java代码:

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


案例截图:

微服务理论基础知识点_第295张图片

自动补全:

简介及用法:

微服务理论基础知识点_第296张图片

es的plugin目录地址:/var/lib/docker/volumes/es-plugins/_data

微服务理论基础知识点_第297张图片

注意:pinyin分词器得在创建索引库的时候,在setting下面配置好

微服务理论基础知识点_第298张图片

微服务理论基础知识点_第299张图片

若用户搜索关键词是中文文字,则不应该使用拼音分词器

总结:

微服务理论基础知识点_第300张图片

DSL实现自动补全:

微服务理论基础知识点_第301张图片

微服务理论基础知识点_第302张图片

DSL代码:

# 自动补全的索引库
PUT test2
{
  "mappings": {
    "properties": {
      "title":{
        "type": "completion"
      }
    }
  }
}
# 示例数据
POST test2/_doc
{
  "title": ["Sony", "WH-1000XM3"]
}
POST test2/_doc
{
  "title": ["SK-II", "PITERA"]
}
POST test2/_doc
{
  "title": ["Nintendo", "switch"]
}


# 自动补全查询,字段是completion类型
GET /test2/_search
{
  "suggest": {
    "titleSuggest": {
      "text": "so",
      "completion": {
        "field": "title",
        "skip_duplicates": true,
        "size": 10
      }
    }
  }
}

微服务理论基础知识点_第303张图片

酒店数据自动补全:

微服务理论基础知识点_第304张图片

RestAPI实现自动补全:

微服务理论基础知识点_第305张图片

你可能感兴趣的:(微服务,架构,云原生,springcloud,java)