微服务实用篇--学习笔记
【摘要】 编辑@目录服务项目项目涉及技术实用篇背景注册中心配置中心远程调用服务网关项目部署异步通信分布式搜索DSL语法数据聚合黑马旅游服务项目黑马- SpringCloud微服务技术栈实用篇完成时间2023-3-22。项目涉及技术知识点是按照集数依次整理,方便日后回来查找。考虑到不是固定的联网方式,时而WiFi,时而热点,配置静态IP会导致每次网络变更后都需要重新配置,所以虚拟机使用的动态路由,...
@
服务项目
黑马- SpringCloud微服务技术栈实用篇完成时间2023-3-22
。
项目涉及技术
- 知识点是按照集数依次整理,方便日后回来查找。
- 考虑到不是固定的联网方式,时而WiFi,时而热点,配置静态IP会导致每次网络变更后都需要重新配置,所以虚拟机使用的动态路由,当需要运行相关程序时,IP变化,需要修改
yml文件
||test测试类
||启动类
里的配置即可。 - 将代码路径列举主要是为后续审查。
- 自己编写代码路径
E:\微服务\实用篇\day01-SpringCloud01\资料\cloud-demo
。 - 打包上传到Linux实现集群部署路径
E:\微服务\实用篇\day03-Docker\资料\cloud-demo
。 - mq的代码路径
E:\微服务\实用篇\day04-MQ\资料\mq-demo
。 - RestClient操作酒店索引库的代码路径
E:\微服务\实用篇\day05-Elasticsearch01\资料\hotel-demo
。 - 操作数据库+mq实现数据同步的代码路径
E:\微服务\实用篇\day07-Elasticsearch03\资料\hotel-admin
。
实用篇
背景
- 微服务技术栈导学。
- 微服务的架构,背景,技术对比等。
- 服务拆分--微服务调用方式。
注册中心
- Eureka注册中心--服务原理、搭建、注册、发现->(p9)。
- Ribbon负载均衡规则--原理、轮询与随机均衡策略、饥饿加载->(p14)。
- Nacos注册中心--安装、注册、发现、服务分级存储(分地域集群)、NacosRule负载均衡策略、权重控制、环境隔离-namespace->(P17)。
- Nacos与eureka的共同点、区别。
- Nacos启动--在bin目录进入cmd,输入
startup.cmd -m standalone
。
配置中心
- Nacos配置管理(ps: 视频p26 -- 命名空间是否正确))。
- Nacos实现热更新--(1)@Value + RefreshScope来刷新。 (2)@ConfigurationProperties注入,自动刷新。
- 多服务共享配置--优先级:nacos中的配置(服务名-profile.yaml > 服务名称.yaml) > 本地配置。
- nacos集群搭建--(1)搭建MySQL集群并初始化数据库表。(2)下载解压nacos、修改集群配置、数据库配置。(3)分别启动多个nacos节点。(4)nginx反向代理。
远程调用
- http客户端Feign--定义和使用步骤->(p30)。
- Feign与RestTemplate的区别与代替。
- 自定义Feign的配置--修改日志级别-配置文件&&java代码配置(一般需要配置,详解)、响应结果的解析器、请求参数编码、支持的注解格式、失败重试机制。
- Feign的性能优化--默认-URLConnection:默认实现,不支持连接池;Apache HttpClient:支持连接池;OKHttp:支持连接池。
- 优化--日志尽量用basic;使用连接池。
- Feign最佳实践--controller和FeignClient继承同一接口;将FeignClient、POJO、Feign的默认配置都定义到一个项目中,供消费者使用(抽取)。
- 抽取Feign--这里自动注解UserClient报错,是由于扫不到包,下面视频有解决办法-两种导包的方式。
服务网关
- 统一网关Gateway--作用:身份认证、权限校验、负载均衡、限流。(p35)
- 网关搭建、路由配置--路由id、路由目标(uri)、路由断言(predicates)、路由过滤器(filters)。
- 路由断言工厂--11种基本的断言(使用时去Spring Cloud Gateway官方文档中介绍及使用样例)、作用:读取用户定义的断言条件,对请求做出判断。
- 路由过滤器--31种过滤规则;过滤器的作用:对路由的请求或响应做加工处理、配置在路由下的过滤器只对当前路由请求生效;defaultFilters默认路由的作用:对所有路由都生效的过滤器。
- 全局过滤器--作用:对所有路由都生效的过滤器,并且可以自定义处理逻辑;实现步骤:实现GlobalFilter接口,添加@Order注解或实现Ordered接口,编写处理逻辑。
- 过滤器执行顺序--order值越小,优先级越高;当order值一样时,顺序是defaultFilter最先,然后局部的路由过滤器,最后全局过滤器。
- CORS跨域--配置参数:允许哪些域名、请求头、请求方式、是否允许使用永久cookie、有效期多久。
项目部署
- Docker解决不同组件依赖的兼容性问题--将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包,形成可移植镜像;将每一个应用放到隔离的容器上运行,使用沙箱机制,相互隔离。(P42)
- Docker解决开发、测试、生产环境的差异问题--Docker镜像中包含完整运行环境,包括系统函数库,仅依赖Linux系统的内核,因此可以在任意Linux操作系统上运行。
- Docker是一个快速交付应用、运行应用的技术--启动、移除都可以通过一行命令完成,方便快捷。
- Docker和虚拟机的差异--docker是一个系统进程;虚拟机是在操作系统中的操作系统;docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般。
- 镜像:将应用程序及其依赖、环境、配置打包在一起。
- 容器:镜像运行起来就是容器,一个镜像可以运行多个容器。
- Docker结构--服务端:接受命令或远程请求,操作镜像或容器;客户端:发送命令或请求到Docker服务端。
- DockerHub:一个镜像托管的服务器,类似的还有阿里云镜像服务,统称为DockerRegistry。
- linux卸载、安装、启动docker,配置镜像,Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,所以启动前需要临时关闭防火墙。
- Docker基本操作--镜像命令(p47)
docker--help
查看帮助文档;如:docker images --help
-查看所有的镜像,里面有解释和参数的使用说明。- 依次装nginx、redis。
- 下方是一些镜像命令,不需要记住,用时查帮助文档即可。
- docker基本操作--容器命令(p49)
- docker基本操作--数据卷(p53)
- 数据卷(volume)是一个虚拟目录,指向宿主机系统中的某一个目录。
- 数据卷作用:将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全。
- 数据卷基本的命令。
- docker基本操作--挂载数据卷(P54)
- 如果容器运行时volume不存在,会自动被创建出来。
- 数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找。
- 目录挂载耦合度高,需要我们自己管理,目录容易找。
- Dockerfile--自定义镜像(P56)
- 镜像是分层结构,每一层称为一个Layer。BaseImage层:包含基本的系统函数库、环境变量、文件系统;Entrypoint:入口,镜像中应用启动的命令;其它:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置。
- Dockerfile是一个文本文件,其中包含一个个指令,用指令来说明要执行什么操作来构建镜像。
- Dockerfile的第一行必须是FROM,从一个基础镜像来构建(可以是基本的操作系统,也可以是其它人制作好的镜像)。
- 一些常用指令介绍如下:
- DockerCompose--微服务集群部署(P58)。
- DockerCompose基于Compose文件快速部署分布式应用,无需手动一个个创建和运行容器。
- Compose文件是一个文本文件,通过指令定义集群中的每一个容器如何运行(等价于转换docker的各种参数来定义,还有运行容器和构建镜像)。
- CentOS7安装DockerCompose。
- 使用DockerCompose将前面的项目集群部署到Linux上。(ps:使用xshell不可以直接传输文件夹,可以先压缩上传到Linux,然后解压)
- 由于nacos部署比较慢,其它微服务需要依赖到它,所以会导致部分运行时出现错误。解决:先对nacos进行部署,再部署其它微服务。
- Docker--镜像仓库(P60)
- 搭建镜像仓库--使用DockerCompose部署带有图象界面的DockerRegistry的镜像仓库,需要先配置Docker信任地址。
- 在私有镜像仓库推送或拉取镜像,推送镜像到私有镜像服务必须先tag。
异步通信
- MQ--RabbitMQ--SpringAMQP(P61)
- 同步调用--优点:时效性较强,可以立即得到结果;缺点:耦合度高、性能和吞吐能力下降、有额外的资源消耗、有级联失败问题。
- 异步调用的实现-事件驱动优势,事件驱动架构-Broker。
- 异步通信--优点:耦合度低、吞吐量提升、故障隔离、流量削峰;缺点:依赖于Broker的可靠性、安全性、吞吐能力、架构复杂了,业务没有明显的流程线,不好追踪管理。
- MQ(MessageQueue):消息队列,存放消息的队列。
- RabbitMQ、ActiveMQ、RocketMQ、Kafka的对比分析。(P64)
- RabbitMQ--部署安装、页面介绍、结构和概念。
- RabbitMQ部署成功后页面元素分析--channel:操作MQ的工具、exchange:路由消息到队列、queue:缓存消息、virtual host:虚拟主机,是对queue、exchange等资源的逻辑分组。
- RabbitMQ入门案例--简单队列模型。官方文档-入门案例-publisher:消息发布者,将消息发送到队列;queue:消息队列,负责接收并缓存消息;consumer:订阅队列,处理队列中的消息。
- 基本消息队列的消息发送流程和基本消息队列的消息接收流程。(P67)
- SpringAMQP--基于AMQP协议定义的一套API规范,提供模板来发送和接受消息;AMQP介绍--应用间消息通信的一种协议,与语言和平台无关。
- 简单队列模型--利用SpringAMQP实现HelloWorld的基础消息队列功能--引入amqp的starter依赖;配置RabbitMQ地址;利用RabbitTemplate的convertAndSend方法来发送消息。(P67)
- Work queue--工作队列,可以提高消息处理速度,避免队列消息堆积-默认为:消息预取。
- Work模型--多个消费者绑定到一个队列,同一条消息只会被一个消费者处理;通过设置prefetch来控制消费者预取的消息数量。(P71)
- 发布、订阅模型--允许将同一消息发送给多个消费者。实现方式是加入了exchange(交换机);exchange类型-Fanout:广播、Direct:路由、Topic:话题。(P72)
- exchange(交换机)作用--接收publisher发送的消息;将消息按照规则路由到与之绑定的队列;负责消息路由,而不是存储,路由失败则消息丢失。
- Fanout Exchange--将接收到的消息路由到每一个跟其绑定的queue。
- Direct Exchange--路由模式会将接收到的消息根据规则路由到指定的Queue(每一个Queue都与Exchange设置一个BindingKey);发布者发送消息时,指定消息的RoutingKey;Exchange将消息路由到BindingKey与消息RoutingKey一致的队列。(P74)
- TopicExchange--与Direct Exchange类似,区别在于routingKey必须是多个单词的列表,并且以 . 分割;Queue与Exchange指定BindingKey时可以使用通配符:#-代指0个或多个单词;*:代指一个单词。
- 消息转换器--SpringAMQP中消息的反序列化和反序列化-利用MessageConverter实现的,默认是JDK的序列化;注意发送方与接收方必须使用相同的MessageConverter。
分布式搜索
- ES==elasticsearch--开源分布式搜索引擎。(P77)
- elasticsearch:用来实现搜索、日志统计、分析、系统监控等功能。
- elasticsearch+kibana、Logstash、Beats == elastic stack(ELK)。
- elasticsearch--核心-存储、计算、搜索数据;可替换组件--kibana - 数据可视化;可替换组件--Logstash、Beats - 数据抓取。
- Lucene--Apache的搜索引擎类库-易扩展、高性能、基于倒排索引-提供搜索引擎核心API-仅支持Java语言。
- 数据库表--文档:每一条数据就是一个文档;词条:对文档中的内容分词,得到的词语就是词条。
- 正向索引--基于文档id创建索引;查询词条时必须先找到文档,然后判断是否包含词条 - 数据库的模糊查询-逐条查询判断。
- 倒排索引--对文档内容分词,对词条创建索引,并记录词条所在文档的id;查询是先根据词条查询文档id,而后获取文档。
- ES--存储-面向文档存储的,文档数据会被序列化为JSON格式;索引-相同类型的文档的集合;映射-索引中文档的字段约束信息,类似表的结构约束。
- MySQL与elasticsearch的概念对比、架构分析、关系。(P80)
- 安装部署es、kibana,需要先让es和kibana容器互联,部署单点es或kibana都是运行上传的tar包将数据导入,再运行docker命令,即可访问,具体的命令整理如下,外加注释,清晰明了。
ps:(1)重启后只需要重启容器即可;(2)如果没有删除容器,重新运行docker命令部署会报名字重复错误;(3)如果不删除容器,想修改名称创建容器的话,需要在ess和kibana中的请求连接要同步,否则会报Kibana server is not ready yet
的问题。
- 分词器的作用--创建倒排索引时对文档分词、用户搜索时,对输入的内容分词。(P83)
- 测试分词器、安装IK分词器。
- ik分词器-扩展词库、停用词库。
注意当前文件的编码必须是 UTF-8 格式,严禁使用Windows记事本编辑
- 索引库操作(P85)
- mapping属性--mapping是对索引库中文档的约束。
- mapping属性包括:type:字段数据类型、index:是后创建索引-默认为true;analyzer:使用哪种分词器;properties:该字段的子字段。
- type简单类型--字符串:text(可分词的文本)、keyword(精确值);数值:long、integer、short、byte、double、float;布尔:boolean;日期:date;对象:object。
- 创建索引库、查看索引库、删除索引库、禁止修改索引库。(P86)
- 文档操作--插入文档、查看文档、删除文档(P88)
- 修改文档--全量修改,会删除旧文档,添加新文档;局部修改,修改指定字段值。
- RestClient操作索引库(P90)
- 导入hotel-demo,分析hotel的mapping数据结构-字段名、数据类型、是否参与搜索、是否分词、分词器。
- tip:ES中支持两种地理坐标数据类型--geo_point:由维度和经度确定的一个点;geo_shape:有多个geo_point组成的复杂几何图形。
- 字段拷贝可以使用copy_to属性将当前字段拷贝到指定字段。
- 创建索引库、删除索引库、判断索引库是否存在。
- 索引库操作基本步骤:初始化RestHighLevelClient;创建XxxIndexRequest。xxx是Create、Get、Delete;准备DSL(Crete时需要);发送请求,调用RestHighLevelClient#indices().xxx()方法。
- RestClient操作文档--利用JavaRestClient实现文档的CRUD。(P95)
- 在数据库查询酒店数据,导入到hotel索引库,实现酒店数据的CRUD。
- 新增文档-index、根据id查询文档-get、根据id修改文档-update、根据id删除文档-delete。
- 文档操作的基本步骤:初始化RestHighLevelClient;创建XxxRequest;准备参数(Index和Update时需要);发送请求,调用RestHighLevelClient#.xxx()方法;解析结果(Get时需要)。
- 利用JavaRestClient批量导入酒店数据到ES。
DSL语法
- DSL查询语法(P101)
- 查询所有:查询出所有数据,一般测试用。例如:
match_all
。 - 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:
match
、multi_match
;两者区别match根据一个字段查询,multi_match根据多个字段查询;参与查询的字段越多,查询性能越差。 - 精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:
ids
、range
、term
; - 地理(geo)查询:根据经纬度查询。例如:
geo_distance
、geo_bounding_box
。 - 复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:
Boolean Query
、function_score
。 - 相关性打分算法(P105)
- TF-IDF:在elasticsearch5.0之前,会随着词频增加而越来越大
- BM25:在elasticsearch5.0之后,会随着词频增加而增大,但增长曲线会趋于水平。
- 搜索结果处理(P108)
- 排序 -- 经过排序就不做相关性打分,提高查询效率。
- 分页--文档全部查询,然后截取当前文档的位置+显示的文档数;默认top10,查询更多修改参数-from、size。
- 深度分页问题--ES集群处理的时候,是将所有节点的结果聚合,在内存中排序,在选中相应的文档;搜索页数过深,或结果集(from+size)越大,对内存和CPU的消耗也越高。
- es设定结果集上限为10000。
- 分页方式(P109)
from + size
--优点:支持随机翻页;缺点:深度分页问题。场景:百度、谷歌、京东等的随机翻页搜索。after search
--优点:没有查询上限(单词查询的size不超过10000),缺点:只能向后逐页查询,不支持随机翻页。场景:没有随机翻页需求的搜索,例如手机向下翻页。scroll
:优点:没有查询上限(单词查询的size不超过10000),缺点:会额外消耗内存,搜索结果是非实时的,场景:海量数据的获取和迁移。(已弃用)- 高亮--将搜索结果中把搜索关键字突出显示。
- RestClient查询文档--利用JavaRestClient查询文档。(P111)
- 基本步骤--创建SearchRequest对象-准备Request.source(),其中QueryBuilders来构建查询条件,再传入query()方法-发送请求,得到结果-解析结果(参考JSON结果,从外到内,逐层解析)。
- 全文检索 -- 要构建条件只需要QueryBuilders。
- 高亮--高亮结果解析是参考JSON结果,逐层解析。
数据聚合
- 聚合--对文档数据的统计、分析、计算。(P120)
- 聚合的常见种类
Bucket
(桶聚合):对文档数据分组;TermAggregation:按照文档字段分组;Date Histogram:按日期阶梯分组,如一周或一月为一组。Metric
(度量聚合或嵌套聚合):对文档数据做计算,例如avg、min、max、status(同时求sum、min等)等;Pipeline
(管道聚合):基于其它聚合结果再做聚合。- 参与聚合的字段类型必须为:keyword、数值、日期、布尔。
- DSL实现Bucket聚合(P121)
- aggs代表聚合,与query同级;query的作用:限定聚合的的文档范围。
- 聚合必须的三要素:聚合名称、聚合类型、聚合字段。
- 聚合可配置属性有:size:指定聚合结果数量;order:指定聚合结果排序方式;field:指定聚合字段。
- DSL实现Metrics聚合(P122)
- ResrClient实现聚合(P123)
- 自动补全(P126)
- 安装拼音分词器,测试。
- 自定义分词器--elasticsearch中分词器(analyzer)的组成包含三部分:
character filters
:在tokenizer之前对文本进行处理。例如删除字符、替换字符。tokenizer
:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik_smart。tokenizer filter
:将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等。
- 自动补全--
completion suggester
查询-实现自动补全功能。(P128) - 自动补全对字段的要求:类型是
completion
类型;字段值是多词条的数组。 - 案例:酒店数据自动补全--实现hotel索引库的自动补全、拼音搜索功能。(P130)
- 数据同步--
elasticsearch
与mysql
之间的数据同步(P132) - 问题:微服务中,负责酒店管理(操作mysql )的业务与负责酒店搜索(操作elasticsearch )的业务可能在两个不同的微服务上,数据同步该如何实现呢? 解决办法:
- 方式一:同步调用;优点:实现简单,粗暴;缺点:业务耦合度高。
- 方式二:异步通知;优点:低耦合,实现难度一般;缺点:
依赖mq
的可靠性。 - 方式三:监听binlog;优点:完全解除服务间耦合;缺点:
开启binlog
增加数据库负担、实现复杂度高。--使用canal
中间件。 - ES集群结构(P138)
- 单机的elasticsearch做数据存储,必然面临
两个问题
: - 海量数据存储问题--将索引库从逻辑上拆分为N个分片(shard),存储到多个节点。
- 单点故障问题--将分片数据在不同节点备份(replica )。
- 每个索引库的分片数量、副本数量都是在创建索引库时指定的,并且分片数量一旦设置以后无法修改。
- elasticsearch中集群节点有不同的职责:
master eligi
(主节点)--备选主节点:主节点可以管理和记录集群状态、决定分片在哪个节点、处理创建和删除索引库的请求。data
(数据节点)--数据节点:存储数据、搜索、聚合、CRUD。ingest
--数据存储之前的预处理。coordinating
(协调节点)--路由请求到其它节点合并其它节点处理的结果,返回给用户。- ES集群的脑裂--当主节点与其他节点网络故障时,可能发生脑裂问题。
- 协调节点的作用
- 分布式新增如何确定分片--
coordinating node
根据id
做hash
运算,得到结果对shard
数量取余,余数就是对应的分片。 - 分布式查询的两个阶段。
- 分散阶段: coordinating node将查询请求分发给不同分片。
- 收集阶段:将查询结果汇总到coordinating node ,整理并返回给用户。
- 故障转移--master宕机后,EligibleMaster选举为新的主节点;master节点监控分片、节点状态,将故障节点上的分片转移到正常节点,确保数据安全。
黑马旅游
- 黑马旅游案例。
- 基本搜索和分页--案例1:实现黑马旅游的酒店搜索功能,完成关键字搜索和分页。(P115)
- 条件过滤--案例2:添加品牌、城市、星级、价格等过滤功能。
- 附近的酒店--案例3:我附近的酒店。
- 广告置顶--案例4:让指定的酒店在搜索结果中排名置顶。
- 排序--给黑马旅游添加排序功能。
- 高亮显示--给黑马旅游添加搜索关键字高亮效果。
- 聚合-RestClient--在IUserService中定义方法,实现对品牌、城市、星级的聚合。(P124)
- 酒店搜索页面自动补全--实现酒店搜索页面输入框的自动补全。(P131)
- 消息同步--利用MQ实现mysql与elasticsearch数据同步。(P133)
->微服务技术栈课程视频
<-
记录每一个学习瞬间
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)