黑马- SpringCloud微服务技术栈实用篇完成时间2023-3-22
。
yml文件
|| test测试类
|| 启动类
里的配置即可。E:\微服务\实用篇\day01-SpringCloud01\资料\cloud-demo
。E:\微服务\实用篇\day03-Docker\资料\cloud-demo
。E:\微服务\实用篇\day04-MQ\资料\mq-demo
。E:\微服务\实用篇\day05-Elasticsearch01\资料\hotel-demo
。E:\微服务\实用篇\day07-Elasticsearch03\资料\hotel-admin
。startup.cmd -m standalone
。# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
#查询防火墙状态
systemctl status firewalld
# 启动docker服务
systemctl start docker
# 查询docker服务状态
systemctl status docker
# 查看版本
docker -v
# 停止docker服务
systemctl stop docker
# 重启docker服务
systemctl restart docker
docker--help
查看帮助文档;如:docker images --help
-查看所有的镜像,里面有解释和参数的使用说明。#查看帮助文档
docker--help
#拉取nginx的命令
docker pull nginx
#查看镜像
docker images
#查询帮助文档
docker save --help
#导出镜像到磁盘 -o 导出后的名称 名称:版本
docker save -o nginx.tar nginx:latest
#删除镜像 rmi 名称:版本 或者 rmi 镜像id
docker rmi nginx:latest
#导入镜像
docker load -i nginx.tar
# 运行docker
docker run
#docker run:运行容器 --name:起名字 -p:宿主机端口(可变):容器端口(不可变) -d:后台运行容器 nginx:是镜像名称
docker run --name name -p 80:80 -d nginx
#redis
docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes
# 暂停
docker pause 容器名字
# 从暂停到运行
docker unpause 容器名字
# 停止
docker stop 容器名字
# 从停止到运行
docker start 容器名字
# 查看所有运行的容器及状态
docker ps
# 查看容器运行日志
docker logs 容器名字
# 持续查看输出日志
docker logs -f 容器名字
# 进入容器执行命令
docker exec
# docker exec:进入容器内部执行命令 -it:给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互 name:容器名称 bash:进入容器后执行的命令,bash是一个Linux终端的交互命令
docker exec -it name bash
# 删除指定容器
docker rm 容器名字
# 数据卷基本语法
docker volume [command]
# 下方是根据命令的command
create # 创建一个volumn + 名称
inspect # 显示一个或多个volumn的信息 + 名称
ls # 列出所有的volume
prune # 删除未使用的volume
rm # 删除一个或多个指定的volumn + 名称
# docker run的命令中通过 -v 参数挂载文件或目录到容器中:
# (1)-v volume名称:容器内目录
# (2)-v 宿主机文件:容器内文件
# (3)-v 宿主机目录:容器内目录
# docker run:运行容器 --name:起名字 -v volumename:/targetContainerPath -p 8080:80:把宿主机的8080端口映射到容器内的80端口 -d:挂载到后台 nginx:镜像名称
docker run --name mn -v html:/root/html -p 8080:80 -d nginx
# mysql
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf -v /tmp/mysql/data:/var/lib/mysql -d mysql:5.7.25
# 每一个指令都会形成一层Layer
FROM # 指定基础镜像
ENV # 设置环境变量,可在后面指令使用
COPY # 拷贝本地文件到镜像的指定目录
RUN # 执行Linux的shell命令,一般是安装过程的命令
EXPOSE # 指定容器运行时监听的端口
ENTRYPOINT # 镜像中应用的启动命令,容器运行时调用
# 利用dockerfile来构建镜像 指令后的.是指DockerFile在当前目录下
docker build -t javaweb:1.0 .
# 将生成的镜像跑起来
docker run --name web -p 8090:8090 -d javaweb:1.0
# 查看DockerCompose的帮助文档
docker-compose --help
# 查看创建的容器
docker ps
# 查看日志 最后可以加微服务名称,查询一个启动的日志
docker-compose logs -f
# 解决nacos部署慢,重启其它微服务
docker-compose restart gateway userservice orderservice
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.226.134:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
# 创建DockerCompose部署带有图象界面的DockerRegistry的yaml文件
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=传智教育私有仓库
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
# 后台运行
docker-compose up -d
# 查看现有镜像
docker images
# 重新tag本地镜像,名称前缀为私有仓库地址
docker tag nginx:latest 192.168.226.134:8080/nginx:1.0
# 推送镜像
docker push 192.168.226.134:8080/nginx:1.0
# 删除镜像
docker rmi 192.168.226.134:8080/nginx:1.0
# 拉取镜像
docker pull 192.168.226.134:8080/nginx:1.0
# 在线拉取
docker pull rabbitmq:3-management
# 上传好tar包,命令加载镜像
docker load -i mq.tar
# 运行MQ容器
docker run \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq \
--hostname mq1 \
-p 15672:15672 \
-p 5672:5672 \
-d \
rabbitmq:3-management
# 查看全部容器
docker ps -a
# 重启后重启mq容器
docker start mq
# 创建网络
docker network create es-net
# 关闭虚拟机后,查看局域网络(已配置过,重启后不影响)
docker network ls
# 导入数据
docker load -i es.tar
# 运行docker命令,部署单点es
docker run -d \
--name es \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-v es-data:/usr/share/elasticsearch/data \
-v es-plugins:/usr/share/elasticsearch/plugins \
--privileged \
--network es-net \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:7.12.1
# 重启后,重启容器
docker start es
# 输入地址加端口即可访问es
http://192.168.226.139:9200
# 导入数据
docker load -i kibana.tar
# 运行docker命令,部署kibana
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=es-net \
-p 5601:5601 \
kibana:7.12.1
# 重启后重启容器
docker start kibana
# 输入地址加端口即可访问kibana
http://192.168.226.139:5601
ps:(1)重启后只需要重启容器即可;(2)如果没有删除容器,重新运行docker命令部署会报名字重复错误;(3)如果不删除容器,想修改名称创建容器的话,需要在ess和kibana中的请求连接要同步,否则会报Kibana server is not ready yet
的问题。
# 在kibana中测试分词器
# english-默认分词器、standard-标准分词器
POST /_analyze
{
"text": "好好学习,天天向上",
"analyzer": "english"
}
# 安装ik分词器
# 查看数据卷elasticsearch的plugins目录位置
docker volume inspect es-plugins
# 到这个目录下
cd /var/lib/docker/volumes/es-plugins/_data
# 上传elasticsearch-analysis-ik-7.12.1.zip,然后解压
unzip elasticsearch-analysis-ik-7.12.1.zip
# 不太建议上面的方式,我试过发现启动会报错,后面改了很久都是报错,不知道哪里的配置文件被修改了,然后恢复快照重新来过
# 使用FileZillar直接传输Windows下解压的文件夹,结果是成功的
# 重启es容器
docker restart es
# 查看es日志
docker logs -f es
# 测试ik分词器
# IK分词器包含两种模式
# ik_smart:最少切分 -- 被搜索的概论低-粗粒度
# ik_max_word:最细切分 -- 内存占用高-细粒度
GET /_analyze
{
"analyzer": "ik_max_word",
"text": "好好学习天天向上,奥利给,噢噢点赞"
}
注意当前文件的编码必须是 UTF-8 格式,严禁使用Windows记事本编辑
# 打开IK分词器config目录,在IKAnalyzer.cfg.xml配置文件内容添加
# 用户可以在这里配置自己的扩展字典
ext.dic
#用户可以在这里配置自己的扩展停止词字典 *** 添加停用词词典
stopword.dic
# 新建一个 ext.dic,可以参考config目录下复制一个配置文件进行修改
奥利给
# 在 stopword.dic 添加停用词
噢噢
# 修改过看效果,重启es容器即可
docker restart es
# 查看 日志
docker logs -f es
# DSL语法
# 创建索引库名
PUT /索引库名
# 创建索引库的DSL语法例子
PUT /a
{
"mappings": {
"properties": {
"info": {
"type": "text",
"analyzer": "ik_smart"
},
"name":{
"type": "object",
"properties": {
"firstName": {
"type": "keyword",
"index": false
}
}
}
}
}
}
# 查看索引库
GET /索引库名
# 删除索引库
DELETE /索引库名
# 索引库和mapping一旦创建就无法修改,但是可以添加新的字段
PUT /索引库名/_mapping
{
"properties":{
"新字段名":{
"type":"integer"
}
}
}
# 插入文档
POST /索引库名/_doc/文档id
# 查看文档
GET /索引库名/_doc/文档id
# 删除文档
DELETE /索引库名/_doc/文档id
# 插入的DSL语法例子 -- 索引库名与上方创建相同
POST /a/_doc/1
{
"info": "好好学习天天向上",
"name": {
"firstName": "小",
"lastName": "盈"
}
}
# 修改文档 -- 全量修改,会删除旧文档,添加新文档
PUT /索引库名/_doc/文档id
PUT /a/_doc/1
{
"info": "好好学习天天向上",
"email": "45543563.qq.com",
"name": {
"firstName": "小",
"lastName": "盈"
}
}
# 局部修改,修改指定字段值 -- 只能修改一个指段
POST /索引库名/_update/文档id
POST /a/_update/1
{
"doc":{
"email": "[email protected]"
}
}
# 酒店的mapping
PUT /hotel
{
"mappings":{
"properties":{
"id":{
"type": "keyword"
},
"name":{
"type": "text",
"analyzer": "ik_max_word",
"copy_to": "all"
},
"address":{
"type": "keyword",
"index": false
},
"price":{
"type": "integer"
},
"score":{
"type": "integer"
},
"brand":{
"type": "keyword",
"copy_to": "all"
},
"city":{
"type": "keyword"
},
"starName":{
"type": "keyword"
},
"business":{
"type": "keyword",
"copy_to": "all"
},
"location":{
"type": "geo_point"
},
"pic":{
"type": "keyword",
"index": false
},
"all":{
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
match_all
。match
、multi_match
;两者区别match根据一个字段查询,multi_match根据多个字段查询;参与查询的字段越多,查询性能越差。ids
、range
、term
;geo_distance
、geo_bounding_box
。Boolean Query
、function_score
。# 查询所有
GET /hotel/_search
{
"query": {
"match_all": {}
}
}
# 全文检索 -- match查询(效率高)
GET /hotel/_search
{
"query": {
"match": {
"all": "外滩如家"
}
}
}
# 全文检索 -- multi_match
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "外滩如家",
"fields": ["brand", "name", "business"]
}
}
}
# 精确查询 -- term查询 精确匹配
GET /hotel/_search
{
"query": {
"term": {
"city": {
"value": "上海"
}
}
}
}
# 精确查询 -- range查询 范围过滤
GET /hotel/_search
{
"query": {
"range": {
"price": {
"gte": 100,
"lte": 300
}
}
}
}
# 地理查询 -- distance查询
GET /hotel/_search
{
"query": {
"geo_distance": {
"distance": "2km",
"location": "31.21, 121.5"
}
}
}
# 复合查询 -- function_score 参加打分
# 给“如家”这个品牌的酒店靠前一点
GET /hotel/_search
{
"query": {
"function_score": {
"query": {
"match": {
"all": "外滩"
}
},
"functions": [ //算分函数
{
"filter": { //条件
"term": {
"brand": "如家"
}
},
"weight": 10 //算分权重
}
],
"boost_mode": "sum" //加权分式
}
}
}
# 复合查询 -- Boolean Query
# must:必须匹配的条件,可以理解为“与”
# should:选择性匹配的条件,可以理解为“或”
# must_not:必须不匹配的条件,不参与打分 - 提高效率
# filter:必须匹配的条件,不参与打分 - 提高效率
# 搜索名字包含“如家”,价格不高于400,在坐标31.21,121.5周围10km范围内的酒店
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{"match":{"name": "如家"}}
],
"must_not": [
{"range":{"price":{"gt": 400}}}
],
"filter":[
{"geo_distance": {
"distance": "20km",
"location": {
"lat": 31.21,
"lon": 121.5
}
}}
]
}
}
}
from + size
–优点:支持随机翻页;缺点:深度分页问题。场景:百度、谷歌、京东等的随机翻页搜索。after search
–优点:没有查询上限(单词查询的size不超过10000),缺点:只能向后逐页查询,不支持随机翻页。场景:没有随机翻页需求的搜索,例如手机向下翻页。scroll
:优点:没有查询上限(单词查询的size不超过10000),缺点:会额外消耗内存,搜索结果是非实时的,场景:海量数据的获取和迁移。(已弃用)# 对酒店数据按照用户评价降序排序,评价相同的按照价格升序排序
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"score": "desc"
},
{
"price": "asc"
}
]
}
# 对酒店数据数据按照你的位置坐标的距离升序排序
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_geo_distance": {
"location": {
"lat": 31.034661,
"lon": 121.612282
},
"order": "asc",
"unit": "km"
}
}
]
}
# 分页查询 -- from-分页当前的位置 size-显示文档的总数
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort":[
{
"price": "asc"
}
],
"from": 0,
"size": 10
}
# 高亮查询,默认情况下,ES搜索字段必须与高亮字段一致,可以将"require_field_match":"false"-关闭搜索字段和高亮字段匹配
GET /hotel/_search
{
"query": {
"match": {
"all": "如家"
}
},
"highlight":{
"fields":{
"name":{
"require_field_match":"false"
}
}
}
}
Bucket
(桶聚合):对文档数据分组;TermAggregation:按照文档字段分组;Date Histogram:按日期阶梯分组,如一周或一月为一组。Metric
(度量聚合或嵌套聚合):对文档数据做计算,例如avg、min、max、status(同时求sum、min等)等;Pipeline
(管道聚合):基于其它聚合结果再做聚合。# 统计所有数据中的酒店品牌有几种,此时可以根据酒店品牌的名称做聚合
# size-设置size为0,结果中不包含文档,只包含聚合结果
# aggs-定义聚合 brandAgg-给聚合起个名字
# terms-聚合的类型,按照品牌值聚合,所以选择
# field-参与聚合的字段 size- 希望获取的聚合结果数量
GET /hotel/_search
{
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field":"brand",
"size": 10
}
}
}
}
# Bucket聚合会统计Bucket内的文档数量,记为_count,并且按照_count降序排序
GET /hotel/_search
{
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field":"brand",
"size": 10,
"order": {
"_count": "asc"
}
}
}
}
}
# Bucket聚合是对索引库的所有文档做聚合,我们可以限定要聚合的文档范围,只要添加query条件
GET /hotel/_search
{
"query": {
"range": {
"price": {
"lte": 200
}
}
},
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field":"brand",
"size": 10
}
}
}
}
# 获取每个品牌的用户评分的min、max、avg等值.
# aggs-brands聚合的子聚合,也就是分组后对每组分别计算
# scoreAgg-聚合名称
# stats-聚合类型,这里stats可以计算min、max、avg等
# field-聚合字段,这里是score
GET /hotel/_search
{
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field":"brand",
"size": 10,
"order": {
"scoreAgg.avg": "desc"
}
},
"aggs": {
"scoreAgg": {
"stats": {
"field": "score"
}
}
}
}
}
}
character filters
:在tokenizer之前对文本进行处理。例如删除字符、替换字符。tokenizer
:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik_smart。tokenizer filter
:将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等。# 安装pinyin分词器
# 查看数据卷elasticsearch的plugins目录位置
docker volume inspect es-plugins
# 到这个目录下
cd /var/lib/docker/volumes/es-plugins/_data
# 使用FileZillar直接传输Windows下解压的pinyin分词器的文件夹,结果是成功的
# 重启es容器
docker restart es
# 查看es日志
docker logs -f es
# 测试拼音分词器
GET /_analyze
{
"text": ["如家酒店还不错"],
"analyzer": "pinyin"
}
# 删除索引库
DELETE /test
# 自定义拼音分词器,创建索引库时,通过settings来配置自定义的analyzer(分词器);拼音分词器适合在创建倒排索引的时候使用,但不能在搜索的时候使用。--导致多音字都被搜出来
# 创建倒排索引时应该用my_analyzer分词器 -- analyzer;
# 字段在搜索时应该使用ik_smart分词器 -- search_analyzer;
PUT /test
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "ik_max_word",
"filter": "py"
}
},
"filter": {
"py": {
"type": "pinyin",
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true,
"keep_original": true,
"limit_first_letter_length": 16,
"remove_duplicated_term": true,
"none_chinese_pinyin_tokenize": false
}
}
}
},
"mappings":{
"properties":{
"name": {
"type": "text",
"analyzer": "my_analyzer",
"search_analyzer": "ik_smart"
}
}
}
}
# 测试自定义分词器
GET /test/_analyze
{
"text": ["如家酒店还不错"],
"analyzer": "pinyin"
}
completion suggester
查询-实现自动补全功能。(P128)completion
类型;字段值是多词条的数组。# 自动补全的索引库
PUT test1
{
"mappings":{
"properties":{
"title": {
"type": "completion"
}
}
}
}
# 示例数据
POST test1/_doc
{
"title":["Sony", "WH-1000XM3"]
}
POST test1/_doc
{
"title":["SK-II", "PITERA"]
}
POST test1/_doc
{
"title":["Nintendo", "switch"]
}
# 自动补全查询
POST /test1/_search
{
"suggest": {
"title_suggest": {
"text": "s", # 关键字
"completion": {
"field": "title", # 补全字段
"skip_duplicates": true, # 跳过重复的
"size": 10 # 获取前10条结果
}
}
}
}
elasticsearch
与mysql
之间的数据同步(P132)依赖mq
的可靠性。开启binlog
增加数据库负担、实现复杂度高。–使用canal
中间件。两个问题
:master eligi
(主节点)–备选主节点:主节点可以管理和记录集群状态、决定分片在哪个节点、处理创建和删除索引库的请求。data
(数据节点)–数据节点:存储数据、搜索、聚合、CRUD。ingest
–数据存储之前的预处理。coordinating
(协调节点)–路由请求到其它节点合并其它节点处理的结果,返回给用户。coordinating node
根据id
做hash
运算,得到结果对shard
数量取余,余数就是对应的分片。->微服务技术栈课程视频
https://www.bilibili.com/video/BV1LQ4y127n4?p=1
<-
记录每一个学习瞬间