2102王海涛随堂笔记
rabbitmq 虚拟机
安装docker环境
克隆 centos-8-2105: rabbitmq
设置ip:
1. ./ip-static 2. ip: 192.168.64.140 3. ifconfig
mobaxterm 上传 docker 离线安装文件到 /root/ 目录
- 课前资料\devops课前资料\docker\docker-install 文件夹
按照笔记安装docker
- https://wanght.blog.csdn.net/article/details/117327543
启动 docker 容器
下载 docker 镜像
docker pull rabbitmq:management docker images
启动运行容器
docker run \
-d \
--name rabbit \
-p 5672:5672 \
-p 15672:15672 \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
rabbitmq:management
docker ps
- 浏览器访问
http://192.168.64.140:15672/
rabbitmq 容器不可访问:
# 重启网络服务
systemctl restart NetworkManager
# 重启 docker 系统服务
systemctl restart docker
# 重启容器
docker restart rabbit
订单流量削峰
导入项目:
- 课前资料\elasticsearch\pd-商城项目案例.zip
pd-web 目录解压缩到 rabbitmq 工程目录 - 导入maven项目,选择 pd-web 下的 pom.xml
- file — project structures ,配置jdk
- sqlyog ,右键点连接 — 从sql转储文件导入
选择 pd-web 项目目录中的 pd.sql - 如果用 wht6.cn:3309,修改 application.yml 配置
- 右键点击 RunPdApp 类,启动项目
- 配置启动项,设置 working directory,设置成 pd-web 模块的目录
修改pd-web,发送订单到rabbitmq
8. 添加依赖: starter-rabbitmq
9. yml配置 rabbitmq 连接信息
10. 在启动类中(或自定义自动配置类)准备队列的参数
11. OrderServiceImpl
1. 添加 AmqpTemplate 用来发送消息的封装工具
2. 在 saveOrder() 方法中发送消息
3. 把 saveorder() 中的数据库代码都注释掉
动态配置刷新
2,3,4,9项目基础配置
- 添加依赖:
- rabbitmq
- bus
- yml 配置rabbitmq连接
- 09修项目修改 application.yml
- 2,3,4 修改 config目录的三个文件,推送到远程仓库
- 09项目中使用 actuator 暴露 bus-refresh 刷新端点
sleuth + zipkin 链路跟踪
2,3,4,6 添加 sleuth 链路跟踪日志
zuul, iu5y4y4y45, iu5y4y4y45, true
order, iu5y4y4y45, i65h5j5j5j5j, true
user, iu5y4y4y45, ujjhg34t45y5u6, true
item, iu5y4y4y45, uju65j54354yu, true
只需要添加 sleuth 依赖,0配置
2,3,4,6 添加 zipkin 客户端依赖和rabbitmq配置
- 2,3,4,6 添加 zipkin 客户端依赖
- 6 添加 rabbitmq 依赖和连接配置
- 2,3,4,6 配置日志的发送方式: rabbit
- 06项目直接修改 application.yml
- 2,3,4项目修改config文件夹的文件,并推送
选择正确的网卡,注册 IP 地址
选择网卡
在 bootstrap.yml 中配置
spring:cloud:inetutils:ignored-interfaces: # 忽略的网卡- VM.*preferred-networks: # 要是用的网卡的网段- 192\.168\.0\..+
注册 IP 地址,而不注册主机名
application.yml
eureka:instance:prefer-ip-address: true # 使用ip进行注册instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} # 界面列表中显示的格式也显示ip
账户
- 实体类 Account
- AccountMpper 接口
- AccountMapper.xml
- AccountService
- AccountController
seata server
registry.conf
配置 seata server 向注册中心注册
file.conf
配置 seata server 运行过程中存储的日志的存储位置
seata-server.bat
配置使用的内存
订单添加 seata at 事务
- 父项目添加 seata 依赖
- 配置
- application.yml — 事务组的组名
- registry.conf — 注册中心地址,获得事务协调器的地址
- file.conf — 事务组对应使用的协调器
- 数据源代理 — 提供自动事务处理代码
- 业务方法添加事务注解
- @Transactinal — 控制本地事务
- @GlobalTransactional — 启动全局事务
库存和账户添加 seata at 事务
- 三个配置文件
- application.yml — 事务组的组名
- registry.conf — 注册中心地址
- file.conf — 事务组对应的协调器
- 数据源代理
- 业务方法添加
@Transactional
控制本地事务
订单中,打开库存和账户的远程调用
TCC 事务
AT - 对业务无侵入,全自动事务,80%情况下都可以使用AT事务
TCC - 对业务有侵入,两阶段代码都需要自己来实现
订单添加 TCC 事务
- 添加 seata 依赖
- 三个配置文件,和 AT 事务相同
- 修改 Mapper 添加 TCC 的数据库操作
- 添加 TCC 操作接口和实现
- TCC三个方法,添加
@Transactional
- 修改业务代码,在业务中手动调用TCC第一阶段方法
- 业务方法添加
@GlobalTransactional
库存添加 TCC 事务
8. 三个配置文件
9. 修改 Mapper 添加 TCC 的数据库操作
10. 添加 TCC 操作接口和实现,添加 @Transactional
11. 修改业务代码,在业务中手动调用TCC第一阶段方法
账户添加 TCC 事务
12. 三个配置文件
13. 修改 Mapper 添加 TCC 的数据库操作
14. 添加 TCC 操作接口和实现,添加 @Transactional
15. 修改业务代码,在业务中手动调用TCC第一阶段方法
16. 幂等性控制
sql 优化
select * from stu where name=‘张三’
name 添加索引,加速过滤
create index stu_name_index on stu(name)
- 1
mysql 测试一个查询条件是否会使用索引,扫描的数据量
explain select * from stu where name='张三'
加索引之前
index 扫描的数据量
none 16340063
加索引之后
index 扫描的数据量
stu_name_index 3
当数据量非常大时,sql优化解决不了问题,
必须分库分表 ---- MyCat
大量数据,要分散存储到数据库集群多台服务器
RocketMQ
- 克隆 centos-8-2105: rocketmq
- 设置ip
./ip-static
ip: 192.168.64.141
- mobaxterm 上传文件到 /root/
- 课前资料\分布式事务\rocketmq 文件夹下的三个文件
订单业务添加可靠消息最终一致性事务
- 无事务版本.zip 解压缩到 rocketmq-dtx 工程目录
- 导入
- 检查工程jdk配置
订单发送事务消息
4. pom.xml 添加spring 封装的 rocketmq 依赖
5. yml 配置 rocketmq 连接信息
6. 事务状态表、实体类TxInfo、TxMapper
7. 消息的封装对象,和JsonUtil
8. 发送事务消息
账户接收消息执行账户金额扣减
9. yml 配置 rocketmq 连接信息
10. 添加消费者类接收消息
11. 调用业务方法
docker
- 克隆 centos-8-2105: docker-base
- 设置ip:
./ip-static
ip: 192.168.64.150
ifconfig
- 上传离线安装文件到 /root/
- docker课前资料\docker-install 目录
- 按笔记执行安装
- 从 docker-base 克隆: docker
Docker 搭建redis集群
六个Redis实例的配置文件:
redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
/opt/redis/7000/redis.conf/7001/redis.conf/7002/redis.conf/7003/redis.conf/7004/redis.conf/7005/redis.conf
mkdir /opt/redis
cd /opt/redis
mkdir 7000 7001 7002 7003 7004 7005
cat <<EOF >7000/redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
cat <<EOF >7001/redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
cat <<EOF >7002/redis.conf
port 7002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
cat <<EOF >7003/redis.conf
port 7003
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
cat <<EOF >7004/redis.conf
port 7004
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
cat <<EOF >7005/redis.conf
port 7005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
先启动6个redis实例
docker run -d --name redis7000 \
-v /opt/redis/7000/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf
docker run -d --name redis7001 </span>
-v /opt/redis/7001/redis.conf:/redis.conf </span>
–net=host </span>
–restart=always </span>
redis </span>
redis-server /redis.conf
docker run -d --name redis7002 </span>
-v /opt/redis/7002/redis.conf:/redis.conf </span>
–net=host </span>
–restart=always </span>
redis </span>
redis-server /redis.conf
docker run -d --name redis7003 </span>
-v /opt/redis/7003/redis.conf:/redis.conf </span>
–net=host </span>
–restart=always </span>
redis </span>
redis-server /redis.conf
docker run -d --name redis7004 </span>
-v /opt/redis/7004/redis.conf:/redis.conf </span>
–net=host </span>
–restart=always </span>
redis </span>
redis-server /redis.conf
docker run -d --name redis7005 </span>
-v /opt/redis/7005/redis.conf:/redis.conf </span>
–net=host </span>
–restart=always </span>
redis </span>
redis-server /redis.conf
/pre>
执行命令配置集群
# 进入容器执行集群配置命令
docker exec -it redis7000 </span>
redis-cli --cluster create </span>
192.168.64.150:7000 192.168.64.150:7001 </span>
192.168.64.150:7002 192.168.64.150:7003 </span>
192.168.64.150:7004 192.168.64.150:7005 </span>
–cluster-replicas 1
查看集群信息
docker exec -it redis7000 redis-cli -c -p 7000
cluster info
cluster nodes
存数据
docker exec -it redis7000 redis-cli -c -p 7000
# 7002
set a aaaaaaaaaaaaa
# 7000
set b bbbbbbbbbbb
# 7001
set c cccccccccccccccc
redis 哨兵
redis主从复制结构中,当主服务器宕机,哨兵可以监控到服务宕机,从从服务器中选举产生一个新的主服务器
- 搭建主从服务器 – 一主两从
docker rm -f $(docker ps -aq)
# 启动主服务器,正常启动,没有特殊设置
docker run -d --name redis6379 --net=host --restart=always redis
docker exec -it redis6379 redis-cli
> info replication
启动两个从服务器
# 启动redis6380容器,作为 redis6379 的从服务器启动
docker run -d --name redis6380 --net=host --restart=always redis \
redis-server --port 6380 --slaveof 192.168.64.150 6379
# 启动redis6381容器,作为 redis6379 的从服务器启动
docker run -d --name redis6381 --net=host --restart=always redis </span>
redis-server --port 6381 --slaveof 192.168.64.150 6379
# 查看三个 redis 服务的角色
docker exec -it redis6379 redis-cli
> info replication
docker exec -it redis6380 redis-cli -p 6380
> info replication
docker exec -it redis6381 redis-cli -p 6381
> info replication
- 添加哨兵配置文件
mkdir /opt/sentinel/
cd /opt/sentinel/
# sentinel monitor mymaster 192.168.64.150 6379 2
# 末尾的 2 表示两台从服务器投票确认主服务器宕机,哨兵才会认为主服务器宕机
cat <<EOF >5000.conf
port 5000
sentinel monitor mymaster 192.168.64.150 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF
cat <<EOF >5001.conf
port 5001
sentinel monitor mymaster 192.168.64.150 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF
cat <<EOF >5002.conf
port 5002
sentinel monitor mymaster 192.168.64.150 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF
- 启动三个哨兵
docker run -d --name sentinel5000 \
-v /opt/sentinel/5000.conf:/sentinel.conf \
--net=host \
redis redis-sentinel /sentinel.conf
docker run -d --name sentinel5001 </span>
-v /opt/sentinel/5001.conf:/sentinel.conf </span>
–net=host </span>
redis redis-sentinel /sentinel.conf
docker run -d --name sentinel5002 </span>
-v /opt/sentinel/5002.conf:/sentinel.conf </span>
–net=host </span>
redis redis-sentinel /sentinel.conf
# 进入一个哨兵容器,查看它监控的主从服务器和其他哨兵
docker exec -it sentinel5000 redis-cli -p 5000
> sentinel master mymaster
> sentinel slaves mymaster
> sentinel sentinels mymaster
- 停止主服务器,测试主服务器重新选举
# 停止主服务器
docker stop redis6379
# 在哨兵日志中查看服务器切换日志: +switch-master mymaster 192.168.64.150 6379 192.168.64.150 6381
docker logs sentinel5000
# 查看 6380 和 6381 服务器的角色变化
docker exec -it redis6380 redis-cli -p 6380
> info replication
docker exec -it redis6381 redis-cli -p 6381
> info replication
重新启动6379,不会把6379切换成主服务器,而是作为从服务器
docker start redis6379
docker exec -it redis6379 redis-cli
> info replication
- 客户端api连接哨兵存取数据
elasticsearch
启动服务器
三个容器如果运行有问题,重启三个容器
1. docker restart node1 node2 node3
倒排索引
从 ik 分词器项目仓库中下载 ik 分词器安装包 – 分词,分词器,项目
倒排索引把关键词和文档之间的关系颠倒过来
分词 – 1,2,5,8
分词器 – 2,3,5,8
k8s案例
- 项目打包成jar文件
- 构建镜像
- jdk
- eureka
- item
- user
- order
- 把镜像传到所有服务器导入
- 部署四个模块
镜像构建
5. 准备5个文件夹 — devops课前资料\kubernetes\案例\v2
- jdk
- jdk压缩文件
- Dockerfile
- eureka
- eureka的jar文件
- Dockerfile
- item
- item的jar文件
- Dockerfile
- user
- user的jar文件
- Dockerfile
- order
- order的jar文件
- Dockerfile
回顾
spring cloud netflix
- eureka
- openfeign
- ribbon
- zuul
- hystrix
- hystrix dashboard / turbin
- config
- bus
- zleuth+zipkin
消息服务
Rabbitmq
- 简单模式
- 工作模式
- 合理分发 – 手动ACK、qos=1
- 消息持久化 – 队列持久化、消息持久化
- 发布和订阅模式
- 消息群发
- fanout 交换机
- 路由模式
- 路由键匹配路由消息
- direct 交换机
- 主题模式
- 关键词格式: aa.bb.cc.dd、 ..cc.dd、 #.dd
- topic 交换机
- RPC 模式
Rocketmq
- 延时消息
- 顺序消息
- 事务消息、高可靠消息
消息服务使用场景
- 解耦
- 流量削峰
- 异步调用
项目中使用消息服务
- bus消息总线使用消息服务来传递配置刷新指令
- sleuth+zipkin链路跟踪,各模块把日志发送到消息服务,zipkin接收消息进行分析处理
- 订单流量削峰
- Rocketmq可靠消息最终一致性事务
分布式事务
Seata
- Seata AT
- 全自动事务方案
- 对业务无侵入
- 80% 情况下都可以使用 AT 事务
- 只需要添加配置就可以实现
- 启动 Seata server
- 添加三个配置: application.yml, registry.conf, file.conf
- 创建数据源代理
- 第一个模块添加 @GlobalTransactional
- TCC
- 需要自己编写事务处理代码
- 对业务代码有侵入
- 实现步骤:
- 启动 Seata server
- 添加三个配置: application.yml, registry.conf, file.conf
- 添加 TccAction 接口和实现,实现 TCC 三个操作方法
- 修改业务,调用Tcc第一阶段方法
- 第一个模块添加 @GlobalTransactional
可靠消息最终一致性
- 发送半消息
- 执行本地事务
- 事务成功,提交消息
- 事务失败,回滚消息
- 由于网络不稳定无法提交或回滚消息
服务器会反向回查事务状态
消费者处理消息必须成功,如果失败会重试消息
Docker
- 镜像命令
- 容器命令
- 数据挂载
- 网络
- 构建镜像
Elasticsearch
全文检索引擎,NoSql 数据库
倒排索引
核心概念
- 索引
- 分片
- 副本
- 映射(字段、类型、分词器)
- 文档
- 字段
- 分类(淘汰)
Spring data elasticsearch
- ElasticsearchRepository
- Criteria / CriteriaQuery / SearchOperations
Kubernetes
- Pod
- 标签
- 存活探针
- 控制器
- ReplicationController
- ReplicaSet
- DaemonSet
- Job
- CronJob
- Deployment
- 自动滚动升级
- Service
- 不变的访问地址
- Endpoints 端点
- 对外暴露 Service
- NodePort
- Load Balance
- Ingress
- 数据挂载
- Persistent Volume 持久数据卷
- Persistent Volume Claim 持久卷声明
- pv 和 pvc 靠条件匹配自动关联
- 参数、环境变量
- command – 覆盖docker的 ENTRYPOINT
- args – 覆盖docker的 CMD
- env
- ConfigMap
2102王海涛随堂笔记相关推荐
- 92030302随堂笔记 c# 1614675886
92030302随堂笔记 c# 1614675886 控件 Nodes添加节点 默认事件 被选中的节点 文本内容,Text 深度,level 控件的Nodes属性 获取所有的节点对象数组的长度 尝试用 ...
- 图床云存储项目课程随堂笔记
这个项目属实重量级,第一遍学习的过程比较懵,只是记录一下随堂笔记.后面理解了项目后端代码流程,再细写几篇博客归纳. 基本单机环境配置 大的项目你可能连配置都配不清楚. 新手必须要心细,因为你错了一步, ...
- 【笔记】嵌入式C语言随堂笔记
喏,你们要的嵌入式C语言随堂笔记,丰富度应该要比老师自己记录的高一些.但是机酱的废话一样很多哦! 这个笔记是自己一个字一个字手打的,话说打个原创图个慰藉没问题的吧=.= 而且那时候很菜,知道就好不许说 ...
- 《Advice on how to read papers》---吴恩达CS230随堂笔记
How to read papers? Reading research papers Reading a paper Questions to ask yourself after reading ...
- JAVA历险记--java基础知识--随堂笔记
JAVA基础知识随堂笔记 简介 学习视频 题1 题2 答疑 简介 由于本人从事Delphi(很古董的语言了)和c#开发,所以一些基础的知识还是比较了解的,需要熟悉的是IDE的简单操作,以及JAVA的相 ...
- 泡泡堂段王一进去服务器不稳定,3月22日泡泡新段王 《泡泡堂》段位系统大革新...
3月已经进入下旬,泡泡堂V174泡泡段王版本即将于3月22日正式上线.全新段王系统,更合理的匹配模式,泡泡高手和手速大神千万不要错过啦!与此同时,泡泡堂线下玩家见面会正在火热筹备中,超多的实物周边来就 ...
- 汤家凤高等数学基础阶段课程的随堂笔记并标记重点
本文内容为汤家凤高数基础阶段课程的随堂笔记并标记重点,我主页中的思维导图中内容大多从我的笔记中整理而来,相应技巧可在笔记中查找原题,有兴趣的可以去 我的主页 了解更多计算机学科的精品思维导图整理 本文 ...
- winsever服务系统基础教程(随堂笔记)
本文草稿链接https://www.yuque.com/docs/share/000c4611-fa69-4881-90f4-d35ace0f9d26?# <winsever服务系统基础教程(随 ...
- linux加权_「学员笔记」LINUX随堂笔记(十一):LVS负载均衡群集
第12章 LVS负载均衡群集 一.群集概述 1.1 群集的类型 无论是哪种群集,都至少包括两台节点服务器,而对外表现为一个整体,只提供一个访问入口(域名或IP地址),相当于一台大型计算机,根据群集所提 ...
最新文章
- 响应式布局设备分界点
- 1、spring的概述
- shell 杂记一(笨鸟)
- Apple`s Steve Jobs Has Reshaped(重塑) the Tech World: 10 Ways He Did It
- 【ujson】pip安装ujson报错: error:Microsoft Visual C++ 14.0 is required
- identifier 'APP_FOLDER.EVENT' must be declared
- 用OpenSSL写一个简单的Server/Client程序:证书与私钥
- 计算沙盒下文件夹内容大小 清空沙盒 文件 目录
- brew 一直等待_等待高高时,可以做的小事...
- 数据结构二叉树的建立代码_二叉树就是这么简单
- macOS安装brew和ffmpeg下载m3u8
- GoogleEarth二次开发平台指南(4) --- 三维视频融合、视频拼接与摄像头控制
- 商业银行的组织结构-决策系统、执行系统和监督系统
- *TEST 6 for NOIP + NOIP初赛
- 行走的励志君——选择和努力哪个更重要
- 达人评测锐龙r7 6800u和r7 5800u差距 r76800u和r75800u对比
- 【黄啊码】百万级别订单量,如何生成唯一订单ID(雪花算法)
- elementUI checkbox选中与取消选中
- 2009年必看十大动漫游戏改编电影
- json数据和本地存储