文章目录
- Docker
- [Spring AMQP](#Spring AMQP)
- ElasticSearch
Docker
Docker是一个快速交付应用、运用应用的技术:
1、Docker可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意的Linux操作系统。
2、运用时利用沙箱机制形成隔离容器,各个容器之间互不干扰。
3、启动、移除都可以通过一行命令完成,方便快捷。
Docker要解决的问题:
没有Docker时:
有Docker时:
Docker怎么解决不同Linux操作系统的问题呢?
总结:
Docker与虚拟机
- Docker是将应用程序所依赖的环境库函数、包含操作系统的库函数都打包为一个容器。
- 虚拟机则是通过Hypervisor技术来模拟硬件系统,使得上层应用感觉运行在一个新的操作系统中。
- Docker的性能接近原生,硬盘占用一般为MB级,启动时间为秒级,而虚拟机性能则较差,硬盘占用一般为GB,启动时间为分钟级。
- Docker是一个系统进程;而虚拟机是运行在操作系统中的操作系统。
- Docker体积小,启动速度快,性能好,虚拟机体积大,启动速度慢,性能一般。
Docker架构
镜像、容器、镜像托管平台
镜像: Docker将应用程序及其所需要的依赖、环境、配置等文件打包在一起,称为镜像。
**容器:**镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。
DockerHub:DockerHub是一个Docker镜像的托管平台,这样的平台称为Docker Register。国内也有类似于DockerHub的公开服务,比如阿里云镜像库等。
Docker架构
Docker实践
Spring AMQP
- AMQP(Advanced Message Queuing Protocol)用于在应用程序之间传递业务消息的开放标准,该协议与语言和平台无关,是一种标准。
- Spring AMQP是基于AMQP协议定义的一套API规范,提供了模板来发送和接收消息,包含了两部分内容:
- spring-amqp是基础抽象
- spring-rabbit是底层的默认实现
简单使用案例
工作队列- WorkQueue
消息发布者:约每秒发送50条消息
消息接收者:消费者1每秒消费50条,消费者2每秒消费5条。
结果:
消费者1消费偶数序号的消息,很快就处理完毕,约1秒。
消费者2消费奇数序号的消息,耗时约5秒才完成。
消息被平均的分配给了两个消费者,没有考虑消费者的具体消费能力。这是消息队列默认的消息预取
机制导致的结果,消费者1和2都预取了25条消息。
通过修改配置文件,更改消息预取配置,预取数设置为1.
结果:
消费者1消费了大量的消息,能者多劳,在约1秒内,消费掉了所有的消息。
发布订阅服务
发布订阅模式与之前的案例区别就是允许将同一个消息发送给多个消费者,实现方式就是加入了exchange(交换机)。
FanoutExchange
交换机绑定完毕后,可以在rabbit mq的前台看到绑定关系:
消费者:
发送者向交换机发送消息:
DirectExchange
DirectExchange通过bindingKey比对,决定是否想队列发送消息。
如果多个队列绑定了相同的key,那么DirectExchange是可以模拟出FanOutExchange的效果的。
在本次案例中,我们在注解@RabbitListener中声明Exchange、Queue、RoutingKey,因为每次通过@Bean的形式声明绑定关系会比较繁琐。
直接在消费者端@RabbitListener中声明队列、交换机和绑定关系:
启动后,在Rabbit前台可以看到交换机和队列均已生成:
TopicExchange
TopicExchange与DirectExchange最大的区别在于,Topic 是基于话题匹配,可以使用通配符,匹配BindingKey。
TopicExchange与DirectExchange声明的方式基本是一致的:
消息转换器
在使用SpringAMQP时,发送消息的参数类型为Object,因此可以发送任意类型的消息,但是SpringAMQP默认使用的是JDK自带的序列化方式,序列化效率低。
使用json序列化之后:
发送一个Map对象:
ElasticSearch
倒排索引
什么是文档和词条?
- 每一条数据就是一个文档
- 对文档中的内容进行分词,得到的词语就是词条。
什么是正向索引和倒排索引?
- 基于文档id创建索引,查询词条时必须先找到文档,而后判断是否包含词条。
- 对文档内容分词,对词条创建索引,并记录词条所在的文档的信息,查询时先根据词条查询到文档id,而后获取到文档。
IK分词器
IK分词拓展与停用字典
IK分词器基于自有的字典进行分词,然后网络热门词汇都是实时更新的,还有些时候,需要对敏感词进行过滤,这时就需要用到IK分词器的拓展和停用字典。
例如下边的例子中,"白嫖"、"奥利给"等新兴词汇没有被收录IK分词器的词典,因此没有成功被分词。
在ElasticSearch的配置文件中设置拓展字典路径:
在ext.dir添加:
在stopword.dir添加:
操作索引库
mapping映射属性
-
mapping映射对文档进行约束,比如字符串类型,分为text(可分词的文本)和keyword(精确值,包含国家名、品牌名、ip等)。
-
mapping映射属性虽然没有数组类型,但是每个类型的字段都允许对应多个值,视为该类型的数组。
-
index:默认为true,即为每个属性字段都添加倒排索引,实际上有些字段是无需索引的,比如ip,那么就可以将其设置为false。
创建索引库
PUT
查询、删除、修改索引库
文档操作
新增、查询、删除文档
修改文档
RestClient
使用案例
步骤一导入数据模型:
将Client作为成员变量,使用@BeforeEach,给Client成员赋值,主要就是连接上ES的服务器ip。
使用@AfterEach,在结束时释放掉Client。
操作文档案例
文档操作的基本步骤:
- 初始化RestHighLevelClient
- 创建XxxRequest,XXX是index(新建文档)、Get(查询)、Update(更新)、Delete(删除)
- 准备参数(Index和Update时需要)
- 发送请求。调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete。
从数据库查询一条酒店信息,并新增文档到ES:
根据id查询文档:
根据id修改酒店数据:
根据id删除文档:
批量导入酒店数据到ES:
DSL查询文档
DSL(Domain Specific Language),一种特定领域的查询语言,用于构建复杂的查询和聚合操作。
在Elasticsearch中,可用DSL语法来定义查询和过滤条件,以及执行聚合操作。
DSL语法具有JSON格式(敲重点,要考),因此它非常易于阅读和编写。